При работе в 1С версии 8.2 (и некоторых сборках 8.3) программисты часто сталкиваются с неприятной особенностью: небольшой ТабличныйДокумент, содержащий всего пару фотографий, при сохранении в формате PDF превращается в файл объемом в десятки мегабайт. Казалось бы, исходные картинки весят по 1-2 Мб, но итоговый документ может достигать 26 Мб и более. В этой статье мы вместе разберем внутренние механизмы платформы, которые приводят к такому результату, и проанализируем способы оптимизации веса PDF-контейнера.
Проанализируем ситуацию: PDF — это не просто формат, это контейнер. Когда мы используем стандартный метод Записать() с типом файла ТипФайлаТабличногоДокумента.PDF, 1С задействует встроенный движок конвертации. Основная проблема кроется в том, как этот движок обрабатывает объект Картинка.
В старых версиях платформы (8.2.19 и ранее) встроенный конвертер часто не умеет вставлять JPEG-данные в PDF «как есть» (методом DCTDecode). Вместо этого происходит следующее: платформа «разворачивает» сжатый JPEG в полноценный растровый массив (Bitmap). Это означает, что каждый пиксель изображения теперь занимает фиксированное количество байт (обычно 3 или 4 байта в зависимости от цветовой модели). После этого данные упаковываются простым алгоритмом сжатия без потерь (например, FlateDecode), который крайне неэффективен для фотографий высокого разрешения. В итоге картинка, которая в JPEG весила 1.3 Мб благодаря эффективным алгоритмам сжатия, в PDF превращается в «сырой» массив данных весом в 10-20 раз больше.
Давайте посмотрим на цифры, приведенные в обсуждении. Исходная картинка имеет разрешение 3888х2592 пикселей. Для печати на обычном листе формата А4 при стандартном качестве 300 DPI достаточно разрешения примерно 2480х3508. Однако для экранного просмотра или печати документов в 1С такое огромное разрешение часто является избыточным.
Важный нюанс: даже если вы визуально уменьшили картинку в макете ТабличныйДокумент, растянув ее границы мышкой, 1С все равно хранит внутри исходное количество пикселей. При конвертации в PDF движок пытается сохранить исходную детализацию, что и приводит к раздуванию файла.
Как показала практика, самым эффективным способом является предварительная подготовка изображения перед его выводом в ТабличныйДокумент. Если мы уменьшим физическое количество пикселей, вес PDF упадет пропорционально. Рассмотрим, как это можно реализовать.
Для платформы 8.2 хорошим результатом является приведение картинок к разрешению около 1024х768 или чуть больше, если требуется высокая четкость. Проанализируем пример логики обработки изображения:
// Пример логики подготовки картинки
КартинкаИзФайла = Новый Картинка(ПутьКФайлу);
// Если разрешение слишком высокое, имеет смысл пересохранить
// картинку во временный файл с меньшим качеством или размером
// средствами внешних компонент или через объект "Картинка" (в 8.3)
ТабДок = Новый ТабличныйДокумент;
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаИзФайла;
Рисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;
Как подтверждено в ходе обсуждения, уменьшение разрешения до 1024х768 позволило снизить вес итогового PDF с 26 Мб до 2.27 Мб без существенной потери визуального качества документа.
Разберем еще один скрытый фактор — прозрачность и фон. Если у объекта Рисунок в табличном документе установлено свойство Узор или выбран специфический ЦветФона (отличный от прозрачного), 1С может принудительно наложить маску на изображение при формировании PDF. Это заставляет конвертер использовать еще более тяжелые методы упаковки данных.
Чтобы минимизировать размер, рекомендуется придерживаться следующих правил:
ЦветФона рисунка в значение "Авто" или явно задавайте прозрачность.Линия у рисунка имеет тип "Без линии", если рамка не требуется.Если программное изменение разрешения невозможно или встроенный движок 1С продолжает выдавать неудовлетворительный результат, рассмотрим использование внешних инструментов. Виртуальные принтеры (такие как PDFCreator, PDF24 или Adobe Distiller) имеют гораздо более гибкие настройки оптимизации растра.
В настройках таких принтеров (например, в Adobe Distiller) можно принудительно выставить параметры Downsampling (уменьшение разрешения до заданного порога, например, до 150 DPI) и Compression (пересжатие всех входящих изображений в JPEG с заданным уровнем качества). Это позволяет получить компактный файл даже из «тяжелого» табличного документа.
Подводя итог, можно выделить следующие шаги для оптимизации размера PDF в 1С:
JPEG.Соблюдение этих простых правил позволит вам создавать профессиональные и легкие отчеты, которые будет удобно отправлять по электронной почте и хранить в архивах организации.