Как лучше сформировать изображение GS1 DataMatrix с функциональными знаками?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: есть массив кодов в текстовом варианте, необходимо сформировать графическое изображение. Проблема заключается в том, что никак не получается корректно вставить функциональный знак FNC1.
Как указано тут:https://www.cleverence.ru/support/77127/По вводным: функциональный знак FNC1 - это байт со значением 232.
Попроверял сделать добавление байта так:

for code in codes: code_bytes = bytes(code, "utf-8") # Если первый байт не FNC1 (0xE8), добавляем if not code_bytes.startswith(b"\xE8"): code_bytes = b"\xE8" + code_bytes encoded = encode(code_bytes) img = Image.frombytes("RGB", (encoded.width, encoded.height), encoded.pixels) buf = BytesIO() img.save(buf, format="PNG") buf.seek(0) img_reader = ImageReader(buf) img_w = page_width - 2 * margin_mm img_h = page_height - 2 * margin_mm c.drawImage(img_reader, margin_mm, margin_mm, width=img_w, height=img_h) c.showPage()

Используемые библиотеки

import json from tkinter import Tk, Label, Entry, Button, filedialog, messagebox from pylibdmtx.pylibdmtx import encode from PIL import Image from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import mm from reportlab.lib.utils import ImageReader from io import BytesIO from os.path import basename, splitext

Коды в таком формате:

"0104603757310758215!&QFA\u001D93gqwy", "0104603757310758215!aa-\"\u001D93Y2wD", "0104603757310758215!bUoo\u001D93isPA", .......

Сейчас ситуация такая: но при сканировании в коде первым символом идет не FNC1, а è
Сейчас ситуация такая: поиск по интернету ничего не дал

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

В GS1 DataMatrix функциональный знак FNC1 не вставляется как обычный видимый символ. В текстовом представлении часто используют GS-разделитель ASCII 29, а при кодировании DataMatrix библиотека должна понимать GS1 mode/FNC1. Если просто вставить строку “FNC1”, сканер получит буквы, а не служебный символ.

Для GS1 обычно строка строится из AI-кодов. Например:

(01)04601234567890(21)ABC123(17)260101

(01)04601234567890(21)ABC123(17)260101

Внутри кода скобки не кодируются, они только для человека. После переменной длины, например AI 21, если дальше идёт другой AI, нужен group separator ASCII 29.

В Python важно выбрать библиотеку, которая поддерживает GS1 DataMatrix. Не каждая библиотека DataMatrix умеет FNC1. Если библиотека поддерживает GS1 mode, включайте именно его. Если нет — ищите способ передать ASCII 29:

gs = chr(29)
data = "010460123456789021ABC123" + gs + "17260101"

gs = chr(29) data = "010460123456789021ABC123" + gs + "17260101"

Но этого может быть недостаточно, если библиотека не ставит FNC1 в начало символа. Сканер может распознать DataMatrix как обычный, а не GS1.

Проверьте результат не только визуально, а реальным сканером или валидатором GS1. В выводе должны корректно распознаваться AI, а не просто строка с символами.

Если используете pylibdmtx/treepoem/zint, посмотрите поддержку GS1. Zint, например, умеет GS1 DataMatrix и часто проще для таких задач, чем универсальные генераторы.

Итог: FNC1 — это режим/служебный знак, а не текст. Используйте библиотеку с поддержкой GS1 DataMatrix, передавайте данные без человекочитаемых скобок и ставьте ASCII 29 после переменных AI там, где это нужно стандартом.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно