asn-barcodes/asn-barcodes.py
2023-04-30 23:09:35 +02:00

74 lines
2.7 KiB
Python

try:
import sys
import argparse
import barcode
from barcode import Code128
from io import BytesIO
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
except:
print("Unable to load libraries. Install them with 'pip install python-barcode reportlab'")
sys.exit(1)
# Define arguments
def check_positive(value):
try:
value = int(value)
if value <= 0:
raise argparse.ArgumentTypeError("{} is not a positive integer".format(value))
except:
raise argparse.ArgumentTypeError("{} is not an integer".format(value))
return value
parser = argparse.ArgumentParser(prog="asn-barcodes.py", description="This tool can be used to generate ASN Barcodes for paperless-ngx.")
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
parser.add_argument("position", help="Number of the first ASN-Barcode to generate", metavar="POSITION", type=check_positive)
parser.add_argument("count", help="Number of ASN-Barcodes to generate", metavar="COUNT", type=check_positive)
parser.add_argument("-o", "--output", default="asn-barcodes", dest="output", help="Destination file name", metavar="")
args = parser.parse_args()
start = int(args.position)
end = int(args.position) + int(args.count)
# Generate barcodes
barcodes = []
for i in range(start, end):
barcode_value = 'ASN' + str(i).zfill(4)
barcode_image = Code128(barcode_value, writer=barcode.writer.ImageWriter()).render()
barcodes.append((barcode_value, barcode_image))
# Create PDF document with barcodes formatted for Avery L7871 Labels
pdf_file = args.output + ".pdf"
c = canvas.Canvas(pdf_file, pagesize=A4)
width, height = A4
page_left_margin = 16.1 * mm
page_bottom_margin = 13.5 * mm
label_width = 25.4 * mm
label_height = 10 * mm
horizontal_gap = 0.25 * mm
vertical_gap = 0 * mm
rows = 27
columns = 7
x = page_left_margin
y = height - page_bottom_margin
for i, (barcode_value, barcode_image) in enumerate(barcodes):
if i > 0 and i % (rows * columns) == 0:
c.showPage()
x = page_left_margin
y = height - page_bottom_margin
# Convert barcode image to BytesIO object
barcode_image_file = BytesIO()
barcode_image.save(barcode_image_file, format='PNG')
barcode_image_file.seek(0)
# Draw barcode image on label
img = ImageReader(barcode_image_file)
c.drawImage(img, x, y - label_height, width=label_width, height=label_height)
x += label_width + horizontal_gap
if i % columns == columns - 1:
x = page_left_margin
y -= label_height + vertical_gap
c.save()
print(f"Generated {i + 1} barcodes with ASN from {start} to {end-1} in ./{pdf_file}")