Как программно извлечь и распознать QR-коды из документов Word?

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

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

Понимание структуры документа

Прежде чем приступать к коду, важно проанализировать структуру файла docx. Современные форматы документов Microsoft Word — это, по своей сути, ZIP-архивы. Внутри такого архива хранятся все компоненты документа: текст, стили и, что самое важное для нас, медиа-ресурсы. Все изображения, включая QR-коды, размещаются в подпапке word/media.

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

Алгоритм извлечения и распознавания

Для реализации поставленной задачи выполним следующие шаги:

  1. Откроем файл как обычный ZIP-архив (или XML-структуру для доступа к путям).
  2. Просканируем структуру на наличие файлов в папке media.
  3. Отфильтруем системные изображения, оставив только необходимые QR-коды.
  4. Воспользуемся внешней утилитой ZBar для пакетного распознавания извлеченных файлов.

Реализация на языке 1С

Давайте посмотрим на пример реализации, который позволяет автоматизировать процесс обработки. Мы будем использовать ЧтениеXML для поиска путей к изображениям и метод ЗапуститьПриложение для вызова консольной команды распознавания.


ИмяФайлаРаспознования = ПолучитьИмяВременногоФайла("txt");
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлуDocuments);

Пока ЧтениеXML.Прочитать() Цикл
    Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
        Пока ЧтениеXML.ПрочитатьАтрибут() Цикл
            Если ЧтениеXML.Имя = "Target" и Лев(ЧтениеXML.Значение, 6) = "media/" Тогда
                // Фильтруем лишние изображения, если необходимо
                Если НЕ (Найти(ЧтениеXML.Значение, "_app_ios") или Найти(ЧтениеXML.Значение, "_app_android_")) Тогда
                    ИмяФайлаИзображения = ПутьККаталогу + СтрЗаменить(ЧтениеXML.Значение, "/", "\");
                    ПутьКПрограммеРаспознования = "C:\Program Files (x86)\ZBar\bin";
                    
                    // Формируем команду для ZBar
                    СтрокаЗапуска = "cmd /c zbarimg.exe --raw """ + ИмяФайлаИзображения + """ >> """ + ИмяФайлаРаспознования + """";
                    КодВозврата = 0;
                    
                    // Запускаем процесс распознавания
                    ЗапуститьПриложение(СтрокаЗапуска, ПутьКПрограммеРаспознования, Истина, КодВозврата);
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

Почему этот метод эффективен?

Проанализируем преимущества данного подхода:

Практические рекомендации

При выполнении работы учитывайте следующие нюансы:

Организация логов: Всегда ведите журнал успешных и неуспешных операций. Поскольку 2700 кодов — это объем, при котором возможны ошибки распознавания из-за качества исходных картинок, ведение журнала поможет вам быстро найти проблемные файлы.

Фильтрация: Как показано в примере, используйте строковые методы Найти или Лев для того, чтобы отсечь изображения, не являющиеся QR-кодами, еще до начала процесса распознавания. Это существенно сократит время ожидания результата.

Масштабируемость: Если объем данных вырастет до десятков тысяч, рассмотрите возможность написания многопоточного скрипта (например, на Python с библиотекой pyzbar), который будет вызываться из 1С, что позволит задействовать все ядра вашего процессора параллельно.

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

← На главную