При работе в системе «1С:Документооборот 3.0» пользователи часто сталкиваются с неприятной технической особенностью: после наложения штампа электронной подписи (ЭП) файл PDF, который изначально весил несколько мегабайт, «раздувается» до десятков или даже сотен мегабайт. Разберем детально, почему это происходит, и проанализируем все доступные способы оптимизации этого процесса.
Для начала проанализируем внутреннюю логику системы. Основная причина кроется в способе визуализации штампа. В типовой конфигурации «1С:Документооборот» процесс наложения отметки о подписании реализован через внешнюю компоненту ImageMagick. Алгоритм работы программы выглядит следующим образом:
Проблема заключается в том, что если ваш исходный файл был текстовым (векторным), то после превращения каждой страницы в несжатую картинку высокого разрешения объем данных увеличивается в геометрической прогрессии. Например, текстовая страница занимает 50 КБ, а ее растровое представление в высоком качестве — уже 3-5 МБ. Для 16 страниц это дает колоссальный прирост веса.
Рассмотрим самый простой путь исправления ситуации без изменения программного кода. Качество и, соответственно, вес результирующего файла напрямую зависят от параметра Density (DPI), с которым ImageMagick обрабатывает документ.
Посмотрим, что можно изменить в настройках:
PDF/A, это добавляет метаданные и внедряет шрифты, что также увеличивает вес.Поскольку ImageMagick часто использует Ghostscript в качестве «движка» для работы с PDF, мы можем повлиять на результат через параметры командной строки. Проанализируем возможность передачи ключей сжатия. При сборке итогового файла полезно использовать параметры типа -dPDFSETTINGS=/ebook (среднее качество) или /screen (минимальный вес для просмотра на экране).
Если у вас есть доступ к редактированию кода, найдите место вызова внешней компоненты и попробуйте добавить параметры сжатия JPEG. Посмотрим на пример логики формирования команды:
// Пример модификации параметров вызова ImageMagick
ПараметрыЗапуска = "-density 150 -quality 80 -compress jpeg";
// Далее следует вызов обработки файла
Разберем более продвинутый метод, который используют опытные разработчики. Вместо того чтобы превращать весь документ в набор картинок, можно использовать библиотеку iTextSharp (или её аналоги на .NET). Этот инструмент позволяет работать с PDF на уровне объектов. Штамп накладывается как новый векторный слой поверх существующего контента, не затрагивая структуру остальных страниц.
Преимущества этого метода:
Если компания готова к использованию стороннего ПО, рассмотрим применение специализированных утилит. Например, программа pdftk умеет «накладывать» один PDF-файл (со штампом) на другой в качестве водяного знака (background или stamp).
Другой вариант — использование КриптоПро PDF. У этой программы есть консольная утилита cppdfutil.exe, которая позволяет пакетно подписывать и визуализировать штампы. Рассмотрим пример использования командной строки для этих целей:
// Пример использования внешней утилиты
Команда = "cppdfutil.exe -sign -v -f " + ПутьКФайлу + " -out " + ПутьКРезультату;
ЗапуститьПриложение(Команда,, Истина);
Проанализируем ситуацию: обязательно ли штамп должен быть внедрен в PDF? В некоторых бизнес-процессах достаточно использовать отсоединенную подпись (файл формата .sig или .p7s). В этом случае исходный файл PDF вообще не изменяется, а значит, его размер остается прежним. Штамп же можно визуализировать только при печати или в окне просмотра внутри 1С.
Если вы столкнулись с тем, что один файл раздувается, а другой (похожий) — нет, рекомендуем выполнить следующие действия:
ImageMagick складывает промежуточные картинки страниц.BMP без сжатия, это и есть причина раздувания. Попробуйте принудительно изменить формат промежуточных файлов на JPG.EF_00_...) были добавлены оптимизации алгоритмов сжатия.Резюме: Основной способ борьбы с увеличением веса — это уход от полной растеризации документа в пользу векторного наложения штампа или жесткая настройка параметров DPI и JPEG-сжатия в параметрах ImageMagick. Выбор метода зависит от ваших требований к качеству документа и возможности вносить изменения в программный код системы.