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

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

При работе с печатными формами в 1С программисты часто сталкиваются с ситуацией, когда стандартный метод Записать() для объекта ТабличныйДокумент выдает PDF-файл избыточного размера. Особенно остро проблема проявляется, если в документе присутствуют изображения (логотипы, подписи, фотографии товаров). Файл весом в 10 Мб и более становится невозможно отправить по электронной почте или прикрепить к электронному документообороту. В этой статье мы подробно разберем, как решить задачу сжатия и объединения PDF-файлов с помощью различных инструментов.

Анализ проблемы: почему файлы в 1С получаются тяжелыми?

Проанализируем ситуацию: изначально картинки могут весить всего по 300 кБ, но итоговый PDF-документ разрастается до гигантских размеров. Это происходит из-за того, что механизмы платформы 1С при формировании PDF могут вставлять изображения без должной оптимизации или использовать форматы с низким уровнем сжатия для сохранения четкости. Кроме того, если в маленькую ячейку таблицы вставлено фото высокого разрешения (например, 12 Мп), 1С сохранит все точки исходного изображения внутри PDF, хотя для печати или просмотра достаточно значительно меньшего разрешения.

Вариант 1. Использование COM-объекта Adobe Acrobat

Многие разработчики пытаются использовать COM-соединение с Adobe Acrobat для манипуляций с файлами. Однако здесь кроется главная ловушка. Рассмотрим подробнее разницу между версиями этого ПО.

Если в системе установлен бесплатный Adobe Acrobat Reader, то через COM-объект AcroPDF.PDF вы сможете только отобразить файл на форме. Попытка вызвать методы сохранения или модификации приведет к ошибке, так как эти функции в бесплатной версии заблокированы.

Посмотрим на пример кода, который часто пытаются использовать, но который не будет работать в обычном ридере:


// Данный код вызовет ошибку на методе SaveFile в бесплатном Reader
Acro = Новый COMОбъект("AcroPDF.PDF");
Acro.LoadFile("D:\Documents\Report.pdf");
Acro.SaveFile("D:\Documents\Report_Compressed.pdf"); // Ошибка: Метод не поддерживается

Для полноценной работы (сжатия и объединения) необходим платный Adobe Acrobat Pro. В нем используется объект AcroExch.PDDoc. Разберем логику объединения файлов через этот объект:

  1. Создаем объект основного документа.
  2. Создаем объект документа, который нужно присоединить.
  3. Используем метод InsertPages для вставки страниц из второго документа в первый.
  4. Сохраняем результат.

Сжатие в Acrobat Pro программно чаще всего реализуется через виртуальный принтер Adobe PDF Distiller. Мы отправляем файл на печать на этот принтер, передавая параметры качества (JobOptions), что позволяет уменьшить размер в несколько раз.

Вариант 2. Использование виртуальных PDF-принтеров (бесплатный путь)

Если бюджет проекта не подразумевает покупку дорогостоящих лицензий Adobe, проанализируем альтернативные варианты. Существует ряд бесплатных (для определенных условий использования) виртуальных принтеров, таких как PDF24, Bullzip PDF Printer, PDFCreator.

Эти программы позволяют настроить профили автоматического сохранения. Рассмотрим алгоритм работы с ними из 1С:

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

Этот способ отлично подходит для сжатия «на лету» в момент формирования документа.

Вариант 3. Профессиональное решение через Ghostscript

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

Рассмотрим пример команды для сжатия PDF (пресет /ebook обеспечивает оптимальный баланс веса и качества):


Команда = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=ВыходнойФайл.pdf ВходнойФайл.pdf";
ЗапуститьПриложение(Команда, , Истина);

Чтобы объединить несколько файлов в один, достаточно перечислить их через пробел перед параметром выходного файла. Это работает чрезвычайно быстро и стабильно.

Вариант 4. Оптимизация на стороне 1С (DPI картинок)

Прежде чем прибегать к внешним утилитам, выясним причину избыточного веса в самом коде 1С. Если вы вставляете картинку в ТабличныйДокумент, убедитесь, что она предварительно подготовлена.

Практические советы по подготовке картинок:

Вариант 5. Консольные утилиты для объединения (PDFTK)

Если задача стоит только в объединении нескольких готовых PDF в один «пакет», незаменимым инструментом является PDFTK (PDF Toolkit). Это крошечная утилита, которая делает сборку документов мгновенной.

Пример команды для объединения из 1С:


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

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

Выбор метода зависит от ваших технических условий и бюджета:

  1. Adobe Acrobat Pro — мощно, но дорого. Требует установки на каждом рабочем месте.
  2. Виртуальные принтеры (PDF24 и др.) — удобно для клиентских приложений, где важна простота настройки пользователем.
  3. Ghostscript / PDFTK — самый надежный и быстрый вариант для серверных задач и массовой обработки документов.

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

← На главную