Как автоматически распознавать DataMatrix коды из PDF-файлов в 1С без использования сканера?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

Задача автоматического распознавания DataMatrix кодов непосредственно из PDF-файлов без применения физического сканера или даже камеры мобильного телефона, а силами системы 1С, является весьма актуальной для многих компаний, работающих с маркированной продукцией, например, с шинами. Это позволяет значительно упростить и ускорить процессы приемки, инвентаризации и контроля товаров, устраняя необходимость ручного сканирования каждого кода — ускоряет инвентаризация и сверка маркировки с Честным Знаком. Однако, данная задача не имеет простого решения "из коробки" в 1С, поскольку платформа не располагает встроенными средствами для работы с графическими данными на таком низком уровне. Рассмотрим подробнее, как мы можем подойти к решению этой непростой, но вполне выполнимой задачи.

Анализируем проблему и подходы

Первоначальный вопрос, который перед нами стоит, звучит так: можно ли взять PDF-файл, содержащий изображения DataMatrix кодов маркировки, и средствами 1С извлечь из них текстовую информацию без участия внешнего оборудования? Для этой задачи есть распознавание DataMatrix кодов со сканов и PDF. На первый взгляд, это кажется сложным, но на практике существуют обходные пути и интеграционные решения. Разберем, какие подходы и идеи были высказаны при обсуждении этой проблемы.

  1. Возможность извлечения текстовых данных из DataMatrix. Наши коллеги подтверждают, что технически это возможно. Например, существует опыт ручного извлечения: можно скачать изображение DataMatrix кода, загрузить его в специализированный онлайн-сервис и получить на выходе текстовую строку. Это доказывает, что данные в коде существуют и могут быть декодированы. Наша задача – автоматизировать этот процесс.
  2. Сложность нативной реализации в 1С. Прямое "попиксельное" распознавание изображений DataMatrix внутри 1С – это путь, сопряженный с огромными трудностями и затратами. Система 1С не предназначена для низкоуровневой обработки изображений, декодирования бинарных данных по сложным алгоритмам, которые используются в DataMatrix. Такой подход, хоть и теоретически возможен, потребует колоссального объема разработки, что сделает его экономически нецелесообразным. Стоимость такой разработки значительно превысит стоимость нескольких десятков физических сканеров или смартфонов.
  3. Необходимость использования внешних решений. Из обсуждений становится ясно, что наиболее реалистичный и эффективный путь – это интеграция с внешними специализированными библиотеками или сервисами. Существуют готовые решения, разработанные именно для распознавания штрих-кодов, которые значительно упростят нашу задачу.

Таким образом, мы приходим к выводу, что для успешного решения задачи нам потребуется выйти за рамки чистой функциональности 1С и использовать сторонние инструменты, интегрировав их с нашей системой.

Детальный обзор решений на основе внешних библиотек и API

Поскольку в 1С отсутствуют встроенные механизмы для прямого распознавания DataMatrix из изображений, мы обратимся к миру специализированных библиотек и сервисов. Эти инструменты предоставляют мощный функционал для работы с графическими данными и штрих-кодами, который мы сможем интегрировать с 1С.

  1. Libdmtx и её обёртки (например, pylibdmtx для Python).

    libdmtx — это открытая библиотека, специально разработанная для чтения и записи DataMatrix кодов. Она доступна для различных операционных систем, включая Windows, Linux, и macOS. Для разработчиков, использующих Python, существует удобная обёртка pylibdmtx, которая позволяет обрабатывать изображения, полученные из популярных библиотек, таких как PIL/Pillow, OpenCV, или из массивов NumPy. Мы можем использовать эту связку для создания внешней обработки:

    1. Извлечение изображения: Извлекаем изображение DataMatrix из PDF (об этом подробнее расскажем ниже).
    2. Вызов Python-скрипта: Передаем путь к изображению в Python-скрипт.
    3. Распознавание: Python-скрипт с помощью pylibdmtx распознает код.
    4. Возврат результата: Скрипт возвращает распознанный текст в 1С.

    Пример гипотетического 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С с помощью метода ЗапуститьПриложение, а результат считан из стандартного вывода.

  2. .NET библиотеки.

    Для разработчиков, ориентированных на .NET-стек, существуют мощные коммерческие библиотеки. Среди них выделяются BarcodeLib.BarcodeReader.PDF.Code.DataMatrix, доступная через NuGet, и Aspose.BarCode for .NET. Эти библиотеки позволяют считывать DataMatrix коды напрямую из PDF-файлов. Мы можем разработать внешнюю компоненту (COM-объект или .NET-сборку с COM-Interop) на C# или другом .NET-языке, которая будет "обёртывать" функциональность этих библиотек. 1С сможет вызывать методы этой внешней компоненты, передавать ей PDF-файл и получать распознанные данные.

    Преимущества: Высокая производительность, надежность, широкие возможности настройки. Недостатки: Коммерческие лицензии, необходимость разработки внешней компоненты.

  3. ZXing (Zebra Crossing).

    ZXing — это открытая мультиформатная библиотека для обработки штрих-кодов, изначально написанная на Java, но имеющая порты на множество других языков. Она поддерживает распознавание DataMatrix и является одной из наиболее популярных библиотек для этой цели. Мы можем использовать ZXing в 1С несколькими способами:

    1. Через внешнюю компоненту на Java: Если у вас есть возможность запускать Java-приложения на сервере 1С, можно написать небольшую Java-программу, которая использует ZXing, а затем вызывать её из 1С, передавая параметры и считывая результат.
    2. Через .NET порт: Существуют .NET-порты ZXing (например, ZXing.Net), которые можно использовать аналогично другим .NET библиотекам, создавая внешние компоненты.
  4. Aspose.Total for Python via .NET.

    Этот API предлагает мощные возможности для сканирования штрих-кодов DataMatrix с помощью Python. Он является частью большого пакета Aspose и предоставляет гибкие настройки механизма распознавания, что позволяет нам повысить точность или скорость чтения в зависимости от требований. Для его работы потребуется Python 3.5 или более поздняя версия. Интеграция с 1С будет аналогична сценарию с pylibdmtx: вызов внешнего Python-скрипта из 1С.

  5. GroupDocs.Parser Cloud (REST API).

    Если мы не хотим устанавливать библиотеки и настраивать локальное окружение, можем рассмотреть облачные решения. GroupDocs.Parser Cloud предоставляет REST API для анализа документов и извлечения данных, включая сканирование штрих-кодов из PDF. Мы отправляем PDF-файл на облачный сервис, получаем ответ с распознанными данными. Интеграция с 1С в этом случае будет заключаться в формировании HTTP-запросов и обработке HTTP-ответов.

    Преимущества: Не требует локальной установки библиотек, кроссплатформенность. Недостатки: Зависимость от интернет-соединения, потенциальные затраты на использование облачного API, вопросы конфиденциальности данных.

Стратегии извлечения изображений DataMatrix из PDF

Прежде чем распознавать DataMatrix, нам необходимо получить его изображение из PDF-документа. DataMatrix коды в PDF обычно представлены как графические объекты. Разберем, как мы можем извлечь эти изображения:

  1. Использование утилит командной строки: ImageMagick и GhostScript.

    Эти мощные инструменты могут разбирать 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 коды.

  2. Библиотеки для работы с PDF.

    Многие из упомянутых выше библиотек для распознавания штрих-кодов (например, некоторые версии Aspose) имеют встроенные функции для работы с PDF, которые могут автоматически извлекать изображения или даже непосредственно распознавать штрих-коды внутри PDF-файла без предварительного извлечения. Это самый удобный вариант, если такие функции доступны.

  3. Программное извлечение графики.

    Для более тонкого контроля можно использовать библиотеки для программного парсинга PDF-файлов (например, Apache PDFBox для Java) или готовые внешние компоненты на базе Poppler. Они позволяют анализировать внутреннюю структуру PDF и находить графические объекты, затем извлекать их. Это требует более глубокого понимания формата PDF, но предоставляет максимальную гибкость.

После того как изображения DataMatrix извлечены (или если библиотека сама работает с PDF), мы можем передать их на распознавание в одну из упомянутых ранее специализированных библиотек.

Интеграция с 1С: Практические шаги

Когда мы определились с внешней библиотекой и способом извлечения изображений, встает вопрос, как интегрировать это все с 1С. Разберем основные подходы:

  1. Внешние компоненты (COM-объекты или .NET-сборки).

    Этот способ является наиболее распространенным и надежным для расширения функциональности 1С. Мы можем разработать внешнюю компоненту на языке программирования, который поддерживает работу с выбранной библиотекой (например, C# для .NET-библиотек или C++ для обертки над libdmtx). Эта компонента будет представлять собой COM-объект, который 1С сможет создавать и вызывать его методы, передавая параметры (например, путь к PDF-файлу или изображению) и получая результат.

    Преимущества: Высокая степень интеграции, скорость работы, удобство использования из кода 1С. Недостатки: Требует регистрации компоненты на клиенте/сервере 1С, сложнее в разработке.

    Пример вызова COM-объекта в 1С:

    
    Попытка
        // Создаем экземпляр внешней компоненты
        DataMatrixReader = Новый COMОбъект("MyDataMatrixReader.Reader"); 
                
        // Вызываем метод компоненты для чтения DataMatrix из PDF
        ПутьКPDF = "C:\МоиДокументы\КодыМаркировки.pdf";
        ТекстКодов = DataMatrixReader.ReadFromPdf(ПутьКPDF);
                
        Для Каждого Код Из ТекстКодов Цикл
            Сообщить("Распознанный код: " + Код);
        КонецЦикла;
                
    Исключение
        Сообщить("Ошибка при работе с внешней компонентой: " + ОписаниеОшибки());
    КонецПопытки;
    
  2. Вызов внешних исполняемых файлов или скриптов.

    Если разработка полноценной внешней компоненты кажется слишком сложной, мы можем использовать более простой подход: вызывать внешние программы или скрипты (например, 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 Тогда
        // Читаем результат из файла
        ТекстовыйДокумент = Новый ТекстовыйДокумент;
        ТекстовыйДокумент.Прочитать(ПутьКВыходномуФайлу);
                
        Для Каждого СтрокаТекста Из ТекстовыйДокумент.ПолучитьСтроки() Цикл
            Сообщить("Распознанный код: " + СтрокаТекста);
        КонецЦикла;
    Иначе
        Сообщить("Ошибка при запуске скрипта: " + РезультатЗапуска);
    КонецЕсли;
    
  3. Использование HTTP-сервисов (для облачных API).

    Для облачных решений, таких как 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, включая формат запросов и ответов.

Важные аспекты и рекомендации

При реализации любого из предложенных подходов мы должны учитывать несколько критически важных моментов, которые повлияют на успешность и эффективность нашего решения.

  1. Качество изображений DataMatrix.

    Качество DataMatrix кода в PDF-файле имеет первостепенное значение. Если коды плохо пропечатаны, искажены, имеют низкое разрешение или повреждены (например, из-за сжатия PDF), точность распознавания значительно снизится. Нам, возможно, потребуется применять алгоритмы предобработки изображений (повышение контрастности, бинаризация, фильтрация шумов) для улучшения качества перед передачей в распознающую библиотеку.

  2. Формат GS1 DataMatrix.

    Для кодов маркировки (например, шин) используется стандарт GS1 DataMatrix — решается через автоматизация обмена данными с системой Честный Знак. Он предполагает определенные правила кодирования данных, включая использование идентификаторов применения (ИП) для различных полей информации (например, (01) для GTIN, (21) для серийного номера). Убедитесь, что выбранная библиотека способна корректно распознавать и парсить GS1 DataMatrix, а мы, в свою очередь, корректно интерпретируем полученные данные в 1С.

  3. Производительность.

    Распознавание DataMatrix из PDF может быть ресурсоемкой задачей, особенно при пакетной обработке большого количества документов или страниц. Производительность решения будет зависеть от:

    • Выбранной библиотеки (некоторые быстрее, другие точнее).
    • Качества исходных изображений (чем хуже качество, тем больше вычислений требуется).
    • Аппаратных ресурсов сервера или клиентской машины.

    Мы должны провести тестирование и, при необходимости, оптимизировать процесс, например, с использованием фоновых заданий в 1С или асинхронной обработки.

  4. Лицензирование.

    При использовании сторонних библиотек и API критически важно внимательно изучать их лицензионные условия. Многие из них являются коммерческими и требуют приобретения платной лицензии для использования в коммерческих проектах. Открытые библиотеки (например, libdmtx, ZXing) также имеют свои лицензии (например, LGPL, Apache 2.0), которые следует соблюдать.

  5. Стоимость разработки против готовых решений.

    Всегда стоит сопоставлять затраты на разработку собственного решения (даже с использованием сторонних библиотек) с возможностью приобретения уже готовых обработок или внешних компонент для 1С, которые иногда можно найти на специализированных ресурсах (например, "Инфостарт"). Иногда готовое, пусть и платное, решение, позволяющее читать штрих-коды из PDF и картинок, оказывается значительно выгоднее, чем внутренняя разработка с нуля.

Заключение

Автоматическое распознавание DataMatrix кодов из PDF-файлов в 1С без сканера – это сложная, но вполне достижимая задача. Прямое решение средствами 1С непрактично, но интеграция с мощными внешними библиотеками (такими как libdmtx, Aspose.BarCode, ZXing) или облачными API позволяет эффективно решить эту проблему. Нам предстоит выбрать оптимальный подход, исходя из наших технических возможностей, бюджета и требований к производительности. Важно тщательно продумать шаги по извлечению изображений из PDF, интеграции выбранной библиотеки с 1С (через внешние компоненты, вызов скриптов или HTTP-запросы) и учесть все важные аспекты, такие как качество кодов, лицензирование и производительность.

С помощью этой информации мы можем создать надежное и эффективное решение, которое значительно автоматизирует процессы работы с маркированной продукцией в вашей системе 1С.

← На главную