This commit is contained in:
Aborelis 2024-05-14 01:53:27 +02:00
parent e2bb5dfc9c
commit b8cdab0e4a
3 changed files with 160 additions and 144 deletions

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
__pycache__
venv
.idea
/*.pdf
out/*.pdf

View file

@ -1,141 +1,148 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os from functools import partial
import sys
import AveryLabels import AveryLabels
from AveryLabels import labelInfo from AveryLabels import labelInfo
from reportlab.lib.units import mm from reportlab.lib.units import mm
from reportlab.lib.units import toLength from reportlab.lib.units import toLength
from reportlab_qrcode import QRCodeImage
from reportlab.pdfgen import canvas from reportlab.pdfgen import canvas
from reportlab.lib.colors import HexColor from reportlab.lib.colors import HexColor
from reportlab_qrcode import QRCodeImage
# from reportlab.graphics import shapes # from reportlab.graphics import shapes
from clize import ArgumentError, Parameter, run from clize import run
from functools import partial project_homepage = "https://github.com/aborelis/ASN-Label-Generator"
import inspect
project_homepage = 'https://github.com/aborelis/ASN-Label-Generator'
class LabelContext: class LabelContext:
def __init__(self, data): def __init__(self, data):
self.label = 4731 self.filename = None
self.labeltype = 4731
self.number = 189 self.number = 189
numDigits = 6 self.num_digits = 6
self.firstAsn = 1 self.first_asn = 1
self.offset = 0 self.offset = 0
self.fontSize=2*mm self.font_size = 2 * mm
self.qrSize = 0.9 self.qr_size = 0.9
self.qrMargin = 1*mm self.qr_margin = 1 * mm
self.subLabelsX = 1 self.sub_labels_x = 1
self.subLabelsY = 1 self.sub_labels_y = 1
self.debug = False self.debug = False
self.positionHelper = False self.position_helper = False
self.bar_width = 0
self.bar_color = HexColor("#d2dede")
self.barWidth=0 self.highlight_bar_width = 0
self.barColor= HexColor('#d2dede') self.highlight_bar_color = HexColor("#d9a4a6")
self.highlightBarWidth = 0 self.prefix = "ASN"
self.highlightBarColor= HexColor('#d9a4a6')
self.prefix='ASN'
self.__dict__.update(data) self.__dict__.update(data)
self.currentASN = self.firstAsn self.current_asn = self.first_asn
def incASN(self): def incASN(self):
self.currentASN = self.currentASN + 1 self.current_asn = self.current_asn + 1
def render(context: LabelContext, c: canvas.Canvas, width: float, height: float): def render(context: LabelContext, c: canvas.Canvas, width: float, height: float):
sub_label_width = width / context.sub_labels_x
sub_labelheight = height / context.sub_labels_y
subLabelWidth = width/context.subLabelsX for i in range(context.sub_labels_x):
subLabelHeight = height/context.subLabelsY for j in range(context.sub_labels_y - 1, -1, -1): # no idea why inverted...
sub_x = sub_label_width * i
for i in range(context.subLabelsX): sub_y = sub_labelheight * j
for j in range(context.subLabelsY-1, -1, -1): # no idea why inverted...
subX = subLabelWidth*i
subY = subLabelHeight*j
c.saveState() c.saveState()
c.translate(subX, subY) c.translate(sub_x, sub_y)
# barcode_value = f"ASN{currentASN:06d}" # barcode_value = f"ASN{currentASN:06d}"
barcode_value = context.prefix+str(context.currentASN).zfill(context.numDigits) barcode_value = context.prefix + str(context.current_asn).zfill(
context.num_digits
)
context.incASN() context.incASN()
qr = QRCodeImage(barcode_value, size=subLabelHeight*context.qrSize) qr = QRCodeImage(barcode_value, size=sub_labelheight * context.qr_size)
qr.drawOn(c, x=context.qrMargin, y=subLabelHeight*((1-context.qrSize)/2)) qr.drawOn(
c.setFont("Helvetica", size=context.fontSize) c, x=context.qr_margin, y=sub_labelheight * ((1 - context.qr_size) / 2)
c.drawString(x=subLabelHeight, y=( )
subLabelHeight-context.fontSize)/2, text=barcode_value) c.setFont("Helvetica", size=context.font_size)
c.drawString(
x=sub_labelheight,
y=(sub_labelheight - context.font_size) / 2,
text=barcode_value,
)
if context.barWidth > 0 : if context.bar_width > 0:
c.setFillColor(context.barColor) c.setFillColor(context.bar_color)
c.rect(subLabelWidth-context.barWidth, 0, context.barWidth, subLabelHeight,0, 1) c.rect(
if context.highlightBarWidth > 0 : sub_label_width - context.bar_width,
c.setFillColor(context.highlightBarColor) 0,
c.rect(subLabelWidth-context.barWidth-context.highlightBarWidth, 0, context.highlightBarWidth, subLabelHeight,0, 1) context.bar_width,
sub_labelheight,
0,
1,
)
if context.highlight_bar_width > 0:
c.setFillColor(context.highlight_bar_color)
c.rect(
sub_label_width - context.bar_width - context.highlight_bar_width,
0,
context.highlight_bar_width,
sub_labelheight,
0,
1,
)
if context.position_helper:
if context.positionHelper:
r = 0.1 r = 0.1
d = 0 d = 0
if context.debug: if context.debug:
r = 0.5 r = 0.5
d = r d = r
c.circle(x_cen=0 + d, y_cen=0 + d, r=r, stroke=1) c.circle(x_cen=0 + d, y_cen=0 + d, r=r, stroke=1)
c.circle(x_cen=subLabelWidth-d, y_cen=0+d, r=r, stroke=1) c.circle(x_cen=sub_label_width - d, y_cen=0 + d, r=r, stroke=1)
c.circle(x_cen=0+d, y_cen=subLabelHeight-d, r=r, stroke=1) c.circle(x_cen=0 + d, y_cen=sub_labelheight - d, r=r, stroke=1)
c.circle(x_cen=subLabelWidth-d, c.circle(
y_cen=subLabelHeight-d, r=r, stroke=1) x_cen=sub_label_width - d, y_cen=sub_labelheight - d, r=r, stroke=1
)
c.restoreState() c.restoreState()
def generate(
filename=None,
def generate( filename = None, *, labeltype:'l' = '4731', *,
number:'n'= 189, labeltype: "l" = "4731",
offset:'o' = 0, number: "n" = 189, # type: ignore
numDigits:'d'= 6, offset: "o" = 0, # type: ignore
firstAsn:'s' = 1, num_digits: "d" = 6, # type: ignore
fontSize:'f' = '2mm', first_asn: "s" = 1, # type: ignore
qrSize:'q' = 0.9, font_size: "f" = "2mm", # type: ignore
qrMargin:'m' = '1mm', qr_size: "q" = 0.9, # type: ignore
qr_margin: "m" = "1mm", # type: ignore
subLabelsX:'lx' = 1, sub_labels_x: "lx" = 1, # type: ignore
subLabelsY:'ly' = 1, sub_labels_y: "ly" = 1, # type: ignore
debug=False, debug=False,
positionHelper = False, position_helper=False,
bar_width: "bw" = 0, # type: ignore
bar_color: "bc" = "d2dede", # type: ignore
highlight_bar_width: "hw" = 0, # type: ignore
barWidth:'bw'=0, highlight_bar_color: "hc" = "d9a4a6", # type: ignore
barColor:'bc'= 'd2dede', prefix: "p" = "ASN", # type: ignore
highlightBarWidth:'hw'= 0 ,
highlightBarColor:'hc'= 'd9a4a6',
prefix:'p' = 'ASN'
): ):
"""ASN Label Generator """ASN Label Generator
@ -144,44 +151,50 @@ def generate( filename = None, *, labeltype:'l' = '4731',
:param number: number of labels to generate :param number: number of labels to generate
:param offset: Number of labels to skip on the first sheet (e.g. already used) :param offset: Number of labels to skip on the first sheet (e.g. already used)
:param numDigits: Number of digits for the ASN, e.g. 000001 :param num_digits: Number of digits for the ASN, e.g. 000001
:param firstAsn: First ASN to use, e.g. 100001 :param first_asn: First ASN to use, e.g. 100001
:param fontSize: Fontsize with a unit, e.g. 2mm, 0.4cm :param font_size: Fontsize with a unit, e.g. 2mm, 0.4cm
:param qrSize: Size of the QR-Code as percentage of the label hight :param qr_size: Size of the QR-Code as percentage of the label hight
:param qrMargin: Margin around the QR-Code with a unit, e.g. 1mm :param qr_margin: Margin around the QR-Code with a unit, e.g. 1mm
:param subLabelsX: How many labels to put on a phyical label horizontally :param sub_labels_x: How many labels to put on a phyical label horizontally
:param subLabelsY: How many labels to put on a phyical label vertically :param sub_labels_y: How many labels to put on a phyical label vertically
:param debug: enable debug mode :param debug: enable debug mode
:param positionHelper: enable position helpers, e.g. as cutting guides when using sub labels :param position_helper: enable position helpers, e.g. as cutting guides when using sub labels
:param barWidth: Show a colored bar on the right of the label (0 = no bar) :param bar_width: Show a colored bar on the right of the label (0 = no bar)
:param barColor: Color of the bar, HEX notation :param bar_color: Color of the bar, HEX notation
:param highlightBarWidth: add a colored highlight bar on the right of the label (0 = no bar) :param highlight_bar_width: add a colored highlight bar on the right of the label (0 = no bar)
:param highlightBarColor: Color of the highlight bar, HEX notation :param highlight_bar_color: Color of the highlight bar, HEX notation
:param prefix: Prefix to the actual ASN number :param prefix: Prefix to the actual ASN number
""" """
parm = locals() parm = locals()
parm['fontSize'] = toLength(parm['fontSize']) parm["font_size"] = toLength(parm["font_size"])
parm['qrMargin'] = toLength(parm['qrMargin']) parm["qr_margin"] = toLength(parm["qr_margin"])
parm['barColor'] = HexColor('#'+parm['barColor']) parm["bar_color"] = HexColor("#" + parm["bar_color"])
parm['highlightBarColor'] = HexColor('#'+parm['highlightBarColor']) parm["highlight_bar_color"] = HexColor("#" + parm["highlight_bar_color"])
parm['labeltype'] = int(parm['labeltype']) parm["labeltype"] = int(parm["labeltype"])
if parm['filename'] == None: if parm["filename"] is None:
parm['filename']= 'label-'+str(parm['labeltype'])+'-'+parm['prefix']+'-'+str(parm['firstAsn']).zfill(parm['numDigits'])+'-'+str(parm['firstAsn']+parm['number']).zfill(parm['numDigits'])+'.pdf' parm["filename"] = (
"label-"
+ str(parm["labeltype"])+ "-"
+ parm["prefix"]+ "-"
+ str(parm["first_asn"]).zfill(parm["num_digits"])+ "-"
+ str(parm["first_asn"] + parm["number"]).zfill(parm["num_digits"])
+ ".pdf"
)
context = LabelContext(parm) context = LabelContext(parm)
label = AveryLabels.AveryLabel(context.labeltype) label = AveryLabels.AveryLabel(context.labeltype)
label.debug = context.debug label.debug = context.debug
@ -192,24 +205,22 @@ def generate( filename = None, *, labeltype:'l' = '4731',
label.render(render_func, count=context.number, offset=context.offset) label.render(render_func, count=context.number, offset=context.offset)
label.close() label.close()
print
print(f"Output written to {context.filename}") print(f"Output written to {context.filename}")
def labels(): def labels():
""" Shows a list of supported labels """Shows a list of supported labels"""
""" print("Supported Labels: " + ", ".join(map(str, labelInfo.keys())))
print('Supported Labels: '+', '.join(map(str,labelInfo.keys())))
def version(): def version():
"""Show the version""" """Show the version"""
return 'ASN Label Generator - version 0.1 \n' + project_homepage return "ASN Label Generator - version 0.1 \n" + project_homepage
def main(): def main():
run(generate, alt=[labels, version]) run(generate, alt=[labels, version])
if __name__ == '__main__':
if __name__ == "__main__":
main() main()

0
out/empty Normal file
View file