Generowanie kodu kreskowego GS1QR jest proste, dopóki ładunek nie zawiera separatora grupy. Ten pojedynczy znak nie drukowalny, ASCII 29, informuje skaner, gdzie kończy się pole identyfikatora aplikacji o zmiennej długości. Programiści obejśli to, ręcznie składając bajty, używając własnych enkoderów lub dzieląc ładunek, a każde obejście wiązało się z ryzykiem powstania symboli, które można zeskanować, ale nie da się ich sparsować.

Aspose.BarCode for Python via .NET 26.6 usuwa ten problem jedną flagą. Właściwość encode_gs1_separator_in_byte_mode wymusza, aby enkoder QR zapisywał separatory grup GS1 oraz znak % jako surowe bajty, zachowując dokładną strukturę GS1. Ten tutorial opisuje kompletny przepływ pracy generowania i rozpoznawania kodów kreskowych w python‑net: instalację SDK, generowanie zgodnego symbolu GS1QR oraz weryfikację na poziomie punktu kodowego, że separator przetrwał pełny cykl.

Dlaczego separatory GS1 w trybie bajtowym mają znaczenie dla kodów kreskowych GS1QR

GS1QR jest dwuwymiarowym nośnikiem wyboru w łańcuchu dostaw, opiece zdrowotnej i handlu detalicznym, gdzie pojedynczy symbol musi zawierać identyfikator produktu, numer partii, datę ważności i numer seryjny w jednej ustrukturyzowanej ładunku. Składnia identyfikatora aplikacji GS1 umożliwia to, ale zależy od separatora grupowego do delimitacji pól o zmiennej długości.

Rozważ ładunek łączący AI (10) dla numeru partii i AI (21) dla numeru seryjnego. Oba mają zmienną długość, więc skaner potrzebuje wyraźnej granicy między nimi. Bez prawidłowo zakodowanego separatora system downstream odczytuje jeden połączony ciąg zamiast dwóch pól. Kod kreskowy skanuje się pomyślnie, ale nadal dostarcza nieprawidłowe dane – najgorszy rodzaj awarii, ponieważ nic w zdarzeniu skanowania nie sygnalizuje problemu.

Kodowanie w trybie bajtowym rozwiązuje ten problem u źródła. Enkoder przestaje interpretować separator jako znacznik strukturalny i zapisuje go dosłownie w segmencie danych. Praktyczne korzyści dla programistów Pythona są bezpośrednie:

  • Zgodność. Emitowany symbol odpowiada ogólnym specyfikacjom GS1, a nie ich przybliżeniom.
  • Prostszy kod. Brak ręcznego składania bajtów, brak własnej podklasy enkodera, brak etapu przetwarzania końcowego.
  • Testowalność. Przejście w dwie strony jest weryfikowalne w teście jednostkowym poprzez asercję na zdekodowanych punktach kodowych.

Generowanie kodów kreskowych GS1QR przy użyciu Aspose.BarCode for Python

Aspose.BarCode for Python via .NET zapewnia wysokopoziomowe API zarówno do generowania kodów kreskowych, jak i ich rozpoznawania. Zainstaluj go z PyPI:

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

Dwie klasy wykonują większość pracy. BarcodeGenerator, z aspose.barcode.generation, tworzy i renderuje symbole. BarCodeReader, z aspose.barcode.barcoderecognition, je odczytuje. Ustawienia generacji są dostępne poprzez drzewo parametrów na instancji generatora, gdzie opcje specyficzne dla symbologii, takie jak ustawienia QR, znajdują się pod parameters.barcode.qr.

Materiały referencyjne są dostępne na stronie produktu, w witrynie dokumentacji, oraz w referencji API.

Jeśli masz plik licencji, zastosuj go raz przy uruchamianiu aplikacji, przed jakimkolwiek wywołaniem generowania lub rozpoznawania:

from aspose.barcode import License

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

Generuj kod kreskowy GS1QR z separatorem w trybie bajtowym

  1. Zaimportuj wymagane typy - BarcodeGenerator i EncodeTypes do generowania, BarCodeReader i DecodeType do weryfikacji.
  2. Utwórz instancję BarcodeGenerator z EncodeTypes.GS1QR i ciągiem ładunku GS1. Nawiasy oznaczają sekcje AI, jak w (10)ASPOSE2001(21)ASPOSE2026.
  3. Włącz kodowanie separatora w trybie bajtowym ustawiając gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True.
  4. Ustaw rozdzielczość wyjściową, aby wygenerowany symbol był użyteczny zarówno w druku, jak i na ekranie.
  5. Zapisz obraz w formacie bezstratnym, a następnie odczytaj go ponownie, aby potwierdzić kodowanie.

Poniższy przykład demonstruje kompletny przepływ pracy:

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)

Jak to działa

  • BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026") tworzy generator skonfigurowany dla symboliki GS1QR. Ładunek używa składni GS1, gdzie (10) jest identyfikatorem partii lub numerem partii AI, a (21) jest identyfikatorem numeru seryjnego AI. Biblioteka parsuje formę w nawiasach i wstawia separatory wymagane przez specyfikację.
  • gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True aktywuje opcję wprowadzoną w wersji 26.6. Po włączeniu enkoder zapisuje separator grupy oraz % jako surowe bajty w segmencie danych, zamiast je interpretować.
  • gen.parameters.resolution = 300 renderuje przy 300 DPI. Symbole przeznaczone wyłącznie do wyświetlania na ekranie są w porządku w ustawieniu domyślnym, ale wszystko, co ma trafić na drukarkę etykiet lub grafikę opakowania, powinno być generowane w rozdzielczości druku, a nie skalowane w późniejszym etapie.
  • gen.save("gs1qr_test.png") zapisuje bezstratny PNG, zachowując dokładny wzór modułów. Ma to większe znaczenie dla symboli 2D niż 1D, ponieważ dekoder QR próbuje próbki siatki i nie toleruje rozmytych granic modułów.
  • read_bar_codes() zwraca iterowalny obiekt BarCodeResult, a result.code_text zawiera zdekodowany ładunek, w tym wszelkie znaki kontrolne. W konsoli separator nie jest wyświetlany, co jest dokładnie powodem, dla którego w następnym rozdziale analizowane są punkty kodowe zamiast polegać na wyświetlonym wyniku.

Odczyt i weryfikacja wygenerowanego kodu kreskowego

Wydrukowanie zdekodowanego ciągu dowodzi, że symbol jest czytelny, a nie że jest poprawny. Ponieważ separator grupy jest niewidoczny, ładunek z brakującym separatorem i ten z poprawnym separatorem wyglądają identycznie w terminalu. Weryfikacja musi odbywać się na poziomie punktów kodowych, co również ułatwia asercję w zestawie testów.

Kroki

  1. Wczytaj zapisany PNG przy użyciu BarCodeReader i DecodeType.GS1QR.
  2. Przejdź przez zdekodowane wyniki.
  3. Zbadaj punkt kodowy Unicode każdego znaku, szukając U+001D.
  4. Podziel ładunek na separatorze i porównaj pola z oryginalnym wejściem.
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.")

Jak to działa

  • Konfigurowanie czytnika przy użyciu DecodeType.GS1QR ogranicza rozpoznawanie do tej symbologii, co jest zarówno szybsze, jak i bezpieczniejsze niż skanowanie wszystkich typów, ponieważ zapobiega dekodowaniu uszkodzonego symbolu jako zwykłego QR i cichemu przejściu.
  • Materializacja wyników przy użyciu list(...) przed sprawdzeniem sprawia, że przypadek pusty jest jawny. Niepowodzenie rozpoznania zwraca pusty iterowalny zamiast podnosić wyjątek, więc niechroniona pętla for nad nieudaną odczytem kończy się cicho i zgłasza sukces.
  • Pętla po punktach kodowych jest rzeczywistym asercją. Widok U+001D w wyjściu potwierdza, że tryb bajtowy działał; jego brak oznacza, że separator został pominięty lub przekształcony, niezależnie od tego, jak czysty wygląda wydrukowany ładunek.
  • Podział na \x1d odtwarza poszczególne pola AI, dostarczając wartości, które można porównać z danymi źródłowymi w potoku CI.

Uzyskaj darmową licencję

Aspose oferuje tymczasową darmową licencję, która usuwa znaki wodne wersji ewaluacyjnej i odblokowuje pełną funkcjonalność do testowania. Uzyskaj ją ze strony tymczasowej licencji Aspose.

Darmowe dodatkowe zasoby

Podsumowanie

Opcja encode_gs1_separator_in_byte_mode zastępuje kategorię ręcznego przetwarzania bajtów pojedynczą wartością logiczną. Ustaw ją w parametrach QR, a separatory grup GS1, wraz ze znakiem %, są zapisywane w symbolu dokładnie tak, jak wymaga specyfikacja.

Ten samouczek obejmował instalację, generowanie symbolu GS1QR z separatorami w trybie bajtowym oraz weryfikację wyniku na poziomie punktów kodowych, zamiast polegać na wyjściu konsoli. Ten krok weryfikacji jest najcenniejszy. W przepływach pracy GS1 kod kreskowy, który jest skanowany, nie jest tym samym co kod kreskowy poprawny, a asercja punktu kodowego w Twoim zestawie testów jest tym, co odróżnia te dwa przypadki przed tym, jak etykiety trafią do produkcji.

Najczęściej zadawane pytania

  1. Do czego służy opcja encode_gs1_separator_in_byte_mode? Instrukcja nakazuje enkoderowi QR emitowanie separatora grupy GS1 (ASCII 29) oraz znaku % jako surowych danych bajtowych, zamiast traktowania ich jako znaczniki strukturalne, dzięki czemu pozostają nienaruszone w ładunku kodu kreskowego.

  2. Czy potrzebuję specjalnej licencji, aby używać funkcji GS1QR? GS1QR jest częścią standardowej biblioteki Aspose.BarCode. Możesz ją ocenić bez licencji i poprosić o bezpłatną tymczasową licencję na stronie internetowej Aspose, aby usunąć znaki wodne wersji ewaluacyjnej.

  3. Czy mogę używać tej funkcji z innymi typami kodów QR? Nie. Flaga dotyczy typu kodowania GS1QR. Standardowe kody QR i Micro QR ignorują ją, ponieważ parsowanie identyfikatora aplikacji GS1 nie ma zastosowania do nich.

  4. Czy wygenerowany obraz kodu kreskowego jest bezstratny? Zapisywanie w formacie PNG, domyślnym, tworzy bezstratny obraz, który zachowuje dokładny wzór modułów. Unikaj formatu JPEG dla kodów kreskowych, ponieważ jego artefakty kompresji rozmywają krawędzie modułów i zmniejszają wskaźniki odczytu.

  5. Jak mogę zweryfikować, że separator został zakodowany poprawnie? Odczytaj obraz ponownie przy użyciu BarCodeReader z DecodeType.GS1QR i sprawdź punkty kodowe zdekodowanego ciągu. U+001D w ładunku potwierdza, że separator grupy został zakodowany w trybie bajtowym.

  6. Czy włączenie trybu bajtowego wpływa na rozmiar kodu kreskowego? Tryb bajtowy może wymagać więcej bitów danych niż tryb alfanumeryczny, co może spowodować przejście symbolu do wyższej wersji QR. Biblioteka automatycznie wybiera najmniejszą wersję, która mieści się w danych, więc zwiększenie zazwyczaj wynosi maksymalnie jeden poziom wersji.

  7. Która wersja Aspose.BarCode wprowadziła tę opcję? Właściwość encode_gs1_separator_in_byte_mode została dodana w Aspose.BarCode for Python via .NET 26.6. Wcześniejsze wersje wymagają ręcznej manipulacji bajtami w celu osadzenia separatorów grupowych.

Czytaj więcej