Задача автоматического распознавания DataMatrix кодов непосредственно из PDF-файлов без применения физического сканера или даже камеры мобильного телефона, а силами системы 1С, является весьма актуальной для многих компаний, работающих с маркированной продукцией, например, с шинами. Это позволяет значительно упростить и ускорить процессы приемки, инвентаризации и контроля товаров, устраняя необходимость ручного сканирования каждого кода — ускоряет инвентаризация и сверка маркировки с Честным Знаком. Однако, данная задача не имеет простого решения "из коробки" в 1С, поскольку платформа не располагает встроенными средствами для работы с графическими данными на таком низком уровне. Рассмотрим подробнее, как мы можем подойти к решению этой непростой, но вполне выполнимой задачи.
Первоначальный вопрос, который перед нами стоит, звучит так: можно ли взять PDF-файл, содержащий изображения DataMatrix кодов маркировки, и средствами 1С извлечь из них текстовую информацию без участия внешнего оборудования? Для этой задачи есть распознавание DataMatrix кодов со сканов и PDF. На первый взгляд, это кажется сложным, но на практике существуют обходные пути и интеграционные решения. Разберем, какие подходы и идеи были высказаны при обсуждении этой проблемы.
Таким образом, мы приходим к выводу, что для успешного решения задачи нам потребуется выйти за рамки чистой функциональности 1С и использовать сторонние инструменты, интегрировав их с нашей системой.
Поскольку в 1С отсутствуют встроенные механизмы для прямого распознавания DataMatrix из изображений, мы обратимся к миру специализированных библиотек и сервисов. Эти инструменты предоставляют мощный функционал для работы с графическими данными и штрих-кодами, который мы сможем интегрировать с 1С.
libdmtx — это открытая библиотека, специально разработанная для чтения и записи DataMatrix кодов. Она доступна для различных операционных систем, включая Windows, Linux, и macOS. Для разработчиков, использующих Python, существует удобная обёртка pylibdmtx, которая позволяет обрабатывать изображения, полученные из популярных библиотек, таких как PIL/Pillow, OpenCV, или из массивов NumPy. Мы можем использовать эту связку для создания внешней обработки:
pylibdmtx распознает код.Пример гипотетического Python-скрипта для распознавания:
import cv2
from pylibdmtx.pylibdmtx import decode
def decode_datamatrix_from_image(image_path):
img = cv2.imread(image_path)
if img is None:
return "Ошибка: Не удалось загрузить изображение."
# Можно добавить предобработку изображения для улучшения распознавания
# Например, преобразование в оттенки серого, повышение контрастности
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
decoded_objects = decode(gray)
results = []
for obj in decoded_objects:
results.append(obj.data.decode('utf-8')) # Декодируем байты в строку
return results
if __name__ == '__main__':
# Предполагается, что путь к изображению будет передан как аргумент командной строки
import sys
if len(sys.argv) > 1:
path = sys.argv[1]
decoded_data = decode_datamatrix_from_image(path)
print(";".join(decoded_data)) # Выводим результаты, разделенные точкой с запятой
else:
print("Ошибка: Не указан путь к изображению.")
Данный скрипт может быть вызван из 1С с помощью метода ЗапуститьПриложение, а результат считан из стандартного вывода.
Для разработчиков, ориентированных на .NET-стек, существуют мощные коммерческие библиотеки. Среди них выделяются BarcodeLib.BarcodeReader.PDF.Code.DataMatrix, доступная через NuGet, и Aspose.BarCode for .NET. Эти библиотеки позволяют считывать DataMatrix коды напрямую из PDF-файлов. Мы можем разработать внешнюю компоненту (COM-объект или .NET-сборку с COM-Interop) на C# или другом .NET-языке, которая будет "обёртывать" функциональность этих библиотек. 1С сможет вызывать методы этой внешней компоненты, передавать ей PDF-файл и получать распознанные данные.
Преимущества: Высокая производительность, надежность, широкие возможности настройки. Недостатки: Коммерческие лицензии, необходимость разработки внешней компоненты.
ZXing — это открытая мультиформатная библиотека для обработки штрих-кодов, изначально написанная на Java, но имеющая порты на множество других языков. Она поддерживает распознавание DataMatrix и является одной из наиболее популярных библиотек для этой цели. Мы можем использовать ZXing в 1С несколькими способами:
ZXing, а затем вызывать её из 1С, передавая параметры и считывая результат.ZXing (например, ZXing.Net), которые можно использовать аналогично другим .NET библиотекам, создавая внешние компоненты.Этот API предлагает мощные возможности для сканирования штрих-кодов DataMatrix с помощью Python. Он является частью большого пакета Aspose и предоставляет гибкие настройки механизма распознавания, что позволяет нам повысить точность или скорость чтения в зависимости от требований. Для его работы потребуется Python 3.5 или более поздняя версия. Интеграция с 1С будет аналогична сценарию с pylibdmtx: вызов внешнего Python-скрипта из 1С.
Если мы не хотим устанавливать библиотеки и настраивать локальное окружение, можем рассмотреть облачные решения. GroupDocs.Parser Cloud предоставляет REST API для анализа документов и извлечения данных, включая сканирование штрих-кодов из PDF. Мы отправляем PDF-файл на облачный сервис, получаем ответ с распознанными данными. Интеграция с 1С в этом случае будет заключаться в формировании HTTP-запросов и обработке HTTP-ответов.
Преимущества: Не требует локальной установки библиотек, кроссплатформенность. Недостатки: Зависимость от интернет-соединения, потенциальные затраты на использование облачного API, вопросы конфиденциальности данных.
Прежде чем распознавать DataMatrix, нам необходимо получить его изображение из PDF-документа. DataMatrix коды в PDF обычно представлены как графические объекты. Разберем, как мы можем извлечь эти изображения:
Эти мощные инструменты могут разбирать PDF на компоненты, включая изображения. Мы можем вызывать их из 1С через командную строку, чтобы извлечь все изображения из PDF-файла. Например, GhostScript или кроссплатформенные NativeAPI компоненты могут конвертировать PDF в набор изображений (например, PNG или JPEG), из которых мы затем можем выделить интересующие нас DataMatrix коды. ImageMagick, в свою очередь, позволяет манипулировать изображениями: обрезать, масштабировать, улучшать качество перед распознаванием.
Пример команды для GhostScript (конвертация PDF в PNG):
gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r300 -sOutputFile=page_%03d.png input.pdf
Эта команда создаст отдельные PNG-файлы для каждой страницы PDF, из которых затем нужно будет извлекать именно DataMatrix коды.
Многие из упомянутых выше библиотек для распознавания штрих-кодов (например, некоторые версии Aspose) имеют встроенные функции для работы с PDF, которые могут автоматически извлекать изображения или даже непосредственно распознавать штрих-коды внутри PDF-файла без предварительного извлечения. Это самый удобный вариант, если такие функции доступны.
Для более тонкого контроля можно использовать библиотеки для программного парсинга PDF-файлов (например, Apache PDFBox для Java) или готовые внешние компоненты на базе Poppler. Они позволяют анализировать внутреннюю структуру PDF и находить графические объекты, затем извлекать их. Это требует более глубокого понимания формата PDF, но предоставляет максимальную гибкость.
После того как изображения DataMatrix извлечены (или если библиотека сама работает с PDF), мы можем передать их на распознавание в одну из упомянутых ранее специализированных библиотек.
Когда мы определились с внешней библиотекой и способом извлечения изображений, встает вопрос, как интегрировать это все с 1С. Разберем основные подходы:
Этот способ является наиболее распространенным и надежным для расширения функциональности 1С. Мы можем разработать внешнюю компоненту на языке программирования, который поддерживает работу с выбранной библиотекой (например, C# для .NET-библиотек или C++ для обертки над libdmtx). Эта компонента будет представлять собой COM-объект, который 1С сможет создавать и вызывать его методы, передавая параметры (например, путь к PDF-файлу или изображению) и получая результат.
Преимущества: Высокая степень интеграции, скорость работы, удобство использования из кода 1С. Недостатки: Требует регистрации компоненты на клиенте/сервере 1С, сложнее в разработке.
Пример вызова COM-объекта в 1С:
Попытка
// Создаем экземпляр внешней компоненты
DataMatrixReader = Новый COMОбъект("MyDataMatrixReader.Reader");
// Вызываем метод компоненты для чтения DataMatrix из PDF
ПутьКPDF = "C:\МоиДокументы\КодыМаркировки.pdf";
ТекстКодов = DataMatrixReader.ReadFromPdf(ПутьКPDF);
Для Каждого Код Из ТекстКодов Цикл
Сообщить("Распознанный код: " + Код);
КонецЦикла;
Исключение
Сообщить("Ошибка при работе с внешней компонентой: " + ОписаниеОшибки());
КонецПопытки;
Если разработка полноценной внешней компоненты кажется слишком сложной, мы можем использовать более простой подход: вызывать внешние программы или скрипты (например, Python-скрипт с pylibdmtx) из 1С. В этом случае 1С передает путь к PDF или изображению как аргумент командной строки, а внешняя программа выполняет распознавание и выводит результат в стандартный поток вывода, который 1С может считать.
Преимущества: Простота реализации, отсутствие необходимости регистрации COM-объектов. Недостатки: Медленнее, сложнее обрабатывать ошибки, передача данных ограничена командной строкой и стандартным выводом.
Пример использования метода ЗапуститьПриложение в 1С:
ПутьКФайлуСкрипта = "C:\PythonScripts\decode_dm.py";
ПутьКPDF = "C:\МоиДокументы\КодыМаркировки.pdf";
ПутьКВыходномуФайлу = "C:\МоиДокументы\РезультатыРаспознавания.txt";
// Извлекаем изображения из PDF с помощью GhostScript
// (предполагаем, что этот шаг был выполнен ранее,
// или Python-скрипт умеет работать с PDF напрямую)
// Пример: ЗапуститьПриложение("gs -dNOPAUSE ...")
// Формируем команду для запуска Python-скрипта
Команда = "python """ + ПутьКФайлуСкрипта + """ """ + ПутьКPDF + """ > """ + ПутьКВыходномуФайлу + """";
// Запускаем приложение
РезультатЗапуска = ЗапуститьПриложение(Команда, , Истина); // Истина - ждать завершения
Если РезультатЗапуска = 0 Тогда
// Читаем результат из файла
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(ПутьКВыходномуФайлу);
Для Каждого СтрокаТекста Из ТекстовыйДокумент.ПолучитьСтроки() Цикл
Сообщить("Распознанный код: " + СтрокаТекста);
КонецЦикла;
Иначе
Сообщить("Ошибка при запуске скрипта: " + РезультатЗапуска);
КонецЕсли;
Для облачных решений, таких как GroupDocs.Parser Cloud, мы будем использовать встроенные в 1С механизмы для работы с HTTP-запросами. Мы формируем запрос к API сервиса, отправляем PDF-файл (или его часть, или ссылку на него), а затем парсим HTTP-ответ, который содержит распознанные данные.
Пример использования HTTPСоединение в 1С:
&НаКлиенте
Процедура РаспознатьЧерезОблако(Команда)
// Эти параметры должны быть получены из настроек сервиса GroupDocs.Parser Cloud
КлючAPI = "ВАШ_API_КЛЮЧ";
URL_API = "https://api.groupdocs.cloud/v2.0/parser/recognize";
// Выбираем PDF-файл
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.ПолноеИмяФайла = "";
ДиалогВыбораФайла.Заголовок = "Выберите PDF-файл для распознавания";
ДиалогВыбораФайла.Фильтр = "PDF файлы (*.pdf)|*.pdf";
Если ДиалогВыбораФайла.Выбрать() Тогда
ПутьКPDF = ДиалогВыбораФайла.ПолноеИмяФайла;
// Читаем содержимое файла в двоичные данные
ДвоичныеДанныеPDF = Новый ДвоичныеДанные(ПутьКPDF);
// Формируем HTTP-запрос
Заголовок = Новый Соответствие;
Заголовок.Вставить("Content-Type", "application/pdf");
Заголовок.Вставить("Authorization", "Bearer " + КлючAPI); // Или другой метод авторизации
Попытка
HTTPСоединение = Новый HTTPСоединение("api.groupdocs.cloud", 443, , , , , , Истина); // Истина - SSL
HTTPЗапрос = Новый HTTPЗапрос(URL_API, Заголовок);
HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеPDF);
HTTPОтвет = HTTPСоединение.Отправить(HTTPЗапрос);
Если HTTPОтвет.КодСостояния = 200 Тогда
ТекстОтвета = HTTPОтвет.ПолучитьТелоКакСтроку();
// Здесь нужно разобрать JSON-ответ от сервиса
// Пример: СтруктураОтвета = JSON.Прочитать(ТекстОтвета);
// И вывести распознанные коды
Сообщить("Результат распознавания: " + ТекстОтвета);
Иначе
Сообщить("Ошибка запроса к API: " + HTTPОтвет.КодСостояния + " - " + HTTPОтвет.ПолучитьТелоКакСтроку());
КонецЕсли;
Исключение
Сообщить("Ошибка при работе с HTTP-сервисом: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Этот пример показывает общую структуру работы с HTTP-сервисами. Детали реализации будут зависеть от конкретного API, включая формат запросов и ответов.
При реализации любого из предложенных подходов мы должны учитывать несколько критически важных моментов, которые повлияют на успешность и эффективность нашего решения.
Качество DataMatrix кода в PDF-файле имеет первостепенное значение. Если коды плохо пропечатаны, искажены, имеют низкое разрешение или повреждены (например, из-за сжатия PDF), точность распознавания значительно снизится. Нам, возможно, потребуется применять алгоритмы предобработки изображений (повышение контрастности, бинаризация, фильтрация шумов) для улучшения качества перед передачей в распознающую библиотеку.
Для кодов маркировки (например, шин) используется стандарт GS1 DataMatrix — решается через автоматизация обмена данными с системой Честный Знак. Он предполагает определенные правила кодирования данных, включая использование идентификаторов применения (ИП) для различных полей информации (например, (01) для GTIN, (21) для серийного номера). Убедитесь, что выбранная библиотека способна корректно распознавать и парсить GS1 DataMatrix, а мы, в свою очередь, корректно интерпретируем полученные данные в 1С.
Распознавание DataMatrix из PDF может быть ресурсоемкой задачей, особенно при пакетной обработке большого количества документов или страниц. Производительность решения будет зависеть от:
Мы должны провести тестирование и, при необходимости, оптимизировать процесс, например, с использованием фоновых заданий в 1С или асинхронной обработки.
При использовании сторонних библиотек и API критически важно внимательно изучать их лицензионные условия. Многие из них являются коммерческими и требуют приобретения платной лицензии для использования в коммерческих проектах. Открытые библиотеки (например, libdmtx, ZXing) также имеют свои лицензии (например, LGPL, Apache 2.0), которые следует соблюдать.
Всегда стоит сопоставлять затраты на разработку собственного решения (даже с использованием сторонних библиотек) с возможностью приобретения уже готовых обработок или внешних компонент для 1С, которые иногда можно найти на специализированных ресурсах (например, "Инфостарт"). Иногда готовое, пусть и платное, решение, позволяющее читать штрих-коды из PDF и картинок, оказывается значительно выгоднее, чем внутренняя разработка с нуля.
Автоматическое распознавание DataMatrix кодов из PDF-файлов в 1С без сканера – это сложная, но вполне достижимая задача. Прямое решение средствами 1С непрактично, но интеграция с мощными внешними библиотеками (такими как libdmtx, Aspose.BarCode, ZXing) или облачными API позволяет эффективно решить эту проблему. Нам предстоит выбрать оптимальный подход, исходя из наших технических возможностей, бюджета и требований к производительности. Важно тщательно продумать шаги по извлечению изображений из PDF, интеграции выбранной библиотеки с 1С (через внешние компоненты, вызов скриптов или HTTP-запросы) и учесть все важные аспекты, такие как качество кодов, лицензирование и производительность.
С помощью этой информации мы можем создать надежное и эффективное решение, которое значительно автоматизирует процессы работы с маркированной продукцией в вашей системе 1С.