Как программно добавить картинку в существующий PDF-файл в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке в 1С часто возникает задача модификации PDF-файлов. Типичный сценарий: необходимо добавить факсимиле (печать и подпись) (удобно через автоматический вывод факсимиле печатей и подписей), логотип компании или водяной знак на уже сформированный документ. Многие разработчики сталкиваются с тем, что код выполняется без ошибок, файл сохраняется, но изображение в нем не появляется.

В этой статье мы подробно разберем, почему возникают такие ошибки, какой объект платформы 1С:Предприятие следует использовать для этой задачи (в чем поможет помощник отладки), и рассмотрим альтернативные варианты решения через внешние утилиты. Для этой задачи есть автоматическая вставка сканов печатей и подписей.

Разбираем основную ошибку: ДокументPDF против ЗаписьPDF

В исходной ситуации мы видим попытку использовать объект ДокументPDF для редактирования файла — в этой задаче поможет редактор макетов печатных форм с поддержкой графики. Логика кажется верной: открыть документ, добавить объект, записать. Однако в платформе 1С реализована определенная объектная модель и существует четкое разделение ответственности между объектами:

  1. ДокументPDF — этот объект предназначен преимущественно для визуального отображения PDF-документа пользователю (аналог просмотра). Он позволяет читать файл, получать информацию о страницах, но его методы модификации часто работают только в контексте текущего просмотра и не всегда корректно сохраняются при перезаписи файла, что может выявить анализ конфигурации на наличие ошибок.
  2. ЗаписьPDF — это специализированный объект, предназначенный именно для генерации и модификации структуры PDF-файла. Начиная с версии платформы 8.3.10+, он поддерживает метод, который нам необходим для решения задачи.

Главная ошибка заключалась в использовании ДокументPDF там, где требовался ЗаписьPDF. Рассмотрим правильный подход.

Решение штатными средствами 1С

Для добавления изображения (штампа, печати) в PDF необходимо использовать метод ЗаписатьОтображаемыйОбъект объекта ЗаписьPDF — для этого подойдёт программное добавление изображений в печатные формы. Этот метод создает "слой" поверх существующего содержимого страницы.

Проанализируем алгоритм действий:

  1. Создаем объект Картинка из файла на диске.
  2. Создаем описание объекта через ОписаниеОтображаемогоОбъектаPDF — здесь мы задаем координаты, размеры и привязку к странице.
  3. Используем Запись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:

Альтернативные решения: внешние утилиты

Иногда возможностей платформы 1С недостаточно. Например, если файл подписан ЭЦП (любое изменение нарушит подпись), если нужно изменить тысячи страниц, или если версия платформы устарела. В таких случаях используют консольные утилиты.

1. QPDF и ImageMagick

В обсуждении справедливо отметили связку ImageMagick + Ghostscript. Это мощные инструменты, но у них есть существенный минус при работе с многостраничными документами.

Проблема: ImageMagick часто работает по принципу "разобрать PDF на картинки -> добавить штамп -> собрать обратно". Это приводит к тому, что:

2. PDFtk (The PDF Toolkit)

Для задачи "поставить штамп" лучше подходит утилита pdftk. Она умеет накладывать один PDF на другой как штамп, не растрируя текст и сохраняя маленький размер файла.

Пример логики работы с pdftk:

  1. Подготавливаем PDF-файл, содержащий только картинку печати в нужном месте (прозрачный фон).
  2. Вызываем команду объединения:

pdftk.exe ИсходныйФайл.pdf stamp ФайлСПечатью.pdf output ГотовыйФайл.pdf

В 1С это реализуется через объект ЗапуститьПриложение или КомандаСистемы.

Резюме

Для вставки картинок в PDF в современных конфигурациях на платформе 8.3:

  1. Используйте объект ЗаписьPDF и метод ЗаписатьОтображаемыйОбъект. Это быстро, надежно и не требует стороннего ПО.
  2. Избегайте использования ДокументPDF для задач редактирования.
  3. Следите за форматом картинки (лучше PNG) и единицами измерения координат.
  4. Если встроенных средств не хватает (сложная обработка, огромные файлы), рассмотрите использование pdftk или qpdf, избегая полной растеризации документа — для этого есть инструмент для маркировки PDF и распознавания сканов.
← На главную