Часто разработчики сталкиваются с ситуацией, когда стандартный метод платформы 1С Записать() при сохранении табличного документа в формат PDF генерирует файлы избыточного объема. Например, документ с парой логотипов может «вырасти» до 20–30 Мб, что делает невозможной его отправку по электронной почте из-за ограничений почтовых серверов. Проанализируем причины этой проблемы и разберем по шагам эффективные способы оптимизации размера выходного файла.
Прежде чем переходить к решениям, разберем ситуацию. Основная нагрузка на объем файла в 1С ложится на два компонента: изображения и шрифты. Платформа 1С при формировании PDF зачастую внедряет изображения в их исходном разрешении, а иногда и перепаковывает их в менее эффективные форматы. Кроме того, в файл могут встраиваться полные наборы используемых шрифтов (Font Embedding), что добавляет по несколько мегабайт на каждое начертание. Если в вашем макете используются картинки с прозрачностью (PNG), платформа может обрабатывать их сложным образом, что еще сильнее увеличивает итоговый вес.
Как показывает практика и опыт участников обсуждения, наиболее действенный метод — это подготовка графического контента до того, как он попадет в ТабличныйДокумент. Рассмотрим этот процесс подробнее:
Картинка для изменения качества. Рассмотрим пример кода:
// Пример подготовки картинки перед выводом в табличный документ
КартинкаОбъект = Новый Картинка("C:\temp\logo_highres.png");
// Преобразуем в JPG с потерей качества (например, до 70%)
НоваяКартинка = КартинкаОбъект.Преобразовать(ФорматКартинки.JPEG);
// Помещаем оптимизированную картинку в область макета
ОбластьМакета.Рисунки.Логотип.Картинка = НоваяКартинка;
Если штатный метод Записать() не дает нужного результата даже после оптимизации картинок, проанализируем ситуацию с использованием виртуальных PDF-принтеров (например, Bullzip PDF Printer или PDFCreator). Эти программы позволяют более тонко управлять процессом дистилляции PDF-файла.
При использовании этого метода мы не «сохраняем» файл, а «печатаем» его на специальное устройство. Программная реализация через COM-объект может выглядеть так (на примере PDFCreator):
// Пример взаимодействия с PDFCreator через COM
PDFCreator = Новый COMОбъект("PDFCreator.JobQueue");
PDFCreator.Initialize();
ТабДок.Напечатать(ТипПринтера.Системный, "PDFCreator");
// Далее следует программное ожидание задания и сохранение в файл с заданным профилем сжатия
Важный нюанс: Этот способ требует установки стороннего ПО на сервер или клиентское рабочее место, что не всегда допустимо в закрытых корпоративных средах. Однако он позволяет принудительно ограничить DPI всех изображений до 150 или 72, что радикально уменьшает размер файла.
Достаточно экзотичный, но рабочий метод — сохранение табличного документа в формат .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 корректно обрабатывает внедрение подмножеств шрифтов.
Если ваша задача требует максимальной автоматизации на стороне сервера, проанализируем использование утилиты 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 для финишной оптимизации готового документа.