From 55f9f91b55fe21adeae492bd70e91687280f6a54 Mon Sep 17 00:00:00 2001 From: OliverFriedrich Date: Fri, 28 Mar 2025 00:43:38 +0100 Subject: [PATCH 1/2] * options to handle invalid vertical and/or horizontal printer alignment * remove additional padding from qr code * use qr code margin option also as minimum spacing to upper and lower label border * fix positioning of ASN number * Add Avery L7871 label definition (it's a clone of 4731) --- AveryLabels.py | 12 ++++++++---- asn-gen.py | 22 ++++++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/AveryLabels.py b/AveryLabels.py index 27c2b3d..7b083ad 100644 --- a/AveryLabels.py +++ b/AveryLabels.py @@ -26,6 +26,7 @@ labelInfo = { 3044: (2, 11, (32, 10), (2, 2), (1, 1), (66.5 * mm, 120.5 * mm)), # 189x 25.4mm x 10mm mini labels 4731: (7, 27, (25.4 * mm, 10 * mm), (2.5 * mm, 0), (9 * mm, 13.5 * mm), A4), + 7871: (7, 27, (25.4 * mm, 10 * mm), (2.5 * mm, 0), (9 * mm, 13.5 * mm), A4), # 2.6 x 1 address labels 5160: (3, 10, (187, 72), (11, 0), (14, 36), A4), 5161: (2, 10, (288, 72), (0, 0), (18, 36), A4), @@ -44,7 +45,7 @@ labelInfo = { class AveryLabel: - def __init__(self, label, **kwargs): + def __init__(self, label, pageoffset, **kwargs): data = labelInfo[label] self.across = data[0] self.down = data[1] @@ -55,6 +56,8 @@ class AveryLabel: self.debug = False self.pagesize = data[5] self.position = 0 + self.pageoffset = pageoffset + self.__dict__.update(kwargs) def open(self, filename): @@ -76,8 +79,8 @@ class AveryLabel: y, x = divmod(x, self.across) return ( - self.margins[0] + x * self.labelsep[0], - self.pagesize[1] - self.margins[1] - (y + 1) * self.labelsep[1], + self.margins[0] + x * self.labelsep[0] + self.pageoffset[0], + self.pagesize[1] - self.margins[1] - (y + 1) * self.labelsep[1] - self.pageoffset[1], ) def advance(self): @@ -101,7 +104,7 @@ class AveryLabel: # Or, pass a callable and an iterator. We'll do one label # per iteration of the iterator. - def render(self, thing, count, offset=0, *args): + def render(self, thing, count, offset=0, pageshift=(0 * mm, 0 * mm), *args): """ render loop""" assert callable(thing) or isinstance(thing, str) if isinstance(count, Iterator): @@ -128,6 +131,7 @@ class AveryLabel: canv = self.canvas for chunk in iterator: canv.saveState() + canv.translate(*self.top_left()) if self.debug: canv.setLineWidth(0.25) diff --git a/asn-gen.py b/asn-gen.py index 9a2edd6..ce7a21b 100755 --- a/asn-gen.py +++ b/asn-gen.py @@ -55,6 +55,9 @@ class LabelContext: self.highlight_bar_color = HexColor("#d9a4a6") self.prefix = "ASN" + self.page_offset_x = 0 * mm + self.page_offset_y = 0 * mm + self.__dict__.update(data) self.current_asn = self.first_asn @@ -84,13 +87,14 @@ def render(context: LabelContext, c: canvas.Canvas, width: float, height: float) ) context.inc_asn() - qr = QRCodeImage(barcode_value, size=sub_labelheight * context.qr_size) + qr_width = min(sub_labelheight * context.qr_size, sub_labelheight - 2 * context.qr_margin) + qr = QRCodeImage(barcode_value, size=qr_width, border=0) qr.drawOn( - c, x=context.qr_margin, y=sub_labelheight * ((1 - context.qr_size) / 2) + c, x=context.qr_margin, y=(sub_labelheight - qr_width) / 2 ) c.setFont("Helvetica", size=context.font_size) c.drawString( - x=sub_labelheight, + x= qr_width + 2 * context.qr_margin, y=(sub_labelheight - context.font_size) / 2, text=barcode_value, ) @@ -161,6 +165,8 @@ def generate( highlight_bar_width: "hw" = 0, # type: ignore highlight_bar_color: "hc" = "d9a4a6", # type: ignore prefix: "p" = "ASN", # type: ignore + page_offset_x: "dx" = "0mm", # type: ignore + page_offset_y: "dy" = "0mm", # type: ignore ): # pylint: disable=too-many-locals # pylint: disable=unused-argument """ASN Label Generator @@ -193,6 +199,9 @@ def generate( :param prefix: Prefix to the actual ASN number + :param page_offset_x: Print offset of the labels on the page to handle horizontal printer alignment with unit (e.g. -2mm) + :param page_offset_y: Print offset of the labels on the page to handle vertical printer alignment with unit (e.g. -1.5mm) + """ parm = locals() @@ -201,6 +210,8 @@ def generate( parm["bar_color"] = HexColor("#" + parm["bar_color"]) parm["highlight_bar_color"] = HexColor("#" + parm["highlight_bar_color"]) parm["labeltype"] = int(parm["labeltype"]) + parm["page_offset_x"] = toLength(parm["page_offset_x"]) + parm["page_offset_y"] = toLength(parm["page_offset_y"]) if parm["filename"] is None: parm["filename"] = gen_filename(parm) @@ -211,7 +222,7 @@ def generate( context = LabelContext(parm) - label = AveryLabels.AveryLabel(context.labeltype) + label = AveryLabels.AveryLabel(context.labeltype, (context.page_offset_x, context.page_offset_y)) label.debug = context.debug @@ -226,8 +237,7 @@ def generate( def labels(): """Shows a list of supported labels""" - print("Supported Labels: " + ", ".join(map(str, labelInfo.keys()))) - + print("Supported Labels: " + ", ".join(map(str, sorted(labelInfo.keys())))) def version(): """Show the version""" From be654118bb386fab3bc1edf3b4dc2ed2abd285d7 Mon Sep 17 00:00:00 2001 From: OliverFriedrich Date: Fri, 28 Mar 2025 19:57:11 +0100 Subject: [PATCH 2/2] * updated README.md --- README.md | 51 +++++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 894d3bd..f7a301f 100644 --- a/README.md +++ b/README.md @@ -65,31 +65,38 @@ Usage: asn-gen.py [OPTIONS] [filename] ASN Label Generator Arguments: - filename output filename of PDF file generated + filename output filename of PDF file generated, if .pdf extension is missing the string will be used + as directory Options: - -l, --labeltype=STR Type of label, e.g. 4731, get a list of supported labels with --labels (default: 4731) - -n, --number=INT number of labels to generate (default: 189) - -o, --offset=INT Number of labels to skip on the first sheet (e.g. already used) (default: 0) - -d, --num-digits=INT Number of digits for the ASN, e.g. 000001 (default: 6) - -s, --first-asn=INT First ASN to use, e.g. 100001 (default: 1) - -f, --font-size=STR Fontsize with a unit, e.g. 2mm, 0.4cm (default: 2mm) - -q, --qr-size=FLOAT Size of the QR-Code as percentage of the label hight (default: 0.9) - -m, --qr-margin=STR Margin around the QR-Code with a unit, e.g. 1mm (default: 1mm) - --sub-labels-x, --lx=INT How many labels to put on a phyical label horizontally (default: 1) - --sub-labels-y, --ly=INT How many labels to put on a phyical label vertically (default: 1) - --debug enable debug mode - --position-helper enable position helpers, e.g. as cutting guides when using sub labels - --bar-width, --bw=INT Show a colored bar on the right of the label (0 = no bar) (default: 0) - --bar-color, --bc=STR Color of the bar, HEX notation (default: d2dede) - --highlight-bar-width, --hw=INT add a colored highlight bar on the right of the label (0 = no bar) (default: 0) - --highlight-bar-color, --hc=STR Color of the highlight bar, HEX notation (default: d9a4a6) - -p, --prefix=STR Prefix to the actual ASN number (default: ASN) + -l, --labeltype=STR Type of label, e.g. 4731, get a list of supported labels with --labels (default: 4731) + -n, --number=INT number of labels to generate (default: 189) + -o, --offset=INT Number of labels to skip on the first sheet (e.g. already used) (default: 0) + -d, --num-digits=INT Number of digits for the ASN, e.g. 000001 (default: 6) + -s, --first-asn=INT First ASN to use, e.g. 100001 (default: 1) + -f, --font-size=STR Fontsize with a unit, e.g. 2mm, 0.4cm (default: 2mm) + -q, --qr-size=FLOAT Size of the QR-Code as percentage of the label hight (default: 0.9) + -m, --qr-margin=STR Margin around the QR-Code with a unit, e.g. 1mm (default: 1mm) + --sub-labels-x, --lx=INT How many labels to put on a phyical label horizontally (default: 1) + --sub-labels-y, --ly=INT How many labels to put on a phyical label vertically (default: 1) + --debug enable debug mode + --position-helper enable position helpers, e.g. as cutting guides when using sub labels + --bar-width, --bw=INT Show a colored bar on the right of the label (0 = no bar) (default: 0) + --bar-color, --bc=STR Color of the bar, HEX notation (default: d2dede) + --highlight-bar-width, --hw=INT + add a colored highlight bar on the right of the label (0 = no bar) (default: 0) + --highlight-bar-color, --hc=STR + Color of the highlight bar, HEX notation (default: d9a4a6) + -p, --prefix=STR Prefix to the actual ASN number (default: ASN) + --page-offset-x, --dx=STR Print offset of the labels on the page to handle horizontal printer alignment with unit + (e.g. -2mm) (default: 0mm) + --page-offset-y, --dy=STR Print offset of the labels on the page to handle vertical printer alignment with unit (e.g. + -1.5mm) (default: 0mm) Other actions: - -h, --help Show the help - --labels Shows a list of supported labels - --version Show the version + -h, --help Show the help + --labels Shows a list of supported labels + --version Show the version ``` #### Testing your printer settings @@ -181,4 +188,4 @@ _Output filename: label-5161-ASN-000001-000021.pdf_ ## Credits -This project is based on [work by gitolicious](https://github.com/gitolicious/avery-asn/tree/main) but was heavily modified to support CLI and some additional features. That project itself is based on the [work from timrprobocom](https://gist.github.com/timrprobocom/3946aca8ab75df8267bbf892a427a1b7) \ No newline at end of file +This project is based on [work by gitolicious](https://github.com/gitolicious/avery-asn/tree/main) but was heavily modified to support CLI and some additional features. That project itself is based on the [work from timrprobocom](https://gist.github.com/timrprobocom/3946aca8ab75df8267bbf892a427a1b7)