生成 GS1QR 条形码很简单,直到负载包含组分隔符。那个单一的不可打印字符,ASCII 29,告诉扫描仪可变长度的应用标识符字段在哪里结束。开发人员通过手动字节组装、定制编码器或负载拆分来规避它,而每种变通方法都存在生成能够扫描但无法解析的符号的风险。

Aspose.BarCode for Python via .NET 26.6 通过一个标志消除了该问题。encode_gs1_separator_in_byte_mode 属性强制 QR 编码器将 GS1 组分隔符和 % 字符写入原始字节,从而保留精确的 GS1 结构。本教程涵盖了 python-net 中完整的条形码生成和识别工作流:安装 SDK、生成符合规范的 GS1QR 符号,以及在代码点级别验证分隔符在往返过程中是否被保留。

为什么字节模式 GS1 分隔符对 GS1QR 条码重要

GS1QR 是供应链、医疗保健和零售领域首选的二维载体,在这种情况下,单个符号必须在一个结构化负载中包含产品标识符、批号、有效期和序列号。GS1 应用标识符语法使此成为可能,但它依赖于组分隔符来分隔长度不固定的字段。

考虑一个负载,将 AI (10) 用于批号,AI (21) 用于序列号。两者都是可变长度的,因此扫描仪需要在它们之间设置明确的分界。若没有正确编码的分隔符,下游系统会将其读取为一个连接的字符串,而不是两个字段。条形码虽然成功扫描,却仍然传递错误的数据,这是最糟糕的故障类型,因为扫描事件中没有任何信号指示问题。

字节模式编码在源头解决了这个问题。编码器停止将分隔符解释为结构标记,而是将其原样写入数据段。对 Python 开发者而言,实际收益是直接的:

  • Compliance. 发出的符号符合 GS1 通用规范,而不是对其进行近似。
  • Simpler code. 无需手动字节组装,无需自定义编码器子类,无需后处理步骤。
  • Testability. 通过在单元测试中断言解码后的代码点,可以验证往返过程。

使用 Aspose.BarCode for Python 生成 GS1QR 条码

Aspose.BarCode for Python via .NET 提供了用于条形码生成和识别的高级 API。请从 PyPI 安装它:

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

两个类承担了大部分工作。BarcodeGenerator,来自 aspose.barcode.generation,用于构建和渲染符号。BarCodeReader,来自 aspose.barcode.barcoderecognition,用于解码它们。生成设置通过生成器实例上的参数树访问,特定符号的选项(例如 QR 设置)位于 parameters.barcode.qr 下。

参考材料可在产品页面文档站点API 参考获取。

如果您有许可证文件,请在应用程序启动时一次性应用它,在进行任何生成或识别调用之前:

from aspose.barcode import License

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

生成带字节模式分隔符的 GS1QR 条码

  1. 导入所需的类型 - BarcodeGeneratorEncodeTypes 用于生成,BarCodeReaderDecodeType 用于验证。
  2. 实例化 BarcodeGenerator,使用 EncodeTypes.GS1QR 和 GS1 负载字符串。括号表示 AI 部分,例如 (10)ASPOSE2001(21)ASPOSE2026
  3. 通过将 gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True 设置为 True 来启用字节模式分隔符编码。
  4. 设置输出分辨率,以便渲染的符号既可用于打印,也可用于屏幕显示。
  5. 将图像保存为无损格式,然后读取回去以确认编码。

以下示例演示了完整的工作流:

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)

工作原理

  • BarcodeGenerator(EncodeTypes.GS1QR, "(10)ASPOSE2001(21)ASPOSE2026") 创建一个针对 GS1QR 符号的生成器。负载使用 GS1 语法,其中 (10) 是批次或批号 AI,(21) 是序列号 AI。库会解析带括号的形式并插入规范要求的分隔符。
  • gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True 启用在 26.6 中引入的选项。启用后,编码器在数据段中将组分隔符和 % 作为原始字节写入,而不是进行解释。
  • gen.parameters.resolution = 300 以 300 DPI 渲染。仅在屏幕显示的符号在默认情况下可以接受,但任何用于标签打印机或包装艺术的内容都应在打印分辨率下生成,而不是事后放大。
  • gen.save("gs1qr_test.png") 写入无损 PNG,保留精确的模块图案。这对 2D 符号比对 1D 符号更重要,因为 QR 解码器对网格进行采样,对模糊的模块边界非常挑剔。
  • read_bar_codes() 返回一个可迭代的 BarCodeResult 对象集合,result.code_text 包含已解码的负载,包括任何控制字符。在控制台中,分隔符渲染为空,这正是下一节检查代码点而不是信任打印输出的原因。

读取并验证生成的条形码

打印解码后的字符串可以证明该符号是可读的,而不是它是正确的。由于组分隔符是不可打印的,缺少分隔符的负载和带有正确分隔符的负载在终端中看起来是相同的。验证必须在代码点层面进行,这也使得在测试套件中进行断言变得直接。

步骤

  1. 使用 BarCodeReaderDecodeType.GS1QR 加载已保存的 PNG。
  2. 遍历解码结果。
  3. 检查每个字符的 Unicode 代码点,查找 U+001D
  4. 在分隔符处拆分负载,并将各字段与原始输入进行比较。
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.")

工作原理

  • 使用 DecodeType.GS1QR 配置读取器会将识别限制在该符号集上,这比扫描所有类型更快且更安全,因为它可以防止将畸形符号解码为普通 QR 并悄悄通过。
  • 在检查之前使用 list(...) 将结果具体化可以明确空情况。识别失败会返回一个空的可迭代对象而不是抛异常,因此对失败读取的未加防护的 for 循环会静默完成并报告成功。
  • 代码点循环才是实际的断言。在输出中看到 U+001D 表明字节模式工作正常;如果没有,则说明分隔符被丢弃或转换,无论打印的负载看起来多么干净。
  • \x1d 上进行分割可以重建各个 AI 字段,得到的值可以在 CI 流水线中与源数据进行比较。

获取免费许可证

Aspose 提供临时免费许可证,可去除评估水印并解锁全部功能以进行测试。可从 Aspose 临时许可证页面 请求一个。

免费附加资源

结论

encode_gs1_separator_in_byte_mode 选项用单个布尔值取代了一类手动字节处理。将其设置在 QR 参数上后,GS1 组分隔符以及 % 字符将严格按照规范写入符号中。

本教程涵盖了安装、使用字节模式分隔符生成 GS1QR 符号,以及在代码点层面验证结果,而不是仅仅信任控制台输出。该验证步骤是最值得保留的部分。在 GS1 工作流中,能够扫描的条码并不等同于正确的条码,而在测试套件中的代码点断言能够在标签投产前区分两者。

常见问题

  1. encode_gs1_separator_in_byte_mode 选项的作用是什么? 它指示 QR 编码器将 GS1 组分隔符(ASCII 29)和 % 字符作为原始字节数据输出,而不是将它们视为结构标记,从而在条形码负载中保持完整。

  2. 我需要特殊许可证才能使用 GS1QR 功能吗? GS1QR 是标准 Aspose.BarCode 库的一部分。您可以在没有许可证的情况下进行评估,并可从 Aspose 网站请求免费临时许可证以去除评估水印。

  3. 我可以将此功能用于其他 QR 码类型吗? 不。此标志仅适用于 GS1QR 编码类型。标准 QR 和 Micro QR 编码器会忽略它,因为 GS1 应用标识符解析不适用于它们。

  4. 生成的条形码图像是无损的吗? 保存为 PNG(默认),会生成无损图像,保留精确的模块模式。避免使用 JPEG,因为其压缩伪影会模糊模块边缘并降低读取率。

  5. 如何验证分隔符已正确编码?
    使用 BarCodeReader 并指定 DecodeType.GS1QR 读取图像,然后检查解码字符串的代码点。负载中的 U+001D 表明组分隔符已以字节模式编码。

  6. 启用字节模式会影响条码大小吗? 字节模式可能需要比字母数字模式更多的数据位,这可能会将符号推至更大的 QR 版本。库会自动选择最小的适配版本,因此增加通常最多只会是一个版本的步长。

  7. 哪个版本的 Aspose.BarCode 引入了此选项? encode_gs1_separator_in_byte_mode 属性在 Aspose.BarCode for Python via .NET 26.6 中添加。早期版本需要手动字节操作来嵌入组分隔符。

阅读更多