import io from barcode import Code128 from barcode.writer import ImageWriter from PIL import Image from reportlab.lib.units import mm from reportlab.lib.utils import ImageReader from reportlab.pdfgen import canvas # Karte 10: Code128 kameratauglich drucken - Mindesthöhe ~10mm, Ruhezone # (quiet zone) >= 10 Strichbreiten links/rechts ist laut Karte die häufigste # Ursache für Scan-Fehler bei selbstgedruckten Etiketten. module_width=0.3mm # * 10 = 3mm Mindest-Ruhezone, quiet_zone hier bewusst höher (5mm) angesetzt. _BARCODE_OPTIONEN = { "module_width": 0.3, "module_height": 10.0, "quiet_zone": 5.0, "font_size": 10, "text_distance": 3.0, "write_text": True, "dpi": 300, } _RAND = 5 * mm _MINDESTBREITE = 60 * mm def generiere_code128_label_pdf(code: str, klartext_zusatz: str | None = None) -> bytes: """Druckfertiges Vektor-Label: Code128-Barcode + Klartext-Zeile (Code selbst, via write_text der Bibliothek) + optionale zweite Klartext-Zeile (z. B. Objekt-/Materialname) als Scan-Ausfall-Fallback (Karte 10).""" barcode_puffer = io.BytesIO() Code128(code, writer=ImageWriter()).write(barcode_puffer, options=_BARCODE_OPTIONEN) barcode_puffer.seek(0) bild = Image.open(barcode_puffer) dpi = _BARCODE_OPTIONEN["dpi"] breite_pt = bild.width / dpi * 72 hoehe_pt = bild.height / dpi * 72 label_breite = max(breite_pt + 2 * _RAND, _MINDESTBREITE) zusatz_hoehe = 14 if klartext_zusatz else 0 label_hoehe = hoehe_pt + zusatz_hoehe + 2 * _RAND pdf_puffer = io.BytesIO() c = canvas.Canvas(pdf_puffer, pagesize=(label_breite, label_hoehe)) barcode_puffer.seek(0) bild_x = (label_breite - breite_pt) / 2 bild_y = label_hoehe - hoehe_pt - _RAND c.drawImage(ImageReader(barcode_puffer), bild_x, bild_y, width=breite_pt, height=hoehe_pt) if klartext_zusatz: c.setFont("Helvetica", 9) c.drawCentredString(label_breite / 2, _RAND - 2, klartext_zusatz) c.showPage() c.save() return pdf_puffer.getvalue()