Das Erzeugen eines GS1QR‑Barcodes ist einfach, bis die Nutzdaten ein Gruppentrennzeichen enthalten. Dieses einzelne nicht druckbare Zeichen, ASCII 29, teilt dem Scanner mit, wo ein variabel‑langer Application‑Identifier‑Feld endet. Entwickler umgingen das Problem mit manueller Byte‑Zusammenstellung, benutzerdefinierten Encodern oder der Aufteilung der Nutzdaten, wobei jede Umgehung das Risiko birgt, Symbole zu erzeugen, die zwar gescannt werden, aber nicht geparst werden können.

Aspose.BarCode for Python via .NET 26.6 behebt dieses Problem mit einem einzigen Flag. Die encode_gs1_separator_in_byte_mode‑Eigenschaft zwingt den QR‑Encoder, GS1‑Gruppentrennzeichen und das %‑Zeichen als Rohbytes zu schreiben und dabei die genaue GS1‑Struktur beizubehalten. Dieses Tutorial behandelt den vollständigen Barcode‑Erstellungs‑ und Erkennungs‑Workflow in python‑net: Installation des SDK, Erzeugung eines konformen GS1QR‑Symbols und Überprüfung auf Code‑Punkte‑Ebene, dass der Trenner die Rundreise überlebt hat.

Warum Byte-Modus GS1-Trennzeichen für GS1QR-Barcodes wichtig sind

GS1QR ist der bevorzugte zweidimensionale Träger in Lieferkette, Gesundheitswesen und Einzelhandel, bei dem ein einzelnes Symbol eine Produktkennung, Chargennummer, Verfallsdatum und Seriennummer in einer strukturierten Nutzlast enthalten muss. Die GS1 Application Identifier‑Syntax ermöglicht dies, jedoch hängt sie vom Group Separator ab, um Felder zu trennen, deren Länge nicht fest ist.

Betrachten Sie eine Nutzlast, die AI (10) für die Chargennummer und AI (21) für die Seriennummer kombiniert. Beide haben variable Länge, sodass der Scanner eine explizite Grenze zwischen ihnen benötigt. Ohne einen korrekt codierten Trenner liest ein nachgelagertes System einen zusammengefügten String anstelle von zwei Feldern. Der Barcode wird erfolgreich gescannt und liefert dennoch falsche Daten, die schlimmste Art von Fehler, weil im Scan‑Ereignis nichts das Problem signalisiert.

Die Byte‑Modus‑Kodierung löst dies an der Quelle. Der Encoder hört auf, das Trennzeichen als strukturelles Marker zu interpretieren, und schreibt es unverändert in das Datensegment. Der praktische Nutzen für Python‑Entwickler ist unmittelbar:

  • Konformität. Das ausgegebene Symbol entspricht den GS1 General Specifications, anstatt sie zu approximieren.
  • Einfacherer Code. Keine manuelle Byte-Zusammenstellung, keine benutzerdefinierte Encoder-Unterklasse, kein Nachbearbeitungsschritt.
  • Testbarkeit. Der Rundlauf ist in einem Unit-Test verifizierbar, indem man die decodierten Codepunkte prüft.

Erzeugen von GS1QR‑Barcodes mit Aspose.BarCode für Python

Aspose.BarCode for Python via .NET bietet eine High-Level-API sowohl für die Barcode-Generierung als auch für die Erkennung. Installieren Sie sie von PyPI:

pip install aspose-barcode-for-python-via-net

Zwei Klassen übernehmen den größten Teil der Arbeit. BarcodeGenerator, aus aspose.barcode.generation, erstellt und rendert Symbole. BarCodeReader, aus aspose.barcode.barcoderecognition, dekodiert sie. Generierungseinstellungen werden über einen Parameterbaum auf der Generatorinstanz erreicht, wobei symbologie‑spezifische Optionen wie die QR‑Einstellungen unter parameters.barcode.qr zu finden sind.

Referenzmaterial ist auf der Produktseite, der Dokumentationsseite, und der API-Referenz.

Wenn Sie eine Lizenzdatei haben, wenden Sie sie einmal beim Anwendungsstart an, bevor ein Generierungs‑ oder Erkennungsaufruf erfolgt:

from aspose.barcode import License

license = License()
license.set_license("Aspose.BarCode.Python.NET.lic")

GS1QR-Barcode mit Byte‑Modus‑Trennzeichen generieren

  1. Importieren Sie die erforderlichen Typen - BarcodeGenerator und EncodeTypes für die Erzeugung, BarCodeReader und DecodeType zur Verifizierung.
  2. Instanziieren Sie BarcodeGenerator mit EncodeTypes.GS1QR und einem GS1‑Payload‑String. Klammern kennzeichnen AI‑Abschnitte, wie in (10)ASPOSE2001(21)ASPOSE2026.
  3. Aktivieren Sie die Byte‑Modus‑Trennzeichen‑Kodierung, indem Sie gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True setzen.
  4. Legen Sie die Ausgabauflösung fest, damit das gerenderte Symbol sowohl im Druck als auch auf dem Bildschirm verwendet werden kann.
  5. Speichern Sie das Bild in einem verlustfreien Format und lesen Sie es anschließend ein, um die Kodierung zu bestätigen.

Das folgende Beispiel demonstriert den vollständigen Workflow:

from aspose.barcode.barcoderecognition import BarCodeReader, DecodeType
from aspose.barcode.generation import BarcodeGenerator, EncodeTypes

# 1. Create a GS1QR Barcode with Sample AI Data
# (10) = Batch or Lot Number, (21) = Serial Number
gen = BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026")

# 2. Turn on Byte-Mode Encoding for GS1 Group Separators
gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True

# 3. Set a Print-Ready Resolution
gen.parameters.resolution = 300

# 4. Save the Barcode to a PNG File
gen.save("gs1qr_test.png")

# 5. Verify by Reading the Barcode Back
reader = BarCodeReader("gs1qr_test.png", DecodeType.GS1QR)
for result in reader.read_bar_codes():
    print("BarCode CodeText: " + result.code_text)

Wie es funktioniert

  • BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026") erstellt einen Generator, der für die GS1QR‑Symbologie konfiguriert ist. Die Nutzdaten verwenden die GS1‑Syntax, wobei (10) die AI für Chargen‑ oder Losnummer und (21) die AI für die Seriennummer ist. Die Bibliothek analysiert die Klammer‑Form und fügt die von der Spezifikation geforderten Trennzeichen ein.
  • gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True aktiviert die in Version 26.6 eingeführte Option. Ist sie aktiviert, schreibt der Encoder den Gruppentrennzeichen und % als rohe Bytes im Datensegment, anstatt sie zu interpretieren.
  • gen.parameters.resolution = 300 rendert mit 300 DPI. Symbole, die nur für den Bildschirm gedacht sind, sind mit dem Standardwert in Ordnung, aber alles, das für einen Etikettendrucker oder Verpackungsdesign bestimmt ist, sollte mit Druckauflösung erzeugt werden, anstatt danach hochskaliert zu werden.
  • gen.save("gs1qr_test.png") schreibt ein verlustfreies PNG und bewahrt das exakte Modulmuster. Das ist bei 2D‑Symbolen wichtiger als bei 1D‑Symbolen, da ein QR‑Decoder ein Raster abtastet und unscharfe Modulgrenzen nicht toleriert.
  • read_bar_codes() gibt ein iterierbares Objekt von BarCodeResult‑Instanzen zurück, und result.code_text enthält die dekodierten Nutzdaten einschließlich aller Steuerzeichen. In einer Konsole wird das Trennzeichen überhaupt nicht angezeigt, weshalb im nächsten Abschnitt die Codepunkte untersucht werden, anstatt sich auf die ausgegebene Darstellung zu verlassen.

Lesen und Überprüfen des generierten Barcodes

Das Ausdrucken der decodierten Zeichenkette beweist, dass das Symbol lesbar ist, nicht dass es korrekt ist. Da der Gruppentrennzeichen nicht druckbar ist, sehen ein Payload mit fehlendem Trennzeichen und ein Payload mit korrektem Trennzeichen im Terminal identisch aus. Die Verifizierung muss auf Codepunkt‑Ebene erfolgen, was es auch einfach macht, sie in einer Testsuite zu prüfen.

Schritte

  1. Laden Sie das gespeicherte PNG mit BarCodeReader und DecodeType.GS1QR.
  2. Durchlaufen Sie die dekodierten Ergebnisse.
  3. Untersuchen Sie den Unicode‑Codepunkt jedes Zeichens und suchen Sie nach U+001D.
  4. Teilen Sie die Nutzlast am Trennzeichen und vergleichen Sie die Felder mit der ursprünglichen Eingabe.
from aspose.barcode.barcoderecognition import BarCodeReader, DecodeType

GROUP_SEPARATOR = "\x1d"

# Load the Barcode Image Generated Earlier
reader = BarCodeReader("gs1qr_test.png", DecodeType.GS1QR)
results = list(reader.read_bar_codes())

if not results:
    raise ValueError("No GS1QR barcode was detected in the image.")

for result in results:
    decoded = result.code_text
    print("Decoded GS1QR payload:", decoded)

# Inspect the Code Point of Every Character
    for index, char in enumerate(decoded):
        label = repr(char) if char.isprintable() else "<non-printable>"
        print(f"Char {index}: {label} (U+{ord(char):04X})")

# Confirm the Separator Survived the Round Trip
    if GROUP_SEPARATOR in decoded:
        fields = decoded.split(GROUP_SEPARATOR)
        print(f"Separator found. Payload splits into {len(fields)} field(s):")
        for field in fields:
            print("  -", field)
    else:
        print("Warning: no group separator present in the decoded payload.")

Wie es funktioniert

  • Das Konfigurieren des Readers mit DecodeType.GS1QR beschränkt die Erkennung auf diese Symbolart, was sowohl schneller als auch sicherer ist als das Scannen aller Typen, da es verhindert, dass ein fehlerhaftes Symbol als einfacher QR-Code dekodiert und stillschweigend akzeptiert wird.
  • Das Materialisieren der Ergebnisse mit list(...) vor der Überprüfung macht den leeren Fall explizit. Ein Erkennungsfehler liefert ein leeres Iterable statt einer Ausnahme, sodass eine ungeschützte for‑Schleife über einen fehlgeschlagenen Lesevorgang stillschweigend endet und Erfolg meldet.
  • Die Code‑Point‑Schleife ist die eigentliche Assertion. Das Auftreten von U+001D in der Ausgabe bestätigt, dass der Byte‑Modus funktioniert hat; das Fehlen bedeutet, dass das Trennzeichen verworfen oder umgewandelt wurde, unabhängig davon, wie sauber die ausgegebene Nutzlast aussieht.
  • Das Aufteilen bei \x1d rekonstruiert die einzelnen AI‑Felder und liefert Werte, die in einer CI‑Pipeline mit den Quelldaten verglichen werden können.

Kostenlose Lizenz erhalten

Aspose bietet eine temporäre kostenlose Lizenz, die Evaluationswasserzeichen entfernt und die volle Funktionalität für Tests freischaltet. Fordern Sie eine von der Aspose temporäre Lizenzseite.

Kostenlose zusätzliche Ressourcen

Fazit

Die encode_gs1_separator_in_byte_mode-Option ersetzt eine Kategorie manueller Byte‑Verarbeitung durch ein einzelnes Boolesches Feld. Wenn sie aktiviert ist, werden die QR‑Parameter und GS1‑Gruppentrennzeichen zusammen mit dem %‑Zeichen exakt so in das Symbol geschrieben, wie es die Spezifikation verlangt.

Dieses Tutorial behandelte die Installation, das Erzeugen eines GS1QR‑Symbols mit Byte‑Mode‑Trennzeichen und die Überprüfung des Ergebnisses auf Code‑Point‑Ebene, anstatt sich auf die Konsolenausgabe zu verlassen. Dieser Verifizierungsschritt ist der Teil, der am meisten erhalten bleiben sollte. In GS1‑Workflows ist ein Barcode, der gescannt wird, nicht dasselbe wie ein korrekter Barcode, und eine Code‑Point‑Assertion in Ihrem Test‑Suite ist das, was die beiden voneinander unterscheidet, bevor die Etiketten in die Produktion gehen.

FAQs

  1. Was bewirkt die encode_gs1_separator_in_byte_mode‑Option? Sie weist den QR‑Encoder an, das GS1‑Gruppentrennzeichen (ASCII 29) und das Zeichen % als Roh‑Byte‑Daten auszugeben, anstatt sie als strukturelle Marker zu behandeln, sodass sie im Barcode‑Payload unverändert erhalten bleiben.

  2. Benötige ich eine spezielle Lizenz, um die GS1QR‑Funktionen zu nutzen? GS1QR ist Teil der Standardbibliothek Aspose.BarCode. Sie können es ohne Lizenz evaluieren und eine kostenlose temporäre Lizenz von der Aspose-Website anfordern, um Evaluierungswasserzeichen zu entfernen.

  3. Kann ich diese Funktion mit anderen QR-Code-Typen verwenden? Nein. Das Flag gilt für den GS1QR‑Kodierungstyp. Standard‑QR‑ und Micro‑QR‑Encoder ignorieren es, weil die GS1‑Anwendungsidentifikator‑Analyse nicht für sie gilt.

  4. Ist das erzeugte Barcode-Bild verlustfrei? Das Speichern im PNG-Format, dem Standard, erzeugt ein verlustfreies Bild, das das genaue Modulmuster beibehält. Vermeiden Sie JPEG für Barcodes, da dessen Kompressionsartefakte die Modulkanten verwischen und die Leserraten verringern.

  5. Wie kann ich überprüfen, ob das Trennzeichen korrekt codiert wurde? Lese das Bild mit BarCodeReader unter Verwendung von DecodeType.GS1QR erneut ein und prüfe die Codepunkte des decodierten Strings. Ein U+001D im Payload bestätigt, dass das Gruppentrennzeichen im Byte‑Modus codiert wurde.

  6. Hat das Aktivieren des Byte‑Modus Auswirkungen auf die Größe des Barcodes? Der Byte‑Modus kann mehr Datenbits erfordern als der alphanumerische Modus, was das Symbol zu einer größeren QR‑Version führen kann. Die Bibliothek wählt automatisch die kleinste passende Version aus, sodass die Erhöhung in der Regel höchstens einen Versionsschritt beträgt.

  7. Welche Version von Aspose.BarCode hat diese Option eingeführt? Die encode_gs1_separator_in_byte_mode-Eigenschaft wurde in Aspose.BarCode for Python via .NET 26.6 hinzugefügt. Frühere Versionen erfordern eine manuelle Byte-Manipulation, um Gruppentrennzeichen einzubetten.

Weiterlesen