Générer un code‑barcode GS1QR est simple jusqu’à ce que la charge utile contienne un séparateur de groupe. Ce caractère non imprimable unique, ASCII 29, indique au scanner où se termine un champ d’identifiant d’application de longueur variable. Les développeurs ont contourné ce problème en assemblant manuellement les octets, en utilisant des encodeurs personnalisés ou en divisant la charge utile, et chaque solution de contournement comportait le risque de produire des symboles qui se lisent mais ne sont pas analysés.
Aspose.BarCode for Python via .NET 26.6 supprime ce problème avec un seul indicateur. La propriété encode_gs1_separator_in_byte_mode force l’encodeur QR à écrire les séparateurs de groupe GS1 et le caractère % en tant qu’octets bruts, préservant ainsi la structure GS1 exacte. Ce tutoriel couvre le flux complet de génération et de reconnaissance de code‑barres en python‑net : installation du SDK, génération d’un symbole GS1QR conforme, et vérification au niveau du point de code que le séparateur a survécu au aller‑retour.
Pourquoi les séparateurs GS1 en mode octet sont importants pour les codes-barres GS1QR
GS1QR est le support bidimensionnel de choix dans la chaîne d’approvisionnement, les soins de santé et le commerce de détail, où un seul symbole doit contenir un identifiant de produit, un numéro de lot, une date d’expiration et un numéro de série dans une charge utile structurée. La syntaxe des Identifiants d’Application GS1 rend cela possible, mais elle dépend du séparateur de groupe pour délimiter les champs dont la longueur n’est pas fixe.
Considérez une charge utile combinant l’AI (10) pour le numéro de lot et l’AI (21) pour le numéro de série. Les deux sont de longueur variable, de sorte que le scanner a besoin d’une frontière explicite entre eux. Sans séparateur correctement encodé, un système en aval lit une chaîne concaténée au lieu de deux champs. Le code‑barres est scanné avec succès et délivre néanmoins des données erronées, le pire type d’échec, car rien dans l’événement de scan ne signale le problème.
L’encodage en mode octet résout ce problème à la source. L’encodeur cesse d’interpréter le séparateur comme un marqueur structurel et l’écrit littéralement dans le segment de données. Les avantages pratiques pour les développeurs Python sont directs :
- Conformité. Le symbole émis correspond aux spécifications générales GS1 au lieu de les approximativer.
- Code plus simple. Aucun assemblage manuel d’octets, aucune sous‑classe d’encodeur personnalisée, aucun passage de post‑traitement.
- Testabilité. Le cycle complet est vérifiable dans un test unitaire en affirmant les points de code décodés.
Génération de codes-barres GS1QR à l’aide d’Aspose.BarCode for Python
Aspose.BarCode for Python via .NET fournit une API de haut niveau pour la génération et la reconnaissance de codes-barres. Installez‑le depuis PyPI :
pip install aspose-barcode-for-python-via-net
Deux classes assurent la majeure partie du travail. BarcodeGenerator, provenant de aspose.barcode.generation, crée et rend les symboles. BarCodeReader, provenant de aspose.barcode.barcoderecognition, les décode. Les paramètres de génération sont accessibles via un arbre de paramètres sur l’instance du générateur, où les options spécifiques à la symbologie, comme les paramètres QR, se trouvent sous parameters.barcode.qr.
Le matériel de référence est disponible sur la page produit, le site de documentation, et la référence API.
Si vous avez un fichier de licence, appliquez‑le une fois au démarrage de l’application, avant tout appel de génération ou de reconnaissance :
from aspose.barcode import License
license = License()
license.set_license("Aspense.BarCode.Python.NET.lic")
Générer un code-barres GS1QR avec séparateur en mode octet
- Importer les types requis -
BarcodeGeneratoretEncodeTypespour la génération,BarCodeReaderetDecodeTypepour la vérification. - Instancier
BarcodeGeneratoravecEncodeTypes.GS1QRet une chaîne de charge utile GS1. Les parenthèses indiquent les sections AI, comme dans(10)ASPOSE2001(21)ASPOSE2026. - Activer l’encodage du séparateur en mode octet en définissant
gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True. - Définir la résolution de sortie afin que le symbole rendu soit utilisable à l’impression ainsi qu’à l’écran.
- Enregistrer l’image dans un format sans perte, puis la relire pour confirmer l’encodage.
L’exemple suivant montre le flux de travail complet :
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)
Comment ça fonctionne
BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026")crée un générateur configuré pour la symbologie GS1QR. La charge utile utilise la syntaxe GS1, où(10)est l’AI du numéro de lot ou de batch et(21)est l’AI du numéro de série. La bibliothèque analyse la forme entre parenthèses et insère les séparateurs requis par la spécification.gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = Trueactive l’option introduite dans la version 26.6. Lorsqu’elle est activée, l’encodeur écrit le séparateur de groupe et%en tant qu’octets bruts dans le segment de données au lieu de les interpréter.gen.parameters.resolution = 300rend à 300 DPI. Les symboles destinés uniquement à l’écran sont corrects avec la valeur par défaut, mais tout ce qui est destiné à une imprimante d’étiquettes ou à un artwork d’emballage doit être généré à la résolution d’impression plutôt que d’être agrandi par la suite.gen.save("gs1qr_test.png")écrit un PNG sans perte, préservant le motif exact des modules. Cela est plus important pour les symboles 2D que pour les 1D, car un décodeur QR échantillonne une grille et ne tolère pas les frontières de modules floues.read_bar_codes()renvoie un itérable d’objetsBarCodeResult, etresult.code_textcontient la charge utile décodée incluant les caractères de contrôle. Dans une console, le séparateur ne s’affiche pas du tout, ce qui explique exactement pourquoi la section suivante examine les points de code au lieu de se fier à la sortie imprimée.
Lire et vérifier le code-barres généré
L’affichage de la chaîne décodée prouve que le symbole est lisible, pas qu’il est correct. Comme le séparateur de groupe n’est pas imprimable, une charge utile avec un séparateur manquant et une autre avec un séparateur correct apparaissent identiques dans un terminal. La vérification doit se faire au niveau du point de code, ce qui facilite également son assertion dans une suite de tests.
Étapes
- Chargez le PNG enregistré avec
BarCodeReaderetDecodeType.GS1QR. - Parcourez les résultats décodés.
- Examinez le point de code Unicode de chaque caractère, à la recherche de
U+001D. - Divisez la charge utile sur le séparateur et comparez les champs avec l’entrée d’origine.
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.")
Comment cela fonctionne
- Configurer le lecteur avec
DecodeType.GS1QRrestreint la reconnaissance à cette symbologie, ce qui est à la fois plus rapide et plus sûr que de scanner tous les types, car cela empêche un symbole malformé d’être décodé comme un QR simple et de passer inaperçu. - Matérialiser les résultats avec
list(...)avant la vérification rend le cas vide explicite. Un échec de reconnaissance renvoie un itérable vide plutôt que de lever une exception, ainsi une bouclefornon protégée sur une lecture échouée se termine silencieusement et signale le succès. - La boucle sur les points de code constitue l’assertion réelle. Voir
U+001Ddans la sortie confirme que le mode octet a fonctionné ; son absence signifie que le séparateur a été supprimé ou transformé, quel que soit l’aspect propre de la charge utile imprimée. - Diviser sur
\x1dreconstruit les champs AI individuels, vous donnant des valeurs qui peuvent être comparées aux données sources dans une chaîne CI.
Obtenez une licence gratuite
Aspose propose une licence temporaire gratuite qui supprime les filigranes d’évaluation et débloque toutes les fonctionnalités pour les tests. Demandez‑en une sur la page de licence temporaire Aspose.
Ressources supplémentaires gratuites
Conclusion
L’option encode_gs1_separator_in_byte_mode remplace une catégorie de gestion manuelle des octets par un seul booléen. Lorsqu’elle est activée dans les paramètres QR, les séparateurs de groupe GS1, ainsi que le caractère %, sont écrits dans le symbole exactement comme le spécifie la norme.
Ce tutoriel a couvert l’installation, la génération d’un symbole GS1QR avec des séparateurs en mode octet, et la vérification du résultat au niveau des points de code plutôt que de se fier à la sortie de la console. Cette étape de vérification est la partie la plus précieuse à conserver. Dans les flux de travail GS1, un code‑barres qui se lit n’est pas le même qu’un code‑barres correct, et une assertion au niveau des points de code dans votre suite de tests est ce qui permet de les différencier avant que les étiquettes n’atteignent la production.
FAQs
Que fait l’option encode_gs1_separator_in_byte_mode ? Elle indique à l’encodeur QR d’émettre le séparateur de groupe GS1 (ASCII 29) et le caractère
%en tant que données brutes plutôt que de les traiter comme des marqueurs structurels, afin qu’ils restent intacts dans la charge utile du code‑barres.Ai‑je besoin d’une licence spéciale pour utiliser les fonctionnalités GS1QR ? GS1QR fait partie de la bibliothèque standard Aspose.BarCode. Vous pouvez l’évaluer sans licence et demander une licence temporaire gratuite sur le site Web d’Aspose pour supprimer les filigranes d’évaluation.
Puis-je utiliser cette fonctionnalité avec d’autres types de codes QR ? Non. Le drapeau s’applique au type d’encodage GS1QR. Les encodeurs QR standard et Micro QR l’ignorent, car l’analyse de l’Identifiant d’Application GS1 ne s’applique pas à eux.
L’image de code-barres générée est-elle sans perte ? En enregistrant au format PNG, qui est le défaut, on obtient une image sans perte qui préserve le motif exact des modules. Évitez le JPEG pour les codes-barres, car ses artefacts de compression floutent les bords des modules et réduisent les taux de lecture.
Comment vérifier que le séparateur a été encodé correctement ? Lisez l’image à nouveau avec
BarCodeReaderen utilisantDecodeType.GS1QRet inspectez les points de code de la chaîne décodée. UnU+001Ddans la charge utile confirme que le séparateur de groupe a été encodé en mode octet.L’activation du mode octet affecte-t-elle la taille du code-barres ? Le mode octet peut nécessiter plus de bits de données que le mode alphanumérique, ce qui peut pousser le symbole vers une version QR plus grande. La bibliothèque sélectionne automatiquement la plus petite version qui convient, de sorte que l’augmentation est généralement d’au plus un pas de version.
Quelle version d’Aspose.BarCode a introduit cette option ?
La propriétéencode_gs1_separator_in_byte_modea été ajoutée dans Aspose.BarCode for Python via .NET 26.6. Les versions antérieures nécessitent une manipulation manuelle des octets pour intégrer les séparateurs de groupe.
