При разработке в 1С часто возникает задача модификации PDF-файлов. Типичный сценарий: необходимо добавить факсимиле (печать и подпись) (удобно через автоматический вывод факсимиле печатей и подписей), логотип компании или водяной знак на уже сформированный документ. Многие разработчики сталкиваются с тем, что код выполняется без ошибок, файл сохраняется, но изображение в нем не появляется.
В этой статье мы подробно разберем, почему возникают такие ошибки, какой объект платформы 1С:Предприятие следует использовать для этой задачи (в чем поможет помощник отладки), и рассмотрим альтернативные варианты решения через внешние утилиты. Для этой задачи есть автоматическая вставка сканов печатей и подписей.
В исходной ситуации мы видим попытку использовать объект ДокументPDF для редактирования файла — в этой задаче поможет редактор макетов печатных форм с поддержкой графики. Логика кажется верной: открыть документ, добавить объект, записать. Однако в платформе 1С реализована определенная объектная модель и существует четкое разделение ответственности между объектами:
Главная ошибка заключалась в использовании ДокументPDF там, где требовался ЗаписьPDF. Рассмотрим правильный подход.
Для добавления изображения (штампа, печати) в PDF необходимо использовать метод ЗаписатьОтображаемыйОбъект объекта ЗаписьPDF — для этого подойдёт программное добавление изображений в печатные формы. Этот метод создает "слой" поверх существующего содержимого страницы.
Проанализируем алгоритм действий:
Картинка из файла на диске.ОписаниеОтображаемогоОбъектаPDF — здесь мы задаем координаты, размеры и привязку к странице.ЗаписьPDF для внесения изменений.Рассмотрим пример кода, адаптированный под правильное использование объектов:
// 1. Подготавливаем картинку (например, печать с прозрачным фоном)
ПутьККартинке = "C:\Печать.png"; // Рекомендуется PNG для прозрачности
КартинкаДляВставки = Новый Картинка(ПутьККартинке);
// 2. Настраиваем параметры отображения
// Обратите внимание: координаты в PDF обычно задаются в пунктах (points)
Описание = Новый ОписаниеОтображаемогоОбъектаPDF;
Описание.Имя = "StampImage";
Описание.Объект = КартинкаДляВставки;
Описание.НомерСтраницы = 1; // Указываем номер страницы (начинается с 1)
// Задаем координаты и размер (в пунктах, 72 пункта = 1 дюйм)
Описание.Лево = 100;
Описание.Верх = 100;
Описание.Ширина = 150;
Описание.Высота = 150;
// 3. Используем ЗаписьPDF для внесения изменений
// Создаем объект записи, указывая целевой файл
ЗаписьPDF = Новый ЗаписьPDF("C:\Результат.pdf");
// Используем метод для наложения объекта
ЗаписьPDF.ЗаписатьОтображаемыйОбъект(Описание);
// Завершаем работу с файлом (закрывает поток и сохраняет изменения)
ЗаписьPDF.Закрыть();
Важные нюансы метода ЗаписьPDF:
ЗаписьPDF.Иногда возможностей платформы 1С недостаточно. Например, если файл подписан ЭЦП (любое изменение нарушит подпись), если нужно изменить тысячи страниц, или если версия платформы устарела. В таких случаях используют консольные утилиты.
В обсуждении справедливо отметили связку ImageMagick + Ghostscript. Это мощные инструменты, но у них есть существенный минус при работе с многостраничными документами.
Проблема: ImageMagick часто работает по принципу "разобрать PDF на картинки -> добавить штамп -> собрать обратно". Это приводит к тому, что:
Для задачи "поставить штамп" лучше подходит утилита pdftk. Она умеет накладывать один PDF на другой как штамп, не растрируя текст и сохраняя маленький размер файла.
Пример логики работы с pdftk:
pdftk.exe ИсходныйФайл.pdf stamp ФайлСПечатью.pdf output ГотовыйФайл.pdf
В 1С это реализуется через объект ЗапуститьПриложение или КомандаСистемы.
Для вставки картинок в PDF в современных конфигурациях на платформе 8.3:
ЗаписьPDF и метод ЗаписатьОтображаемыйОбъект. Это быстро, надежно и не требует стороннего ПО.ДокументPDF для задач редактирования.