← Alle Beiträge

2026-11-05

Etikettendaten mit Python vor dem Druck formatieren, validieren und transformieren

Etikettendaten mit Python vor dem Druck formatieren, validieren und transformieren
pdf labels barcodes label merge browser based graphical layout editor google sheets addin microsoft excel addon electronic shelf labels esl barcode3 labels label editor

Label-Daten mit Python vor dem Druck formatieren, validieren und transformieren

Ein Preis-Etikett, das 35.00 statt 3.50 druckt, ist kein Designproblem. Es ist ein Datenproblem – und es ist die Art von Problem, die jede visuelle Prüfung übersteht, weil das Etikett gut aussieht.

Dieser Artikel handelt von der Schicht, die die meisten Etiketten-Workflows überspringen: was mit einem Feldwert zwischen „die Tabelle enthält einen Wert" und „der Drucker bringt ihn auf Papier" passiert.

Die Freelancerin, die fast ein falsches Preis-Etikett ausgeliefert hätte

Stellen Sie sich eine Solo-Entwicklerin vor – nennen wir sie Mara –, die einen kleinen Einzelhandelskunden annimmt: ein Laden, vierzig SKUs, eine Tabelle, die die Inhaberin selbst pflegt. Mara baut eine Etikettenvorlage, bindet die Tabelle als Datenquelle ein, druckt ein Testblatt, und das erste Etikett zeigt eine 250-g-Kaffeepackung mit 35.00.

In der Tabelle stand 3,50. Ein Dezimalkomma. Das Etikettendesign erwartete einen Punkt, und niemand bemerkte es, bis der Korrekturabzug von der Ladeninhaberin zurückkam.

Der Rest der Spalte ist nicht besser:

  • Preise als 3.5, 3,50, € 3.50 und ein paar leere Zellen.
  • SKUs, die Excel stillschweigend in Zahlen umgewandelt hat und dabei die führenden Nullen verschluckte, die ein Barcode braucht.
  • Mindesthaltbarkeitsdaten in drei Formaten über vierzig Zeilen hinweg.
  • Lieferantencodes mit einem SUP--Präfix, das die Inhaberin für ein saubereres Etikett entfernt haben möchte.

Maras erster Impuls ist der übliche: ein Exportskript schreiben, das die CSV bereinigt, und dann die bereinigte Datei an das Druckwerkzeug übergeben. Das funktioniert – bis die Ladeninhaberin die Tabelle nächste Woche bearbeitet und das Exportskript auf Maras Laptop liegt, undokumentiert, und niemand daran denkt, es auszuführen.

Die eigentliche Frage lautet also: Wie bereinigt und formt man Feldwerte, bevor sie den Drucker erreichen, ohne eine zweite Datenpipeline aufzubauen und zu pflegen?

Die Antwort in RSJ LPSNG ist die Python Field Script API: Skriptblöcke, die an einzelne Etikettenfelder angehängt werden und auf Feldwerte vor dem Druck zugreifen und sie ändern. Das Skript reist mit dem Etikett, statt daneben zu leben.

Zur Klarstellung des Umfangs: Es geht hier nicht um das Design des Etiketts. Wenn Sie die Layout-Seite möchten – Platzieren von Text, Barcodes und Bildern im Browser-Editor –, ist das in How to Design Barcode Labels in a Browser Layout Editor behandelt. Dieser Artikel handelt von den Werten, die in dieses Layout fließen.

Warum Datenkontrolle auf Feldebene für Entwickler und Endanwender wichtig ist

Die meisten Etikettendefekte sind Datendefekte im Designkostüm. Falsche Dezimalstellen, unformatierte Daten, fehlende führende Nullen in Barcodes, ein abgeschnittener Produktname, der nicht mehr passt – das Layout tut genau das, was ihm gesagt wurde. Die Eingabe war falsch.

Kontrolle auf Feldebene ist aus demselben zugrunde liegenden Grund für zwei sehr unterschiedliche Zielgruppen wichtig.

Für Entwickler beseitigt sie eine ganze Klasse von Nebeninfrastruktur. Sie schreiben und pflegen kein externes Vorverarbeitungsskript, keinen geplanten Job, der CSV-Dateien umschreibt, und keinen Klebecode zwischen Datenquelle und Druck-Engine. Formatierung und Validierung leben in der Etikettendefinition, also im Artefakt, das sie tatsächlich braucht.

Für Endanwender und kleine Teams erzeugt sie konsistente Ausgaben, ohne dass jemand die Quelldaten verstehen muss. Die Ladeninhaberin füllt ihre Tabelle weiterhin so aus wie immer. Das Etikett entscheidet, wie ein Preis angezeigt wird.

Die Python Field Script API ist die Mittelschicht zwischen diesen beiden Welten:

  • Sie läuft auf dem Feld, nicht auf der Datei.
  • Sie kann den Wert vor dem Druck lesen und ändern.
  • Sie lebt in derselben Plattform, die das Etikett rendert, sodass es keine Versionsdrift zwischen „dem Bereiniger" und „der Vorlage" gibt.

Die API-Referenz finden Sie unter lpsng.rsj.de/api.html.

Ein praktisches Playbook: Formatieren, Validieren und Transformieren in drei Durchgängen

Behandeln Sie jedes Feldskript als drei Durchgänge über den Wert, in dieser Reihenfolge: formatieren, nachweisen, dann daraus ableiten. Die folgenden Snippets sind illustratives Python – wichtig ist die Form der Logik, nicht die genauen Helper-Namen.

Durchgang 1: Formatieren

Normalisieren Sie den Rohwert genau zu dem, was das Etikettendesign erwartet. Preise auf ein festes Dezimalmuster, Daten auf ein Anzeigeformat, Text auf die Schreibweise, um die herum das Layout entworfen wurde.

import re

CURRENCY = re.compile(r"[^\d,.\-]")

def format_price(raw):
    """'€ 3,50' -> '3.50'; returns None when nothing usable is left."""
    if raw is None:
        return None
    cleaned = CURRENCY.sub("", str(raw)).strip()
    if not cleaned:
        return None
    if "," in cleaned and "." in cleaned:
        cleaned = cleaned.replace(".", "").replace(",", ".")   # 1.234,56
    elif "," in cleaned:
        cleaned = cleaned.replace(",", ".")                    # 3,50
    return f"{float(cleaned):.2f}"
from datetime import datetime

DATE_FORMATS = ("%Y-%m-%d", "%d.%m.%Y", "%d/%m/%Y")

def format_date(raw, out="%d.%m.%Y"):
    text = str(raw or "").strip()
    for fmt in DATE_FORMATS:
        try:
            return datetime.strptime(text, fmt).strftime(out)
        except ValueError:
            continue
    return None   # unparseable beats guessed
def label_case(raw, style="upper"):
    text = " ".join(str(raw or "").split())   # collapse stray whitespace
    return text.upper() if style == "upper" else text.title()

Beachten Sie die bewussten None-Rückgaben. Ein nicht formatierbarer Wert sollte im nächsten Durchgang sichtbar scheitern und nicht zu einem plausibel aussehenden 0.00 werden.

Durchgang 2: Validieren

Validierung ist das, was einen falschen Preis davon abhält, stillschweigend zum Drucker zu gelangen. Prüfen Sie, ob die Felder, von denen Sie abhängen, existieren und wohlgeformt sind, und machen Sie jede Meldung spezifisch genug, um den Datensatz zu lokalisieren.

def validate_record(record):
    """Return a list of 'field: reason' strings. Empty list means OK."""
    errors = []

    sku = (record.get("sku") or "").strip()
    if not sku:
        errors.append("sku: missing")
    elif len(sku) < 8:
        errors.append(f"sku: shorter than 8 characters ({sku!r})")

    price = record.get("price")
    if price is None:
        errors.append("price: not parseable")
    elif not (0.01 <= price <= 9999.99):
        errors.append(f"price: out of range ({price!r})")

    if record.get("best_before") is None:
        errors.append("best_before: unparseable date")

    return errors

Eine Meldung wie price: not parseable ('0,00') sagt einem Operator, welches Feld er sich ansehen soll und welcher Wert es verursacht hat. Eine Meldung wie invalid data sagt ihm, dass er Sie anrufen soll.

price: not parseable ('0,00')
sku: shorter than 8 characters ('4711')
best_before: unparseable date (row: Espresso 250g)

Durchgang 3: Transformieren

Erst nachdem der Wert formatiert und validiert ist, sollten Sie Anzeigewerte daraus ableiten – einen kombinierten Produktcode, ein abgeschnittenes Lieferantenpräfix, einen Kurznamen für ein schmales Feld.

def product_code(record, prefix="SUP-"):
    supplier = (record.get("supplier_code") or "").strip()
    if supplier.startswith(prefix):
        supplier = supplier[len(prefix):]
    sku = (record.get("sku") or "").strip()
    return f"{supplier}-{sku}".strip("-")

Wo das Skript im Workflow lebt

In RSJ LPSNG hängen Sie den Skriptblock im Layout an ein Etikettenfeld. Die Plattform führt ihn als Teil des normalen Druck- oder Render-Jobs aus – desselben Laufs, der auch die PDF- oder PNG-Ausgabe und den Direktdruck über die Web-Service-Schnittstelle übernimmt. Es gibt keinen Sidecar-Prozess zu starten und kein Reihenfolgeproblem, über das man nachdenken müsste.

Das ist wichtig für die Übergabe. Die Formatierungsregel ist Teil der Etikettendefinition, also wandert sie mit der Vorlage, statt auf dem Rechner der Person zu bleiben, die sie geschrieben hat.

Der harte Weg vs. der verwaltete Weg

Der harte Weg ist der, den Mara fast gewählt hätte: ein separates Skript, das CSV- oder Excel-Dateien umschreibt, bevor sie einem Druckwerkzeug zugeführt werden. Es hat seine eigene Deployment-Geschichte, seine eigenen Fehlermodi und seine eigene stille Annahme, dass alle daran denken, es vor dem Drucken auszuführen.

Der verwaltete Weg legt den Python-Skriptblock auf das Feld selbst in RSJ LPSNG. Formatierung und Validierung reisen mit dem Etikett. Dasselbe Etikett kann als PDF oder PNG gerendert oder über die Web-Service-Schnittstelle an den Direktdruck gesendet werden, und die Feldlogik ist in jedem Fall dieselbe, weil sie zum Etikett gehört und nicht zu einem externen Schritt.

Checkliste für Ihr erstes Feldskript

  • Beginnen Sie mit einem Feld und einer Regel. Formatieren Sie den Preis, rendern Sie ein Beispiel-PDF und prüfen Sie es. Erst dann fassen Sie das nächste Feld an.
  • Machen Sie Fehler lokalisierbar. Jede Validierungsmeldung sollte das Feld benennen und den fehlerhaften Wert zeigen.
  • Testen Sie mit absichtlich unordentlicher Eingabe. Leere Zellen, zusätzliche Leerzeichen, gemischte Datumsformate, ein negativer Preis, ein Preis von 0.00, eine SKU mit falscher Länge.
  • Entscheiden Sie zwischen Transformation und Lookup. Excel-Dateien können sowohl als Datendateien als auch als Lookup-Dateien dienen, daher gehört ein Lieferantenname vielleicht in ein Referenzblatt statt in eine Ableitung im Skript. Die Datenquellen-Seite ist in How to Print Barcoded Labels from Excel behandelt.
  • Rendern Sie, bevor Sie ausführen. Ein PDF-Korrekturabzug von drei unordentlichen Datensätzen kostet eine Minute; ein Nachdruck von vierzig falschen Regaletiketten kostet einen Vormittag.

Was Sie vermeiden sollten

Vergraben Sie Geschäftsregeln nicht im Layout. Halten Sie Formatierung und Validierung im Feldskript und Designentscheidungen im Layout-Editor. Vermischt bedeutet, dass eine Design-Anpassung stillschweigend ein Preisformat ändern kann.

Zwingen Sie fehlerhafte Daten nicht stillschweigend in einen plausiblen Wert. Ein Etikett, das selbstbewusst den falschen Preis druckt, ist schlimmer als ein Job, der laut scheitert. Geben Sie None zurück und lassen Sie die Validierung es abfangen.

Duplizieren Sie dieselbe Transformation nicht über viele Felder. Wenn sechs Felder dasselbe Preisformat brauchen, ist ein gemeinsamer Ansatz besser als sechs kopierte Blöcke, die auseinanderdriften. Inkonsistenz zwischen Feldern auf demselben Etikett ist eine der häufigsten Fehlerquellen.

Raten Sie nicht bei mehrdeutiger Eingabe. 03/04/2026 ist entweder der 4. März oder der 3. April. Legen Sie das Format an der Quelle fest; ein Skript, das rät, wird für jemanden falsch sein.

Betrachten Sie das Skript nicht als Ersatz für Tests. Rendern Sie Beispiel-Etiketten und schauen Sie sie an. Feldskripte reduzieren die Zahl der Überraschungen, sie beseitigen nicht die Notwendigkeit zu prüfen.

FAQ

Wo laufen Python-Skriptblöcke in RSJ LPSNG?

Python-Skriptblöcke werden an Etikettenfelder angehängt und greifen vor dem Druck auf Feldwerte zu und ändern sie, als Teil der Etikettendefinition in der Plattform.

Muss ich eine separate Datenbereinigungs-Pipeline bauen?

Nein. Das Feldskript übernimmt Formatierung, Validierung und Transformation innerhalb des Etiketts selbst, sodass Sie kein Sidecar-Skript brauchen, das Ihre Datendateien umschreibt, bevor sie die Druck-Engine erreichen.

Kann ich Jobs weiterhin programmatisch übermitteln?

Ja. Die Web-Service-Schnittstelle ermöglicht es Ihnen, Druckjobs zu übermitteln und einzelne Etiketten als PDF oder PNG zu rendern, und das OAuth2-Modell deckt die Anbindung externer Systeme mit einer einzigen Registrierungs-URL ab.

Gilt dieselbe Feldlogik für PDF, PNG und Direktdruck?

PDF/PNG-Rendering und Direktdruck sind dokumentierte Ausgabewege der Web-Service-Schnittstelle, und die Feldlogik gehört zur Etikettendefinition, die diese Wege verwenden. Elektronische Regaletiketten sind eine eigene Spur mit ihrer eigenen herstellerneutralen JSON-Schnittstelle (ESLSEND) – siehe die ESL-Schnittstellendokumentation, statt anzunehmen, dass der Druckweg unverändert gilt.

Können Nicht-Entwickler ein Etikett mit Feldskripten verwenden?

Ja. Sobald das Skript am Feld hängt, erfordert das Drucken des Etiketts weder das Schreiben noch das Lesen von Python. Wer den Job ausführt, wählt Daten aus und druckt; Formatierung und Validierung geschehen als Teil des Etiketts.

Ersetzt das den Layout-Editor?

Nein. Der Layout-Editor übernimmt das Design; die Python-Feldskripte übernehmen die Daten, die in jedes Feld fließen. Sie sind komplementäre Teile desselben Etiketts.

Fazit

Maras Lösung war kein besseres Exportskript. Sie bestand darin, die Regel dorthin zu verschieben, wo der Wert tatsächlich verwendet wird: ein Preisfeld, das ein Dezimalkomma in 3.50 formatiert, sich weigert, eine leere Zelle zu drucken, und unterwegs ein Lieferantenpräfix entfernt. Die Ladeninhaberin behielt ihre Tabelle. Die Etiketten waren nicht mehr falsch.

Next Generation Label Printing System ist genau um diese Trennung herum gebaut – Design im Layout-Editor, Datenkontrolle in Feldskripten und eine Web-Service-Schnittstelle, wenn Sie Jobs programmatisch steuern möchten. Beginnen Sie mit einem Feld, einer Regel und einem gerenderten PDF. Dann übergeben Sie es.


Verwandte Beiträge

EU label: AI-generated content