Как программно объединить несколько PDF-файлов в один многостраничный документ из 1С?

Программист IT и автоматизация бизнеса
← На главную

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

1. Использование встроенных возможностей платформы 1С

Если исходные данные для PDF генерируются непосредственно внутри 1С (например, различные печатные формы, акты, накладные), проанализируем самый оптимальный путь — объединение на уровне объектов самой платформы, без сохранения промежуточных файлов.

Для этого мы можем использовать объект ТабличныйДокумент. Рассмотрим алгоритм действий:

  1. Создаем один пустой итоговый ТабличныйДокумент.
  2. Последовательно выводим в него другие сформированные документы, используя методы Вывести() или Присоединить().
  3. Чтобы каждый новый документ начинался с новой страницы, применяем метод ВывестиГоризонтальныйРазделительСтраниц().
  4. Сохраняем результат методом Записать(), указав формат сохранения PDF.

Посмотрим на пример реализации данного подхода в коде 1С:


ИтоговыйДокумент = Новый ТабличныйДокумент;

// Предположим, у нас есть массив готовых табличных документов
Для Каждого ТекДок Из МассивДокументов Цикл
    ИтоговыйДокумент.Вывести(ТекДок);
    ИтоговыйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;

ИтоговыйДокумент.Записать("C:\Temp\ОбъединенныйДокумент.pdf", ТипФайлаТабличногоДокумента.PDF);

Важно: Этот метод отлично работает только для тех данных, которые генерируются внутри 1С. Для склейки "чужих", уже существующих PDF-файлов на диске, он не подойдет.

2. Консольные утилиты (CLI)

Для программного объединения готовых файлов из 1С чаще всего вызывают внешние консольные утилиты. Это стабильный способ, где вызов осуществляется через команду ЗапуститьПриложение(). Рассмотрим подробнее самые популярные инструменты.

PDFTK (PDF Toolkit)

Это один из самых популярных и надежных инструментов среди разработчиков. Он работает очень быстро, не пересжимает изображения и сохраняет текстовый слой вместе с гиперссылками. Формат команды предельно прост:


Команда = "pdftk file1.pdf file2.pdf cat output combined.pdf";
ЗапуститьПриложение(Команда,, Истина);

Ghostscript

Мощный кроссплатформенный движок. Он несколько сложнее в настройке (требует передачи длинной строки параметров), но позволяет не только склеивать файлы, но и одновременно оптимизировать их размер, менять разрешение картинок и даже версию стандарта PDF.

ImageMagick

Утилита ImageMagick активно используется в типовых конфигурациях (например, в 1С:Документооборот). Однако при ее использовании есть критически важный нюанс: ImageMagick часто растрирует PDF-файлы в процессе склейки. Это означает, что он превращает текст в картинку, делая итоговый файл тяжелым, а текст — не выделяемым для поиска. Если вам важно сохранить исходное качество и текстовый слой, лучше использовать PDFTK или Ghostscript.

Poppler (pdfunite)

Если сервер 1С работает под управлением ОС Linux, стандартом де-факто является утилита pdfunite, которая входит в состав пакета poppler-utils. Она работает максимально быстро и эффективно в серверных средах.

3. COM-объекты и библиотеки

Если нужна более тесная интеграция, когда необходимо получать статус выполнения прямо в коде без "черных окон" консоли, разберем использование COM-интерфейсов.

PDF-XChange Viewer / Editor SDK

Этот инструмент очень популярен в сообществе 1С. У него богатый COM-интерфейс, который позволяет программно открывать, склеивать, подписывать ЭЦП и редактировать PDF-документы напрямую из встроенного языка.

PDFCreator

Помимо работы в режиме виртуального принтера, PDFCreator имеет официальную объектную модель COM. Это позволяет из 1С управлять очередью печати, программно объединять различные задания и сохранять их в итоговый файл без участия пользователя и появления диалоговых окон.

4. Использование виртуальных PDF-принтеров

Многие виртуальные принтеры (например, Bullzip PDF или тот же PDF Creator) умеют работать в режиме добавления страниц. У них есть функция — не генерировать сразу итоговый PDF после отправки на печать, а ждать следующей команды печати. Так происходит до тех пор, пока пользователь (или программа) не решит финализировать процесс и собрать все накопившиеся задания в один файл. Это простой, но менее управляемый программно метод по сравнению с консольными утилитами.

5. Использование внешних компонент (Native API)

Для бесшовной работы можно использовать готовые внешние компоненты для 1С (написанные на C++ или C#), которые являются "обертками" над популярными библиотеками типа iTextSharp или PdfSharp. Подключив такую компоненту, вы можете работать с PDF как с привычным объектом 1С:


Компонента.ДобавитьФайл(ПутьКФайлу1);
Компонента.ДобавитьФайл(ПутьКФайлу2);
Компонента.Склеить(ПутьКРезультату);

Преимущество: Не требуется устанавливать сторонний софт (принтеры или утилиты) на сервер или компьютеры пользователей. Достаточно загрузить DLL-файл компоненты в макет конфигурации. При необходимости можно использовать готовое решение для сжатия и обработки PDF на базе Poppler и iTextSharp.

6. Современный подход: Python-скрипты

Если на сервере установлен интерпретатор Python, 1С может вызывать короткие скрипты, использующие такие библиотеки, как PyPDF2 или pikepdf. Проанализируем этот вариант: он дает колоссальную гибкость. Например, можно не просто склеить два файла, а извлечь только четные страницы из одного документа и нечетные из другого, или "на лету" наложить водяные знаки (watermarks) и сквозную нумерацию страниц в процессе объединения.

Подводя итог, выбор инструмента зависит от архитектуры вашей системы. Если все данные формируются внутри 1С — используйте ТабличныйДокумент. Если нужно быстро и бесплатно склеивать внешние файлы — лучшим выбором станет консольная утилита PDFTK. Для глубокой программной интеграции и сложной обработки файлов стоит смотреть в сторону COM-объектов или написания внешних компонент.

← На главную