Как преобразовать PDF в текст с помощью pdftotext.exe в 1С?

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

При автоматизации документооборота в 1С часто возникает задача программного извлечения текстовых данных из файлов PDF. Одним из самых популярных инструментов для этого является консольная утилита pdftotext.exe. Однако разработчики часто сталкиваются с ситуацией, когда при запуске команды через 1С файл на выходе просто не создается, а ошибки не отображаются. В этой статье мы подробно разберем, как правильно настроить конвертацию, почему утилита может «молчать» и какие альтернативы существуют для серверных ОС.

Причина №1: Неправильное экранирование путей с пробелами

Самая распространенная ошибка — отсутствие кавычек в строке запуска. Если путь к утилите или к самому файлу содержит пробелы (например, C:\Program Files\...), операционная система не сможет корректно интерпретировать команду. Разберем по шагам, как правильно сформировать строку запуска.

Рассмотрим пример кода, где пути обрамляются двойными кавычками. В языке 1С для вставки одной кавычки внутри строки используется две кавычки подряд:


ПутьКEXE = "C:\Program Files (x86)\PDF2TXT\pdftotext.exe";
ПутьКPDF = "C:\Мои Документы\Файл.pdf";
ПутьКTXT = "C:\Мои Документы\Результат.txt";

// Формируем команду с кавычками для каждого пути
Команда = """" + ПутьКEXE + """ -enc UTF-8 -layout """ + ПутьКPDF + """ """ + ПутьКTXT + """";

// Запускаем приложение в режиме ожидания завершения
ЗапуститьПриложение(Команда, , Истина);

Обратите внимание на использование четырех кавычек в начале и конце — это гарантирует, что Windows получит пути, заключенные в " ". Также полезно использовать параметр -layout, который позволяет сохранить визуальную структуру текста (колонки и таблицы), предотвращая «перемешивание» данных интеллектуальными алгоритмами утилиты.

Причина №2: Права доступа службы сервера 1С

Если ваш код выполняется на стороне сервера (например, в фоновом задании), важно учитывать контекст безопасности. Проанализируем ситуацию: серверная служба 1С обычно работает под учетной записью USR1CV8. У этого пользователя по умолчанию сильно ограничены права.

Выясним возможные препятствия:

  1. Запрет на запись: У пользователя USR1CV8 может не быть прав на создание файлов в целевой папке. Попробуйте использовать в качестве пути временных файлов папку, возвращаемую функцией КаталогВременныхФайлов().
  2. Доступ к сетевым путям: Если файлы лежат на сетевом диске, системная учетная запись сервера их «не увидит». Используйте только локальные пути или полные UNC-пути, на которые даны права конкретному пользователю сервера.
  3. Блокировка запуска EXE: Антивирусное ПО или политики безопасности Windows Server могут блокировать запуск сторонних исполняемых файлов из недоверенных источников.

Отладка через перенаправление вывода (STDERR)

Если файл не создается, а 1С не выдает ошибок, нам нужно «услышать», что говорит сама утилита pdftotext. Для этого воспользуемся командной оболочкой cmd.exe и перенаправим поток ошибок в текстовый файл. Посмотрим на пример реализации такой отладки:


ФайлОшибок = КаталогВременныхФайлов() + "error_log.txt";
Команда = "cmd /c """"" + ПутьКEXE + """ """ + ПутьКPDF + """ """ + ПутьКTXT + """ 2> """ + ФайлОшибок + """""";

ЗапуститьПриложение(Команда, , Истина);

// Проверяем, не пуст ли файл лога
ТекстОшибки = Новый ТекстовыйДокумент;
ТекстОшибки.Прочитать(ФайлОшибок);
Если ТекстОшибки.КоличествоСтрок() > 0 Тогда
    Сообщить("Ошибка утилиты: " + ТекстОшибки.ПолучитьТекст());
КонецЕсли;

В файле error_log.txt вы сможете увидеть реальную причину сбоя: «Permission denied» (отказ в доступе), «PDF file is damaged» (файл поврежден) или сообщения о нехватке библиотек DLL.

Зависимости и библиотеки (DLL)

Проанализируем состав папки с утилитой. pdftotext.exe (особенно версии из состава проекта Poppler) редко бывает полностью автономным файлом. Часто ему требуются библиотеки: libpoppler.dll, freetype.dll, zlib.dll и другие. Если вы скопировали только один исполняемый файл в каталог 1С, он не запустится. Убедитесь, что все сопутствующие DLL лежат в одной папке с .exe.

Альтернатива: Использование встроенного объекта ИзвлечениеТекста

В 1С существует штатный механизм для этих целей — объект ИзвлечениеТекста. Однако многие разработчики жалуются, что он не работает на Windows Server. Выясним причину: встроенный объект 1С является лишь оболочкой над системными фильтрами iFilter.

Чтобы метод заработал на сервере, выполните следующие действия:

  1. Скачайте и установите на сервер Adobe PDF iFilter или PDF X-Change iFilter (последний часто работает быстрее и стабильнее).
  2. Перезапустите службу сервера 1С.
  3. Используйте стандартный код:

Извлекатель = Новый ИзвлечениеТекста(ПутьКФайлуPDF);
Текст = Извлекатель.ПолучитьТекст();
// Теперь переменная "Текст" содержит содержимое файла

Преимущество этого метода в том, что вам не нужно управлять внешними процессами и следить за временными файлами — 1С делает все «внутри» себя.

Особенности кодировок и PDF с защитой

Иногда утилита создает пустой файл или файл с «кракозябрами». Рассмотрим две причины:

1. Кодировка. Ключ -enc UTF-8 требует наличия файлов соответствия кодировок (unicode maps) в подпапках утилиты. Если их нет, попробуйте не указывать кодировку вовсе или использовать стандартную кодировку системы. 2. Защита файла. PDF может иметь флаг «Запрет извлечения содержимого». Даже если файл открывается без пароля, утилита может соблюдать политику безопасности и отказываться конвертировать текст. В таких случаях помогают ключи -upw (пароль пользователя) или -opw (пароль владельца), если они вам известны.

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

← На главную