Проблема избыточного веса PDF-документов, сформированных в среде 1С, знакома многим разработчикам. Особенно остро она проявляется, когда в ТабличныйДокумент вставляются изображения (логотипы, фотографии товаров, сканы документов). Стандартный механизм сохранения платформы 1С не всегда эффективно оптимизирует графику, что приводит к созданию файлов размером в десятки мегабайт. В этой статье мы подробно разберем, почему это происходит, и проанализируем различные методы решения: от манипуляций внутри кода 1С до использования профессиональных внешних утилит.
Прежде чем переходить к решениям, выясним причину возникновения проблемы. При вызове метода Записать() с типом файла ТипФайлаТабличногоДокумента.PDF платформа может включать изображения в итоговый документ практически без потери качества и сжатия. Кроме того, в файл могут внедряться шрифты, а настройки масштабирования могут приводить к неоправданно высокому виртуальному разрешению графических объектов. Проанализируем ситуацию: если в макет вставлено фото весом 5 МБ, итоговый PDF может увеличиться ровно на этот объем, даже если на листе картинка занимает всего пару сантиметров.
Самый правильный подход — подготовить данные еще до того, как они попадут в PDF. Если мы уменьшим вес исходной картинки в коде 1С, итоговый файл пропорционально станет легче. Рассмотрим, как это сделать программно.
В современных версиях платформы 1С (8.3.10+) объект Картинка обладает методом Преобразовать(), который позволяет изменить формат и качество изображения. Разберем по шагам алгоритм действий:
ТабличныйДокумент.Посмотрим на пример кода:
// Получаем картинку из объекта или файла
ИсходнаяКартинка = Новый Картинка("C:\temp\large_photo.jpg");
// Преобразуем картинку для уменьшения веса
// Параметры: Формат, Качество (от 1 до 100)
НоваяКартинка = ИсходнаяКартинка.Преобразовать(ФорматКартинки.JPEG, 75);
// Вставляем в область табличного документа
ОбластьМакета = Макет.ПолучитьОбласть("Подпись");
Рисунок = ОбластьМакета.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = НоваяКартинка;
Этот метод позволяет сократить размер итогового PDF в несколько раз, не прибегая к сторонним библиотекам.
Если файл уже сформирован и его нужно сжать "на лету", наиболее мощным бесплатным инструментом является Ghostscript. Это интерпретатор языка PostScript и формата PDF, который можно вызвать из 1С через командную строку.
Рассмотрим подробнее, как автоматизировать этот процесс. Утилита принимает параметры, которые определяют качество итогового документа. Например, профиль /screen обеспечит минимальный размер (72 dpi), а /ebook — среднее качество (150 dpi), идеально подходящее для офисных документов.
Пример вызова Ghostscript из кода 1С:
ПутьКПрограмме = "C:\Program Files\gs\gs9.54.0\bin\gswin64c.exe";
ФайлИсточник = "C:\temp\big_report.pdf";
ФайлРезультат = "C:\temp\compressed_report.pdf";
// Формируем строку запуска с параметрами сжатия
ПараметрыЗапуска = "-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=" + ФайлРезультат + " " + ФайлИсточник;
// Запускаем приложение и ждем завершения
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска, , Истина);
Этот способ крайне эффективен для массовой обработки документов на сервере, так как он не требует взаимодействия с пользователем и работает очень быстро.
Еще один надежный способ — использование виртуальных принтеров, таких как PDFCreator или Bullzip PDF Printer. В отличие от стандартного сохранения 1С, эти программы позволяют гибко настраивать алгоритмы сжатия PDF. Главное преимущество здесь — наличие COM-интерфейса.
Проанализируем работу с таким объектом. Вместо метода Записать(), мы используем метод Напечатать(), предварительно настроив принтер через программный интерфейс. Рассмотрим схематичный пример работы с PDFCreator:
// Создаем объект принтера
PDFCreator = Новый COMОбъект("PDFCreator.JobQueue");
PDFCreator.Initialize();
// Отправляем табличный документ на печать
ТабДок.Напечатать(РежимИспользованияПринтера.Использовать);
// Ожидаем появление задания в очереди и применяем профиль сжатия
Если PDFCreator.WaitForJob(10) Тогда
Задание = PDFCreator.NextJob;
Задание.SetProfileByGuid("LowQuality"); // Профиль с высоким сжатием
Задание.ConvertTo(ПутьКФайлу);
КонецЕсли;
Важный момент: использование виртуальных принтеров требует их предварительной установки на рабочие места пользователей или сервер.
В ситуациях, когда нет возможности устанавливать стороннее ПО на сервер, можно воспользоваться облачными сервисами, такими как ILovePDF или CloudConvert. Выясним, как организовать такое взаимодействие. Большинство сервисов предоставляют REST API, к которому можно обратиться с помощью объекта HTTPСоединение в 1С.
Алгоритм взаимодействия будет следующим:
POST на сервер сервиса.Хотя этот метод требует наличия интернет-соединения и может быть платным при больших объемах, он обеспечивает высочайшую степень сжатия без нагрузки на собственные мощности предприятия.
Иногда причина огромного размера файла кроется в настройках самого макета. Разберем ситуацию: если в ТабличныйДокумент установлен параметр Автомасштаб = Истина, 1С при рендеринге в PDF может создавать документ с избыточной плотностью точек. Попробуйте установить фиксированный масштаб или проверить параметры страницы перед сохранением. Также стоит убедиться, что вы используете актуальную версию платформы (не ниже 8.3.15), так как механизмы экспорта в PDF постоянно совершенствуются разработчиками "1С".
Мы рассмотрели несколько подходов к решению проблемы "тяжелых" PDF-файлов. Если вы хотите решить задачу исключительно средствами 1С, сосредоточьтесь на объекте Картинка и его методе Преобразовать(). Для максимального сжатия без компромиссов используйте Ghostscript. Если же вам нужна гибкая настройка печати, выбирайте виртуальные принтеры с COM-интерфейсом. Выбор метода зависит от ваших технических ограничений и требуемой степени автоматизации.