В процессе автоматизации документооборота мы часто сталкиваемся с необходимостью считывать данные из накладных, счетов или этикеток, приходящих в формате PDF. Стандартными средствами 1С напрямую прочитать «внутренности» PDF без дополнительных инструментов бывает затруднительно, особенно если речь идет о неструктурированных документах. Давайте разберем, как решить эту задачу с помощью внешних утилит и обработки полученного текста.
Прежде чем приступать к написанию кода, важно осознать, что PDF-файл — это формат отображения, а не база данных. Если документ был создан путем «печати» из текстового редактора, внутри него есть текстовый слой. Если же это отсканированная копия — перед нами набор изображений, для распознавания которых потребуется OCR (оптическое распознавание символов). Решения, которые мы рассмотрим, подходят именно для файлов, содержащих программно созданный текстовый слой.
Самый надежный и проверенный способ — использование бесплатной консольной утилиты pdftotext. Она позволяет конвертировать содержимое PDF в обычный текстовый файл, который мы затем легко распарсим силами встроенного языка 1С. Для обеспечения скрытого запуска без «черных окон» консоли рекомендуется использовать дополнительную утилиту hstart.
Рассмотрим пошаговую реализацию:
pdftotext.exe, hstart.exe и xpdfrc.-layout для сохранения структуры строк).Пример реализации алгоритма извлечения:
МакетУтилиты = ПолучитьМакет("pdftotext");
Адрес = ПоместитьВоВременноеХранилище(МакетУтилиты, Новый УникальныйИдентификатор);
ФайлУтилиты = КаталогВременныхФайлов() + "pdftotext.exe";
ДанныеХранилища = ПолучитьИзВременногоХранилища(Адрес);
ДанныеХранилища.Записать(ФайлУтилиты);
ТекстКоманды = """" + КаталогВременныхФайлов() + "hstart.exe"" /NOCONSOLE /WAIT ""pdftotext.exe -layout """ + ФайлPDF + """ """ + КаталогВременныхФайлов() + "temp.txt""""";
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(ТекстКоманды, 5, 1);
После того как утилита создала файл temp.txt, нам нужно прочитать его с помощью объекта ЧтениеТекста. Здесь мы применяем стандартные функции работы со строками, такие как Найти(), СтрЗаменить() и Сред(), чтобы выделить нужные нам реквизиты (номера накладных, суммы, артикулы) и перенести их в ТаблицаЗначений.
Важно помнить: при обработке строк текста, полученного из PDF, часто возникают лишние пробелы. Мы рекомендуем использовать цикл для их замены на единичные пробелы перед тем, как пытаться преобразовать данные в Число или другие типы.
Альтернативный подход заключается в использовании утилиты PDF2TXT. Принцип работы схож, но синтаксис команды может отличаться. Важный нюанс, который мы должны учитывать: пути к файлам могут содержать пробелы, что часто приводит к ошибкам при запуске ЗапуститьПриложение(). Всегда оборачивайте пути в двойные кавычки.
ПутьPDF = Элемент.ПолноеИмя;
txt = СтрЗаменить(ПутьPDF, "pdf", "txt");
Команда = ПутьКPDF2TXT + "\pdf2txt.exe "" " + ПутьPDF + """ " + txt;
ЗапуститьПриложение(Команда, , Истина);
ОбъектТ = Новый ИзвлечениеТекста(txt);
ТекстФ = ОбъектТ.ПолучитьТекст();
УдалитьФайлы() после завершения обработки. Это предотвратит засорение диска сервера.pdftotext не поможет, потребуется внешнее решение OCR).Используя данные методы, вы сможете автоматизировать загрузку практически любых данных из структурированных PDF-отчетов в документы 1С, значительно сократив ручной ввод информации пользователями.