Files
homebox/generate_qr.py
2026-08-09 11:55:30 +02:00

85 lines
2.8 KiB
Python

import sys
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.graphics.barcode import qr
from reportlab.graphics.shapes import Drawing
def generate_xxl_qr_pdf(domain, start_num, count):
# URL-Formatierung sicherstellen
domain = domain.strip().rstrip('/')
if not domain.startswith("http"):
domain = f"https://{domain}"
end_num = start_num + count - 1
filename = f"Homebox_QR_XXL_HB{start_num:03d}_bis_HB{end_num:03d}.pdf"
c = canvas.Canvas(filename, pagesize=A4)
page_width, page_height = A4
# 2 Spalten x 4 Zeilen = 8 Labels pro A4-Seite
cols, rows = 2, 4
col_width = page_width / cols
row_height = page_height / rows
current_num = start_num
for i in range(count):
page_idx = i % 8
if i > 0 and page_idx == 0:
c.showPage()
col = page_idx % cols
row = rows - 1 - (page_idx // cols)
x_center = col * col_width + (col_width / 2)
y_center = row * row_height + (row_height / 2)
code_str = f"HB-{current_num:03d}"
# Der Direkt-Such-Link für die Homebox-Weboberfläche
qr_url = f"{domain}/items?q={code_str}"
# Gestrichelte Schnittlinie
c.setDash(2, 2)
c.setStrokeColorRGB(0.6, 0.6, 0.6)
c.rect(col * col_width + 3*mm, row * row_height + 3*mm, col_width - 6*mm, row_height - 6*mm)
# QR-Code (50mm x 50mm)
qr_size = 50 * mm
qr_widget = qr.QrCodeWidget(qr_url)
bounds = qr_widget.getBounds()
w = bounds[2] - bounds[0]
h = bounds[3] - bounds[1]
d = Drawing(qr_size, qr_size, transform=[qr_size/w, 0, 0, qr_size/h, 0, 0])
d.add(qr_widget)
render_x = x_center - (qr_size / 2)
render_y = y_center - (qr_size / 2) + 2*mm
d.drawOn(c, render_x, render_y)
# Leserlicher Text darunter
c.setFont("Courier-Bold", 16)
c.setFillColorRGB(0, 0, 0)
c.drawCentredString(x_center, render_y - 7*mm, code_str)
current_num += 1
c.save()
print(f"\n✅ PDF mit Homebox-Links wurde erstellt: {filename}")
if __name__ == "__main__":
print("--- Homebox XXL Label Generierung (mit URL) ---")
domain_input = "homebox.prinz-pilaw.de".strip()
try:
start_input = input("Startnummer (Standard 1): ").strip()
start = int(start_input) if start_input else 1
anzahl_input = input("Anzahl Etiketten (Standard 16): ").strip()
anzahl = int(anzahl_input) if anzahl_input else 16
except ValueError:
print("❌ Fehler: Bitte gültige Zahlen eingeben.")
sys.exit(1)
generate_xxl_qr_pdf(domain_input, start, anzahl)