При работе с печатными формами в 1С программисты часто сталкиваются с ситуацией, когда стандартный метод Записать() для объекта ТабличныйДокумент выдает PDF-файл избыточного размера. Особенно остро проблема проявляется, если в документе присутствуют изображения (логотипы, подписи, фотографии товаров). Файл весом в 10 Мб и более становится невозможно отправить по электронной почте или прикрепить к электронному документообороту. В этой статье мы подробно разберем, как решить задачу сжатия и объединения PDF-файлов с помощью различных инструментов.
Проанализируем ситуацию: изначально картинки могут весить всего по 300 кБ, но итоговый PDF-документ разрастается до гигантских размеров. Это происходит из-за того, что механизмы платформы 1С при формировании PDF могут вставлять изображения без должной оптимизации или использовать форматы с низким уровнем сжатия для сохранения четкости. Кроме того, если в маленькую ячейку таблицы вставлено фото высокого разрешения (например, 12 Мп), 1С сохранит все точки исходного изображения внутри PDF, хотя для печати или просмотра достаточно значительно меньшего разрешения.
Многие разработчики пытаются использовать 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. Разберем логику объединения файлов через этот объект:
InsertPages для вставки страниц из второго документа в первый.Сжатие в Acrobat Pro программно чаще всего реализуется через виртуальный принтер Adobe PDF Distiller. Мы отправляем файл на печать на этот принтер, передавая параметры качества (JobOptions), что позволяет уменьшить размер в несколько раз.
Если бюджет проекта не подразумевает покупку дорогостоящих лицензий Adobe, проанализируем альтернативные варианты. Существует ряд бесплатных (для определенных условий использования) виртуальных принтеров, таких как PDF24, Bullzip PDF Printer, PDFCreator.
Эти программы позволяют настроить профили автоматического сохранения. Рассмотрим алгоритм работы с ними из 1С:
Напечатать(), выбрав в качестве принтера установленный виртуальный драйвер.Этот способ отлично подходит для сжатия «на лету» в момент формирования документа.
Для серверных решений и автоматизации без участия пользователя лучшим выбором будет использование Ghostscript. Это мощная библиотека с открытым кодом для обработки PDF. Она позволяет объединять и сжимать файлы через командную строку, что легко реализовать в 1С с помощью функции ЗапуститьПриложение.
Рассмотрим пример команды для сжатия PDF (пресет /ebook обеспечивает оптимальный баланс веса и качества):
Команда = "gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=ВыходнойФайл.pdf ВходнойФайл.pdf";
ЗапуститьПриложение(Команда, , Истина);
Чтобы объединить несколько файлов в один, достаточно перечислить их через пробел перед параметром выходного файла. Это работает чрезвычайно быстро и стабильно.
Прежде чем прибегать к внешним утилитам, выясним причину избыточного веса в самом коде 1С. Если вы вставляете картинку в ТабличныйДокумент, убедитесь, что она предварительно подготовлена.
Практические советы по подготовке картинок:
Картинка можно программно изменить размер изображения, приведя его к физическому размеру ячейки в табличном документе.Если задача стоит только в объединении нескольких готовых PDF в один «пакет», незаменимым инструментом является PDFTK (PDF Toolkit). Это крошечная утилита, которая делает сборку документов мгновенной.
Пример команды для объединения из 1С:
Команда = "pdftk file1.pdf file2.pdf cat output combined.pdf";
ЗапуститьПриложение(Команда, , Истина);
Выбор метода зависит от ваших технических условий и бюджета:
Рекомендуем начать с проверки параметров вставляемых изображений в 1С, так как это самый "чистый" способ, не требующий установки стороннего ПО. Если же это не помогает, Ghostscript станет вашим верным помощником в борьбе с "тяжелыми" PDF-документами.