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

Программист 1С v8.3 (Обычные формы)
← На главную

Часто разработчики сталкиваются с ситуацией, когда стандартный метод платформы 1С Записать() при сохранении табличного документа в формат PDF генерирует файлы избыточного объема. Например, документ с парой логотипов может «вырасти» до 20–30 Мб, что делает невозможной его отправку по электронной почте из-за ограничений почтовых серверов. Проанализируем причины этой проблемы и разберем по шагам эффективные способы оптимизации размера выходного файла.

Выясним причину: почему PDF получается таким тяжелым?

Прежде чем переходить к решениям, разберем ситуацию. Основная нагрузка на объем файла в 1С ложится на два компонента: изображения и шрифты. Платформа 1С при формировании PDF зачастую внедряет изображения в их исходном разрешении, а иногда и перепаковывает их в менее эффективные форматы. Кроме того, в файл могут встраиваться полные наборы используемых шрифтов (Font Embedding), что добавляет по несколько мегабайт на каждое начертание. Если в вашем макете используются картинки с прозрачностью (PNG), платформа может обрабатывать их сложным образом, что еще сильнее увеличивает итоговый вес.

Решение 1. Оптимизация изображений перед помещением в макет

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

  1. Изменение формата: Если прозрачность не является критически важной, замените формат PNG на JPG. Это значительно снизит базовый вес картинки.
  2. Сжатие разрешения: Часто в макет вставляются фотографии с разрешением 3000х4000 пикселей, которые в печатной форме сжимаются до размеров 2х3 сантиметра. 1С все равно может хранить внутри PDF исходное «тяжелое» изображение. Рекомендуется программно или вручную уменьшить физический размер картинки до целевого.
  3. Программное сжатие в 1С: В современных версиях платформы (8.3.10+) мы можем использовать объект Картинка для изменения качества. Рассмотрим пример кода:

// Пример подготовки картинки перед выводом в табличный документ
КартинкаОбъект = Новый Картинка("C:\temp\logo_highres.png");
// Преобразуем в JPG с потерей качества (например, до 70%)
НоваяКартинка = КартинкаОбъект.Преобразовать(ФорматКартинки.JPEG);
// Помещаем оптимизированную картинку в область макета
ОбластьМакета.Рисунки.Логотип.Картинка = НоваяКартинка;

Решение 2. Использование внешних виртуальных принтеров

Если штатный метод Записать() не дает нужного результата даже после оптимизации картинок, проанализируем ситуацию с использованием виртуальных PDF-принтеров (например, Bullzip PDF Printer или PDFCreator). Эти программы позволяют более тонко управлять процессом дистилляции PDF-файла.

При использовании этого метода мы не «сохраняем» файл, а «печатаем» его на специальное устройство. Программная реализация через COM-объект может выглядеть так (на примере PDFCreator):


// Пример взаимодействия с PDFCreator через COM
PDFCreator = Новый COMОбъект("PDFCreator.JobQueue");
PDFCreator.Initialize();
ТабДок.Напечатать(ТипПринтера.Системный, "PDFCreator");
// Далее следует программное ожидание задания и сохранение в файл с заданным профилем сжатия

Важный нюанс: Этот способ требует установки стороннего ПО на сервер или клиентское рабочее место, что не всегда допустимо в закрытых корпоративных средах. Однако он позволяет принудительно ограничить DPI всех изображений до 150 или 72, что радикально уменьшает размер файла.

Решение 3. Использование MS Word как промежуточного звена

Достаточно экзотичный, но рабочий метод — сохранение табличного документа в формат .docx с последующей конвертацией в PDF средствами Microsoft Word. Движок Word зачастую более эффективно сжимает графику и оптимизирует шрифтовую подсистему.

Рассмотрим по шагам программный код для такой конвертации:


ИмяФайлаВорд = "C:\temp\doc.docx";
ИмяФайлаПДФ = "C:\temp\result.pdf";
ТабДок.Записать(ИмяФайлаВорд, ТипФайлаТабличногоДокумента.Docx);

MSWord = Новый COMОбъект("Word.Application");
MSWord.Visible = Ложь;
Документ = MSWord.Documents.Open(ИмяФайлаВорд);
// Параметр 17 соответствует формату PDF в перечислении WdSaveFormat
Документ.SaveAs(ИмяФайлаПДФ, 17);
Документ.Close();
MSWord.Quit();

Этот метод гарантирует хорошую читаемость текста, так как он сохраняется именно текстом, а не картинкой, и Word корректно обрабатывает внедрение подмножеств шрифтов.

Решение 4. Профессиональная оптимизация через Ghostscript

Если ваша задача требует максимальной автоматизации на стороне сервера, проанализируем использование утилиты Ghostscript. Это мощный бесплатный инструмент командной строки, который умеет «пересобирать» готовые PDF-файлы, оптимизируя их структуру.

Логика работы следующая: 1С сохраняет «тяжелый» PDF стандартным методом во временную папку, после чего вызывается внешняя команда для сжатия этого файла. Пример команды для вызова из 1С:


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

Параметр -dPDFSETTINGS=/ebook устанавливает баланс между качеством и размером (150 dpi), что обычно идеально подходит для отправки документов по почте.

Рекомендации по версиям платформы

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

Резюме

Для эффективного сжатия PDF из 1С мы рекомендуем комбинированный подход: предварительно масштабируйте изображения под размер области макета, используйте JPG вместо PNG там, где это возможно, и при необходимости используйте внешние утилиты типа Ghostscript для финишной оптимизации готового документа.

← На главную