feat: add several options for customizing label placement
* --row-wise, for going left to right instead of top to bottom * --num-labels, for specifying how many labels to print * --pages, for specifying how many pages to print * --start-position, for continuing on sheets where some labels were already used Co-authored-by: Jan Christian Grünhage <jan.christian@gruenhage.xyz>
This commit is contained in:
parent
a6e8fadf72
commit
d5d9b7adad
13 changed files with 1990 additions and 10 deletions
|
|
@ -1,4 +1,5 @@
|
|||
import argparse
|
||||
import re
|
||||
|
||||
from reportlab.lib.units import mm
|
||||
from reportlab_qrcode import QRCodeImage
|
||||
|
|
@ -19,6 +20,15 @@ def render(c, x, y):
|
|||
|
||||
|
||||
def main():
|
||||
# Match the starting position parameter. Allow x:y or n
|
||||
def _start_position(arg):
|
||||
if mat := re.match(r"^(\d{1,2}):(\d{1,2})$", arg):
|
||||
return (int(mat.group(1)), int(mat.group(2)))
|
||||
elif mat := re.match(r"^\d+$", arg):
|
||||
return int(arg)
|
||||
else:
|
||||
raise argparse.ArgumentTypeError("invalid value")
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
prog="paperless-asn-qr-codes",
|
||||
description="CLI Tool for generating paperless ASN labels with QR codes",
|
||||
|
|
@ -46,17 +56,47 @@ def main():
|
|||
action="store_true",
|
||||
help="Display borders around labels, useful for debugging the printer alignment",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--row-wise",
|
||||
"-r",
|
||||
action="store_false",
|
||||
help="Increment the ASNs row-wise, go from left to right",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--num-labels",
|
||||
"-n",
|
||||
type=int,
|
||||
help="Number of labels to be printed on the sheet",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--pages",
|
||||
"-p",
|
||||
type=int,
|
||||
default=1,
|
||||
help="Number of pages to be printed, ignored if NUM_LABELS is set (default: 1)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--start-position",
|
||||
"-s",
|
||||
type=_start_position,
|
||||
help="Define the starting position on the sheet, eighter as ROW:COLUMN or COUNT, both starting from 1 (default: 1:1 or 1)",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
global startASN
|
||||
global digits
|
||||
startASN = int(args.start_asn)
|
||||
digits = int(args.digits)
|
||||
label = avery_labels.AveryLabel(args.format, args.border)
|
||||
label.open(args.output_file)
|
||||
# by default, we render all labels possible on a single sheet
|
||||
count = (
|
||||
avery_labels.labelInfo[args.format].labels_horizontal
|
||||
* avery_labels.labelInfo[args.format].labels_vertical
|
||||
label = avery_labels.AveryLabel(
|
||||
args.format, args.border, topDown=args.row_wise, start_pos=args.start_position
|
||||
)
|
||||
label.open(args.output_file)
|
||||
|
||||
# If defined use parameter for number of labels
|
||||
if args.num_labels:
|
||||
count = args.num_labels
|
||||
else:
|
||||
# Otherwise number of pages*labels - offset
|
||||
count = args.pages * label.across * label.down - label.position
|
||||
label.render(render, count)
|
||||
label.close()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue