Generar un código de barras GS1QR es sencillo hasta que la carga útil contiene un Separador de Grupo. Ese único carácter no imprimible, ASCII 29, es lo que indica a un escáner dónde termina un campo de Identificador de Aplicación de longitud variable. Los desarrolladores lo solucionaron mediante ensamblaje manual de bytes, codificadores personalizados o división de la carga útil, y cada solución alternativa conllevaba el riesgo de producir símbolos que se escanean pero no se analizan.

Aspose.BarCode for Python via .NET 26.6 elimina ese problema con una única bandera. La propiedad encode_gs1_separator_in_byte_mode obliga al codificador QR a escribir los separadores de grupo GS1 y el carácter % como bytes sin procesar, preservando la estructura exacta de GS1. Este tutorial cubre el flujo de trabajo completo de generación y reconocimiento de códigos de barras en python-net: instalación del SDK, generación de un símbolo GS1QR compatible y verificación a nivel de punto de código de que el separador sobrevivió al proceso de ida y vuelta.

Por qué los separadores GS1 en modo byte son importantes para los códigos de barras GS1QR

GS1QR es el portador bidimensional preferido en la cadena de suministro, la atención médica y el comercio minorista, donde un solo símbolo debe contener un identificador de producto, número de lote, fecha de caducidad y número de serie en una carga útil estructurada. La sintaxis del Identificador de Aplicación GS1 hace esto posible, pero depende del Separador de Grupo para delimitar campos cuya longitud no es fija.

Considere una carga útil que combine el AI (10) para el número de lote y el AI (21) para el número de serie. Ambos son de longitud variable, por lo que el escáner necesita un delimitador explícito entre ellos. Sin un separador codificado correctamente, un sistema posterior lee una cadena concatenada en lugar de dos campos. El código de barras se escanea con éxito y aún así entrega datos incorrectos, el peor tipo de falla, porque nada en el evento de escaneo indica el problema.

La codificación en modo byte resuelve esto en la fuente. El codificador deja de interpretar el separador como un marcador estructural y lo escribe literalmente en el segmento de datos. Los beneficios prácticos para los desarrolladores de Python son directos:

  • Cumplimiento. El símbolo emitido coincide con las Especificaciones Generales de GS1 en lugar de aproximarse a ellas.
  • Código más simple. Sin ensamblaje manual de bytes, sin subclase de codificador personalizada, sin paso de post‑procesamiento.
  • Testabilidad. El viaje de ida y vuelta es verificable en una prueba unitaria mediante la afirmación de los puntos de código decodificados.

Generación de códigos de barras GS1QR usando Aspose.BarCode for Python

Aspose.BarCode for Python via .NET proporciona una API de alto nivel tanto para la generación como para el reconocimiento de códigos de barras. Instálala desde PyPI:

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

Dos clases realizan la mayor parte del trabajo. BarcodeGenerator, from aspose.barcode.generation, construye y renderiza símbolos. BarCodeReader, from aspose.barcode.barcoderecognition, los decodifica. Los ajustes de generación se acceden a través de un árbol de parámetros en la instancia del generador, donde las opciones específicas de simbología, como los ajustes de QR, se encuentran bajo parameters.barcode.qr.

El material de referencia está disponible en la página del producto, el sitio de documentación, y la referencia de la API.

Si tiene un archivo de licencia, aplíquelo una vez al iniciar la aplicación, antes de cualquier llamada de generación o reconocimiento:

from aspose.barcode import License

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

Generar código de barras GS1QR con separador de modo byte

  1. Importar los tipos requeridos - BarcodeGenerator y EncodeTypes para generación, BarCodeReader y DecodeType para verificación.
  2. Instanciar BarcodeGenerator con EncodeTypes.GS1QR y una cadena de carga útil GS1. Los paréntesis indican secciones AI, como en (10)ASPOSE2001(21)ASPOSE2026.
  3. Habilitar la codificación del separador en modo byte estableciendo gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True.
  4. Establecer la resolución de salida para que el símbolo renderizado sea utilizable tanto en impresión como en pantalla.
  5. Guardar la imagen en un formato sin pérdida, y luego leerla de nuevo para confirmar la codificación.

El siguiente ejemplo muestra el flujo de trabajo 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)

Cómo funciona

  • BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026") crea un generador configurado para la simbología GS1QR. La carga útil utiliza la sintaxis GS1, donde (10) es el AI de número de lote o lote y (21) es el AI de número de serie. La biblioteca analiza la forma entre paréntesis e inserta los separadores que la especificación requiere.
  • gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True activa la opción introducida en la versión 26.6. Con ella habilitada, el codificador escribe el separador de grupo y % como bytes sin procesar en el segmento de datos en lugar de interpretarlos.
  • gen.parameters.resolution = 300 renderiza a 300 DPI. Los símbolos solo para pantalla están bien con el valor predeterminado, pero cualquier cosa destinada a una impresora de etiquetas o a un diseño de embalaje debe generarse a resolución de impresión en lugar de ampliarse después.
  • gen.save("gs1qr_test.png") escribe un PNG sin pérdidas, preservando el patrón exacto de módulos. Esto es más importante para símbolos 2D que para 1D, porque un decodificador QR muestrea una cuadrícula y no tolera bordes de módulos borrosos.
  • read_bar_codes() devuelve un iterable de objetos BarCodeResult, y result.code_text contiene la carga útil decodificada incluyendo cualquier carácter de control. En una consola, el separador no se muestra en absoluto, lo que explica por qué la siguiente sección inspecciona los puntos de código en lugar de confiar en la salida impresa.

Leer y verificar el código de barras generado

Imprimir la cadena decodificada demuestra que el símbolo es legible, no que sea correcto. Debido a que el separador de grupo no es imprimible, una carga útil con un separador faltante y una con un separador correcto se ven idénticas en una terminal. La verificación debe realizarse a nivel de punto de código, lo que también facilita la aserción en una suite de pruebas.

Pasos

  1. Cargue el PNG guardado con BarCodeReader y DecodeType.GS1QR.
  2. Itere sobre los resultados decodificados.
  3. Inspeccione el punto de código Unicode de cada carácter, buscando U+001D.
  4. Divida la carga útil en el separador y compare los campos con la entrada original.
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.")

Cómo funciona

  • Configurar el lector con DecodeType.GS1QR restringe el reconocimiento a esa simbología, lo que es más rápido y seguro que escanear todos los tipos, ya que evita que un símbolo malformado se decodifique como QR simple y pase silenciosamente.
  • Materializar los resultados con list(...) antes de comprobarlos hace explícito el caso vacío. Un fallo de reconocimiento devuelve un iterable vacío en lugar de lanzar una excepción, por lo que un bucle for sin protección sobre una lectura fallida se completa silenciosamente y reporta éxito.
  • El bucle de puntos de código es la aserción real. Ver U+001D en la salida confirma que el modo byte funcionó; su ausencia significa que el separador se eliminó o transformó, sin importar lo limpio que parezca la carga útil impresa.
  • Dividir por \x1d reconstruye los campos AI individuales, proporcionando valores que pueden compararse con los datos de origen en una canalización CI.

Obtenga una licencia gratuita

Aspose ofrece una licencia temporal gratuita que elimina las marcas de agua de evaluación y desbloquea la funcionalidad completa para pruebas. Solicita una en la página de licencia temporal de Aspose.

Recursos Adicionales Gratuitos

Conclusión

La opción encode_gs1_separator_in_byte_mode reemplaza una categoría de manejo manual de bytes con un único booleano. Al activarla en los parámetros QR, los separadores de grupo GS1, junto con el carácter %, se escriben en el símbolo exactamente como lo requiere la especificación.

Este tutorial cubrió la instalación, la generación de un símbolo GS1QR con separadores en modo byte y la verificación del resultado a nivel de punto de código en lugar de confiar en la salida de la consola. Ese paso de verificación es la parte que más vale la pena conservar. En los flujos de trabajo GS1, un código de barras que se escanea no es lo mismo que un código de barras que es correcto, y una aserción de punto de código en su suite de pruebas es lo que diferencia a ambos antes de que las etiquetas lleguen a producción.

Preguntas frecuentes

  1. ¿Qué hace la opción encode_gs1_separator_in_byte_mode? Instruye al codificador QR a emitir el separador de grupo GS1 (ASCII 29) y el carácter % como datos de bytes sin procesar en lugar de tratarlos como marcadores estructurales, de modo que permanezcan intactos en la carga útil del código de barras.

  2. ¿Necesito una licencia especial para usar las funciones GS1QR? GS1QR es parte de la biblioteca estándar Aspose.BarCode. Puede evaluarla sin una licencia y solicitar una licencia temporal gratuita desde el sitio web de Aspose para eliminar las marcas de agua de evaluación.

  3. ¿Puedo usar esta función con otros tipos de códigos QR? No. La bandera se aplica al tipo de codificación GS1QR. Los codificadores QR estándar y Micro QR la ignoran, porque el análisis del Identificador de Aplicación GS1 no se aplica a ellos.

  4. ¿La imagen de código de barras generada es sin pérdida? Guardar en PNG, que es el predeterminado, produce una imagen sin pérdida que preserva el patrón exacto de los módulos. Evite JPEG para códigos de barras, ya que sus artefactos de compresión difuminan los bordes de los módulos y reducen las tasas de lectura.

  5. ¿Cómo verifico que el separador se haya codificado correctamente? Lee la imagen nuevamente con BarCodeReader usando DecodeType.GS1QR y examina los puntos de código de la cadena decodificada. Un U+001D en la carga útil confirma que el separador de grupo se codificó en modo byte.

  6. ¿Afecta la habilitación del modo byte al tamaño del código de barras? El modo byte puede requerir más bits de datos que el modo alfanumérico, lo que puede hacer que el símbolo pase a una versión QR más grande. La biblioteca selecciona automáticamente la versión más pequeña que cabe, por lo que el aumento suele ser como máximo un paso de versión.

  7. ¿Qué versión de Aspose.BarCode introdujo esta opción? La propiedad encode_gs1_separator_in_byte_mode se añadió en Aspose.BarCode for Python via .NET 26.6. Las versiones anteriores requieren manipulación manual de bytes para incrustar separadores de grupo.

Leer más