Generare un codice a barre GS1QR è semplice finché il payload non contiene un Group Separator. Quel singolo carattere non stampabile, ASCII 29, è ciò che indica a uno scanner dove termina un campo di Application Identifier a lunghezza variabile. Gli sviluppatori hanno aggirato il problema con l’assemblaggio manuale dei byte, encoder personalizzati o la suddivisione del payload, e ogni soluzione alternativa comportava il rischio di produrre simboli che vengono letti ma non vengono analizzati.
Aspose.BarCode for Python via .NET 26.6 risolve quel problema con un’unica opzione. La proprietà encode_gs1_separator_in_byte_mode costringe l’encoder QR a scrivere i separatori di gruppo GS1 e il carattere % come byte grezzi, preservando la struttura GS1 esatta. Questo tutorial copre l’intero flusso di lavoro di generazione e riconoscimento di codici a barre in python-net: installazione dell’SDK, generazione di un simbolo GS1QR conforme e verifica a livello di punto di codice che il separatore sia sopravvissuto al ciclo completo.
Perché i separatori GS1 in modalità byte sono importanti per i codici a barre GS1QR
GS1QR è il supporto bidimensionale preferito nella catena di approvvigionamento, nella sanità e nel retail, dove un unico simbolo deve contenere un identificatore di prodotto, il numero di lotto, la data di scadenza e il numero di serie in un unico payload strutturato. La sintassi dell’Identificatore di Applicazione GS1 rende possibile ciò, ma dipende dal separatore di gruppo per delimitare i campi la cui lunghezza non è fissa.
Considera un payload che combina AI (10) per il numero di lotto e AI (21) per il numero di serie. Entrambi hanno lunghezza variabile, quindi lo scanner necessita di un confine esplicito tra di essi. Senza un separatore codificato correttamente, un sistema a valle legge una stringa concatenata anziché due campi. Il codice a barre viene scansionato correttamente ma restituisce comunque dati errati, il tipo di errore più grave, perché nulla nell’evento di scansione segnala il problema.
La codifica in modalità byte risolve questo alla sorgente. Il codificatore smette di interpretare il separatore come un marcatore strutturale e lo scrive letteralmente nel segmento dati. I vantaggi pratici per gli sviluppatori Python sono diretti:
- Conformità. Il simbolo emesso corrisponde alle Specifiche Generali GS1 piuttosto che approssimarle.
- Codice più semplice. Nessun assemblaggio manuale di byte, nessuna sottoclasse di codificatore personalizzata, nessun passaggio di post-elaborazione.
- Testabilità. Il round trip è verificabile in un test unitario asserendo sui punti di codice decodificati.
Generazione di codici a barre GS1QR usando Aspose.BarCode per Python
Aspose.BarCode for Python via .NET fornisce un’API di alto livello sia per la generazione che per il riconoscimento dei codici a barre. Installalo da PyPI:
pip install aspose-barcode-for-python-via-net
Due classi svolgono la maggior parte del lavoro. BarcodeGenerator, da aspose.barcode.generation, crea e rende i simboli. BarCodeReader, da aspose.barcode.barcoderecognition, li decodifica. Le impostazioni di generazione sono raggiungibili tramite un albero di parametri sull’istanza del generatore, dove le opzioni specifiche della simbologia, come le impostazioni QR, si trovano sotto parameters.barcode.qr.
Il materiale di riferimento è disponibile sulla pagina del prodotto, sul sito della documentazione, e sul riferimento API.
Se hai un file di licenza, applicalo una sola volta all’avvio dell’applicazione, prima di qualsiasi chiamata di generazione o riconoscimento:
from aspose.barcode import License
license = License()
license.set_license("Aspose.BarCode.Python.NET.lic")
Genera codice a barre GS1QR con separatore in modalità byte
- Importa i tipi richiesti -
BarcodeGeneratoreEncodeTypesper la generazione,BarCodeReadereDecodeTypeper la verifica. - Istanzia
BarcodeGeneratorconEncodeTypes.GS1QRe una stringa di payload GS1. Le parentesi indicano le sezioni AI, come in(10)ASPOSE2001(21)ASPOSE2026. - Abilita la codifica del separatore in modalità byte impostando
gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True. - Imposta la risoluzione di output in modo che il simbolo renderizzato sia utilizzabile sia in stampa che su schermo.
- Salva l’immagine in un formato lossless, quindi rilegila per confermare la codifica.
Il seguente esempio dimostra il flusso di lavoro completo:
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)
Come funziona
BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026")crea un generatore configurato per la simbologia GS1QR. Il payload utilizza la sintassi GS1, dove(10)è l’AI del Numero di Lotto o Batch e(21)è l’AI del Numero di Serie. La libreria analizza la forma tra parentesi e inserisce i separatori richiesti dalla specifica.gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = Trueattiva l’opzione introdotta nella versione 26.6. Con essa abilitata, l’encoder scrive il separatore di gruppo e%come byte grezzi nel segmento dati invece di interpretarli.gen.parameters.resolution = 300rende a 300 DPI. I simboli destinati solo allo schermo vanno bene con il valore predefinito, ma tutto ciò che è destinato a una stampante di etichette o a un artwork di imballaggio dovrebbe essere generato alla risoluzione di stampa anziché essere ingrandito successivamente.gen.save("gs1qr_test.png")scrive un PNG lossless, preservando il modello esatto dei moduli. Questo è più importante per i simboli 2D rispetto ai 1D, poiché un decoder QR campiona una griglia e non tollera i bordi dei moduli sfocati.read_bar_codes()restituisce un iterabile di oggettiBarCodeResult, eresult.code_textcontiene il payload decodificato includendo eventuali caratteri di controllo. In una console, il separatore non viene visualizzato, ed è proprio per questo che la sezione successiva esamina i punti di codice invece di fidarsi dell’output stampato.
Leggi e verifica il codice a barre generato
Stampare la stringa decodificata dimostra che il simbolo è leggibile, non che sia corretto. Poiché il separatore di gruppo è non stampabile, un payload con un separatore mancante e uno con un separatore corretto appaiono identici in un terminale. La verifica deve avvenire a livello di punto di codice, il che rende anche semplice asserire ciò in una suite di test.
Passaggi
- Carica il PNG salvato con
BarCodeReadereDecodeType.GS1QR. - Itera sui risultati decodificati.
- Ispeziona il punto di codice Unicode di ogni carattere, cercando
U+001D. - Dividi il payload sul separatore e confronta i campi con l’input originale.
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.")
Come funziona
- Configurare il lettore con
DecodeType.GS1QRlimita il riconoscimento a quella simbologia, il che è sia più veloce che più sicuro rispetto alla scansione di tutti i tipi, poiché impedisce che un simbolo malformato venga decodificato come QR semplice e passi silenziosamente. - Materializzare i risultati con
list(...)prima del controllo rende esplicito il caso vuoto. Un fallimento di riconoscimento restituisce un iterabile vuoto anziché sollevare un’eccezione, quindi un ciclofornon protetto su una lettura fallita termina silenziosamente e segnala successo. - Il ciclo sul code point è l’asserzione reale. Vedere
U+001Dnell’output conferma che la modalità byte ha funzionato; la sua assenza significa che il separatore è stato eliminato o trasformato, indipendentemente da quanto pulito appaia il payload stampato. - Dividere su
\x1dricostruisce i singoli campi AI, fornendoti valori che possono essere confrontati con i dati di origine in una pipeline CI.
Ottieni una licenza gratuita
Aspose offre una licenza temporanea gratuita che rimuove le filigrane di valutazione e sblocca la piena funzionalità per i test. Richiedine una dalla pagina della licenza temporanea di Aspose.
Risorse aggiuntive gratuite
Conclusione
L’opzione encode_gs1_separator_in_byte_mode sostituisce una categoria di gestione manuale dei byte con un singolo valore booleano. Impostandola nei parametri QR, i separatori di gruppo GS1, insieme al carattere %, vengono scritti nel simbolo esattamente come richiede la specifica.
Questo tutorial ha coperto l’installazione, la generazione di un simbolo GS1QR con separatori in modalità byte e la verifica del risultato a livello di punto di codice anziché fidarsi dell’output della console. Tale passaggio di verifica è la parte più importante da conservare. Nei flussi di lavoro GS1, un codice a barre che viene scansionato non è lo stesso di un codice a barre corretto, e un’asserzione a livello di punto di codice nella tua suite di test è ciò che distingue i due prima che le etichette raggiungano la produzione.
Domande frequenti
Cosa fa l’opzione encode_gs1_separator_in_byte_mode? Istruisce il codificatore QR a emettere il separatore di gruppo GS1 (ASCII 29) e il carattere
%come dati byte grezzi anziché trattarli come marcatori strutturali, così rimangono intatti nel payload del codice a barre.Devo avere una licenza speciale per utilizzare le funzionalità GS1QR? GS1QR fa parte della libreria standard Aspose.BarCode. È possibile valutarla senza licenza e richiedere una licenza temporanea gratuita dal sito web di Aspose per rimuovere le filigrane di valutazione.
Posso utilizzare questa funzionalità con altri tipi di codice QR? No. Il flag si applica al tipo di codifica GS1QR. Gli encoder QR standard e Micro QR lo ignorano, perché l’analisi dell’Identificatore di Applicazione GS1 non si applica a loro.
L’immagine del codice a barre generata è senza perdita?
Salvare in PNG, l’impostazione predefinita, produce un’immagine senza perdita che preserva il modello esatto dei moduli. Evita JPEG per i codici a barre, poiché i suoi artefatti di compressione sfocano i bordi dei moduli e riducono i tassi di lettura.Come verifico che il separatore sia stato codificato correttamente? Leggi l’immagine con
BarCodeReaderusandoDecodeType.GS1QRe ispeziona i punti di codice della stringa decodificata. UnU+001Dnel payload conferma che il separatore di gruppo è stato codificato in modalità byte.L’attivazione della modalità byte influisce sulla dimensione del codice a barre?
La modalità byte può richiedere più bit di dati rispetto alla modalità alfanumerica, il che può spingere il simbolo a una versione QR più grande. La libreria seleziona automaticamente la versione più piccola che si adatta, quindi l’aumento è di solito al massimo di un passo di versione.Quale versione di Aspose.BarCode ha introdotto questa opzione? La proprietà
encode_gs1_separator_in_byte_modeè stata aggiunta in Aspose.BarCode for Python via .NET 26.6. Le versioni precedenti richiedono la manipolazione manuale dei byte per incorporare i separatori di gruppo.
