Как реализовать конвертацию PDF в Excel в 1С для файлов разной структуры?

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

Задача конвертации PDF в Excel в среде 1С:Предприятие является одной из самых трудоемких в области интеграции. Сложность заключается в самой природе формата PDF: он предназначен для отображения и печати («цифровая бумага»), а не для хранения структурированных данных. Если файл имеет фиксированный шаблон, задачу можно решить через COMОбъект, но что делать, когда структура документов постоянно меняется, содержит рисунки, текст и таблицы в произвольном порядке? В рамках данной статьи мы разберем современные подходы, которые позволяют автоматизировать этот процесс.

Метод 1: Использование COM-объектов и внешних приложений по шаблону

Рассмотрим базовый вариант, с которого начинают многие разработчики. Если у вас установлены профессиональные версии PDF-редакторов (например, Adobe Acrobat или Foxit), вы можете обратиться к их программному интерфейсу. Проанализируем примерный алгоритм взаимодействия:

Для работы через COMОбъект нам необходимо инициализировать приложение и вызвать методы открытия и сохранения файла. Однако, как отмечают участники обсуждения, такой метод стабильно работает только в том случае, если вы заранее знаете координаты ячеек или структура файла жестко фиксирована.


// Пример инициализации объекта Acrobat (требуется установленное ПО)
Попытка
    AcroApp = Новый COMОбъект("AcroExch.App");
    PDDoc = Новый COMОбъект("AcroExch.PDDoc");
    Если PDDoc.Open("C:\отчет.pdf") Тогда
        // Дальнейшая логика обработки документа
    КонецЕсли;
Исключение
    Сообщить("Ошибка при открытии Adobe Acrobat: " + ОписаниеОшибки());
КонецПопытки;

Важное ограничение: Этот подход плохо справляется с «общим случаем», когда таблицы могут начинаться с разных строк или иметь разное количество колонок. Кроме того, использование COM-объектов на стороне сервера 1С часто приводит к зависанию процессов.

Метод 2: Использование специализированных CLI-утилит (Tabula и Xpdf)

Разберем более продвинутый способ, который не требует наличия тяжеловесного платного ПО. Существуют консольные утилиты (Command Line Interface), которые специализируются на извлечении таблиц. Одной из самых эффективных является Tabula.

Выясним, как это работает: 1С запускает внешнее приложение, передает ему путь к PDF-файлу, а на выходе получает структурированный файл CSV или XLSX. Для выполнения внешней команды используем метод ЗапуститьПриложение().

Проанализируем шаги реализации:

  1. Скачиваем консольную версию утилиты (например, tabula-java).
  2. Формируем строку запуска с необходимыми ключами (например, --guess для автоматического определения таблиц).
  3. Считываем полученный результат в 1С.

КомандаЗапуска = "java -jar tabula.jar -p all -a -f CSV ""C:\input.pdf"" -o ""C:\output.csv""";
ЗапуститьПриложение(КомандаЗапуска, , Истина); // Ждем завершения выполнения

// Далее читаем CSV файл стандартными средствами 1С
ЧтениеТекста = Новый ЧтениеТекста("C:\output.csv", КодировкаТекста.UTF8);
СтрокаДанных = ЧтениеТекста.ПрочитатьСтроку();
Пока СтрокаДанных <> Неопределено Цикл
    // Разбор строк и заполнение ТаблицыЗначений
    СтрокаДанных = ЧтениеТекста.ПрочитатьСтроку();
КонецЦикла;

Метод 3: Интеграция с Python для «умного» распознавания

Если файлы «не по шаблону» и содержат сложную верстку, лучшим решением на сегодняшний день является связка 1С + Python. Библиотеки Python, такие как pdfplumber, camelot и tabula-py, обладают встроенными алгоритмами поиска границ таблиц на основе визуального анализа линий и текстовых блоков.

Посмотрим, как организовать такое взаимодействие. 1С может передавать параметры в Python-скрипт через текстовый файл или аргументы командной строки, а забирать результат в формате JSON.

Рассмотрим пример логики Python-скрипта (библиотека pdfplumber):


import pdfplumber
import pandas as pd

with pdfplumber.open("document.pdf") as pdf:
    all_tables = []
    for page in pdf.pages:
        table = page.extract_table()
        if table:
            all_tables.append(table)
            
# Сохранение в Excel для последующего забора в 1С
df = pd.DataFrame(all_tables)
df.to_excel("result.xlsx")

В 1С вам останется только вызвать этот скрипт. Этот метод позволяет обрабатывать даже те PDF, где таблицы не имеют явных границ (сетки), так как алгоритмы ориентируются на выравнивание текста.

Метод 4: Облачные OCR-технологии и интеллектуальный анализ (Yandex Vision / Google Vision)

В случаях, когда PDF представляет собой скан (картинку), ни программные библиотеки, ни COM-объекты не смогут извлечь текст напрямую. Здесь на помощь приходят облачные сервисы распознавания образов (OCR). Для практической реализации такого подхода подойдёт обработка для распознавания документов через Yandex Vision OCR.

Разберем преимущества использования Cloud API для 1С:

Для реализации в 1С используем объект HTTPСоединение. Мы отправляем POST-запрос с двоичными данными файла и получаем ответ, который парсим через ЧтениеJSON.


Соединение = Новый HTTPСоединение("vision.api.cloud.yandex.net", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/vision/v1/batchAnalyze");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенДоступа);
// Формирование тела запроса с передачей PDF в Base64
Ответ = Соединение.ОтправитьДляОбъекта(Запрос);

Метод 5: Конвертация через HTML как промежуточное звено

Проанализируем еще один интересный лайфхак. Платформа 1С умеет нативно работать с HTML-документами и извлекать из них таблицы. Если сконвертировать PDF в HTML (с помощью бесплатных утилит типа pdftohtml), то задача сводится к простому парсингу тегов <table>, <tr> и <td>.

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

Ключевые сложности и «подводные камни»

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

  1. Склеенные ячейки: При автоматическом распознавании текст из двух колонок может попасть в одну. Рекомендуется использовать регулярные выражения (VBScript.RegExp) в 1С для дополнительной очистки данных.
  2. Многостраничность: Если таблица переходит с одной страницы на другую, заголовки могут повторяться. Проанализируем необходимость алгоритма «склейки», который будет проверять идентичность колонок на стыке страниц.
  3. Мусорные данные: Логотипы, колонтитулы и номера страниц часто попадают в результирующую таблицу. Необходимо реализовать программные фильтры в 1С, которые будут отсекать строки, не содержащие ключевых данных (например, артикула или суммы).

Итог: Для простых задач по шаблону используйте COMОбъект или консольные утилиты. Для сложных, меняющихся файлов и массовой обработки лучшим выбором будет связка с Python или использование Облачных API. Это обеспечит гибкость и избавит от необходимости переписывать код при малейшем изменении формата PDF-файла. В качестве готовой альтернативы можно использовать решение для автоматического распознавания PDF через ИИ.

← На главную