Генерация штрих‑кода 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) для серийного номера. Оба являются переменной длины, поэтому сканеру требуется явный разделитель между ними. Без правильно закодированного разделителя downstream system считывает одну объединённую строку вместо двух полей. Штрих‑код сканируется успешно, но всё равно передаёт неверные dat, что является худшим типом сбоя, поскольку в событии сканирования нет сигнала о проблеме.
Кодирование в байтовом режиме решает эту проблему на уровне источника. Кодировщик перестаёт интерпретировать разделитель как структурный маркер и записывает его дословно в сегмент данных. Практические преимущества для разработчиков Python очевидны:
- Соответствие. Сгенерированный символ соответствует общим спецификациям GS1, а не приближается к ним.
- Более простой код. Нет ручной сборки байтов, нет пользовательского подкласса кодировщика, нет прохода постобработки.
- Тестируемость. Обратный процесс можно проверить в модульном тесте, делая утверждения о декодированных кодовых точках.
Создание GS1QR штрихкодов с использованием Aspose.BarCode for Python
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("Aspose.BarCode.Python.NET.lic")
Создать штрих‑код GS1QR с разделителем в байтовом режиме
- Импортировать необходимые типы -
BarcodeGeneratorиEncodeTypesдля генерации,BarCodeReaderиDecodeTypeдля проверки. - Создать экземпляр
BarcodeGeneratorсEncodeTypes.GS1QRи строкой полезной нагрузки GS1. Скобки обозначают секции AI, как в(10)ASPOSE2001(21)ASPOSE2026. - Включить кодирование разделителя в байтовом режиме установив
gen.parameters.barcode.qr.encode_gs1_separator_in_byte_mode = True. - Установить разрешение вывода, чтобы отрисованный символ был пригоден как для печати, так и для экрана.
- Сохранить изображение в без потерь формат, затем прочитать его обратно, чтобы подтвердить кодирование.
Следующий пример демонстрирует полный рабочий процесс:
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содержит декодированные данные, включая любые управляющие символы. В консоли разделитель отображается как пустая строка, именно поэтому в следующем разделе рассматриваются кодовые точки вместо доверия к печатному выводу.
Чтение и проверка сгенерированного штрих‑кода
Печать декодированной строки доказывает, что символ читаем, а не то, что он правильный. Поскольку разделитель группы непечатаемый, полезная нагрузка с отсутствующим разделителем и с правильным разделителем выглядят одинаково в терминале. Проверка должна происходить на уровне кодовых точек, что также упрощает утверждение в наборе тестов.
Шаги
- Загрузите сохранённый PNG с помощью
BarCodeReaderиDecodeType.GS1QR. - Итерируйте результаты декодирования.
- Проверьте кодовую точку Unicode каждого символа, ищя
U+001D. - Разделите полезную нагрузку по разделителю и сравните поля с исходным вводом.
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 сканируемый штрих‑код не всегда является корректным, и утверждение о кодовых точках в вашем наборе тестов позволяет отличить их друг от друга до того, как этикетки попадут в производство.
FAQs
Что делает параметр encode_gs1_separator_in_byte_mode? Он инструктирует QR‑энкодер выводить разделитель группы GS1 (ASCII 29) и символ
%как необработанные байтовые данные, а не рассматривать их как структурные маркеры, чтобы они сохранялись в неизменном виде в полезной нагрузке штрихкода.Нужна ли специальная лицензия для использования функций GS1QR? GS1QR является частью стандартной библиотеки Aspose.BarCode. Вы можете оценить её без лицензии и запросить бесплатную временную лицензию на сайте Aspose, чтобы удалить водяные знаки оценки.
Могу ли я использовать эту функцию с другими типами QR‑кода? Нет. Флаг применяется к типу кодирования GS1QR. Стандартные QR и Micro QR кодировщики игнорируют его, поскольку разбор GS1 Application Identifier к ним не относится.
Сгенерированное изображение штрихкода без потерь? Сохранение в PNG (по умолчанию) создает безпотерное изображение, сохраняющее точный шаблон модулей. Избегайте JPEG для штрихкодов, так как артефакты сжатия размывают границы модулей и снижают коэффициент считывания.
Как проверить, что разделитель был закодирован правильно? Считайте изображение обратно с помощью
BarCodeReader, используяDecodeType.GS1QR, и проверьте кодовые точки декодированной строки.U+001Dв полезной нагрузке подтверждает, что разделитель группы был закодирован в байтовом режиме.Влияет ли включение байтового режима на размер штрихкода? Байтовый режим может требовать больше бит данных, чем альфа‑цифровый режим, что может привести к переходу символа на более крупную версию QR. Библиотека автоматически выбирает наименьшую подходящую версию, поэтому увеличение обычно составляет не более одного шага версии.
Какая версия Aspose.BarCode ввела эту опцию? Свойство
encode_gs1_separator_in_byte_modeбыло добавлено в Aspose.BarCode for Python via .NET 26.6. Более ранние версии требуют ручного манипулирования байтами для встраивания разделителей группы.
