Как разбить PDF-файл на отдельные страницы в 1С на Linux без использования COM-объектов

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

Переход на операционные системы семейства Linux и реализация стратегии импортозамещения ставят перед разработчиками 1С новые задачи. Одной из классических проблем является работа с PDF-файлами. В среде Windows многие привыкли использовать COM-объекты (например, Acrobat SDK или PDFCreator), однако в Linux этот механизм недоступен. В данной статье мы подробно разберем, как реализовать разделение многостраничного PDF-файла на отдельные страницы, используя современные возможности платформы 1С и эффективные консольные инструменты.

Способ 1. Встроенные средства платформы 1С (версии 8.3.16 и выше)

Начиная с версии 8.3.16, в платформе 1С появились штатные объекты для работы с PDF-документами. Это самый предпочтительный метод, так как он является кроссплатформенным и не требует установки дополнительного программного обеспечения в операционную систему. Рассмотрим, как программно извлечь страницы из документа.

Для решения задачи мы будем использовать объекты ЧтениеPDF и ЗаписьPDF. Проанализируем алгоритм: мы открываем исходный файл, узнаем общее количество страниц и в цикле сохраняем каждую страницу в новый файл.

Пример реализации на встроенном языке:


// Определим пути к файлам
ПутьКИсходномуФайлу = "/home/user/documents/report.pdf";
КаталогВыгрузки = "/home/user/documents/pages/";

// Создаем объект для чтения
ДокументЧтение = Новый ЧтениеPDF;
ДокументЧтение.Открыть(ПутьКИсходномуФайлу);

КоличествоСтраниц = ДокументЧтение.КоличествоСтраниц();

Для НомерСтраницы = 1 По КоличествоСтраниц Цикл
    
    // Формируем имя нового файла для каждой страницы
    ИмяФайлаСтраницы = КаталогВыгрузки + "page_" + Формат(НомерСтраницы, "ЧГ=0") + ".pdf";
    
    // Создаем объект для записи конкретной страницы
    ДокументЗапись = Новый ЗаписьPDF(ИмяФайлаСтраницы);
    
    // Копируем страницу из источника в новый документ
    // Параметры метода: ИндексСтраницыИсточника, НомерСтраницыВНовомДокументе
    ДокументЗапись.ЗаписатьСтраницу(ДокументЧтение, НомерСтраницы);
    
    // Завершаем запись файла
    ДокументЗапись.Закрыть();
    
КонецЦикла;

ДокументЧтение.Закрыть();

Этот метод работает максимально стабильно. Мы рекомендуем использовать именно его, если версия вашей платформы позволяет это сделать. Основное преимущество — сохранение текстового слоя и векторных данных без потери качества.

Способ 2. Использование утилиты Poppler (pdfseparate)

Если по каким-то причинам встроенные средства 1С не подходят или требуется максимально высокая скорость обработки огромных файлов, проанализируем возможности системных утилит Linux. Одной из самых быстрых является pdfseparate, входящая в пакет poppler-utils.

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

Выясним, как вызвать эту утилиту из кода 1С:


Команда = "pdfseparate ""/tmp/source.pdf"" ""/tmp/result-%d.pdf""";
// %d — это шаблон, в который утилита подставит номер страницы

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

Важный момент: убедитесь, что пакет poppler-utils установлен на сервере 1С (команда sudo apt-get install poppler-utils для Debian/Ubuntu). Этот способ идеально подходит для высоконагруженных систем.

Способ 3. Мощный инструмент QPDF

Рассмотрим ситуацию, когда PDF-файл имеет сложную структуру, защищен паролем или требует оптимизации при разделении. В таких случаях на помощь приходит QPDF. Это консольная утилита для структурных преобразований PDF, которая корректно работает со спецификациями версий 1.7 и выше.

Проанализируем пример команды для разделения на страницы:


// --split-pages разделяет файл на отдельные страницы
Команда = "qpdf --split-pages input.pdf output-%d.pdf";
ЗапуститьПриложение(Команда, , Истина);

Преимущество QPDF заключается в том, что она может одновременно с разделением снимать ограничения на редактирование (если известен пароль) и проверять целостность файла.

Способ 4. Использование Ghostscript

Если вам требуется гарантированная совместимость и возможность дополнительной обработки (например, сжатия или конвертации в стандарт PDF/A), стоит посмотреть в сторону Ghostscript. Это своего рода «швейцарский нож» для работы с документами в Linux.

Разберем пример вызова Ghostscript для извлечения страниц:


// Параметры для извлечения каждой страницы в отдельный файл
Команда = "gs -sDEVICE=pdfwrite -dSAFER -o page_%03d.pdf input.pdf";
ЗапуститьПриложение(Команда, , Истина);

Хотя Ghostscript медленнее, чем pdfseparate, он позволяет тонко настраивать параметры выходных файлов, такие как разрешение изображений внутри PDF и внедрение шрифтов.

Нюансы сканирования и распознавания под Linux

В контексте работы с PDF часто возникает вопрос получения этих самых файлов со сканера. Как было замечено в обсуждении, стандартные для Windows TWAIN и WIA в Linux отсутствуют. Вместо них используется стандарт SANE (Scanner Access Now Easy).

Чтобы автоматизировать процесс «сканирование — разделение — прикрепление в 1С:Документооборот», мы можем использовать консольную утилиту scanimage. Сценарий работы выглядит следующим образом:

  1. Вызываем scanimage через ЗапуститьПриложение для получения изображения.
  2. Конвертируем полученное изображение в PDF (например, с помощью ImageMagick).
  3. Если получен многостраничный скан, разделяем его методами, описанными выше.
  4. Загружаем полученные файлы в справочник Файлы или привязываем к документам.

Пример вызова простого сканирования:


КомандаСканирования = "scanimage --format=tiff > /tmp/scan.tiff";
ЗапуститьПриложение(КомандаСканирования, , Истина);

Подведем итоги

Мы рассмотрели несколько эффективных способов разделения PDF-файлов без использования COM-объектов:

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

← На главную