Как наложить PDF на макет или объединить печатную форму 1С с готовым PDF на одном листе?

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

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

Рассмотрим особенности работы платформы 1С с форматом PDF, проанализируем ограничения штатных инструментов и подробно разберем рабочие варианты решения задачи с помощью консольных утилит и системной интеграции.

Ограничения штатных механизмов 1С при работе с PDF

Объект платформы ТабличныйДокумент позволяет легко выгружать сформированные печатные формы в файл PDF с помощью метода Записать() с параметром ТипФайлаТабличногоДокумента.PDF. Однако выполнить обратную операцию — внедрить готовый многостраничный или векторный PDF-файл непосредственно в ячейки макета или коллекцию Рисунки — средствами платформы напрямую невозможно.

Штатный механизм вставки через ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка) поддерживает растровые и векторные форматы изображений (PNG, JPG, BMP, SVG), но не принимает PDF. Поэтому для решения задачи используют два основных подхода:

  1. Штатное формирование штрихкода или штампа в виде изображения без использования промежуточного PDF.
  2. Послойное объединение двух готовых PDF-файлов (печать из 1С + внешний файл) с помощью внешних консольных утилит или библиотек.

Вариант 1. Послойное наложение через PDFtk (режимы stamp и multistamp)

Популярным решением для работы с PDF является консольная утилита PDFtk. Разберем типичную ошибку: при использовании стандартной команды объединения cat второй документ добавляется отдельной страницей в конец или начало файла. Чтобы наложить один документ поверх другого в пределах одной страницы (по принципу штампа или слоев), необходимо использовать команду stamp или multistamp.

Посмотрим на пример формирования bat-файла и вызова утилиты из кода 1С:


ПутьККаталогу = "C:\Temp\";
ФайлНакладной = ПутьККаталогу + "Invoice.pdf";
ФайлШтампа    = ПутьККаталогу + "BarcodeStamp.pdf";
ИтоговыйФайл  = ПутьККаталогу + "Result.pdf";

// Формируем командный файл с кодировкой cp866 для поддержки кириллических путей
ТекстБат = Новый ТекстовыйДокумент;
ТекстБат.ДобавитьСтроку("@echo off");
ТекстБат.ДобавитьСтроку("cd /d """ + ПутьККаталогу + """");
ТекстБат.ДобавитьСтроку("pdftk """ + ФайлНакладной + """ stamp """ + ФайлШтампа + """ output """ + ИтоговыйФайл + """");

ИмяБатФайла = ПутьККаталогу + "merge_pdf.bat";
ТекстБат.Записать(ИмяБатФайла, "cp866");

// Запускаем утилиту в синхронном режиме с ожиданием завершения
ЗапуститьПриложение(ИмяБатФайла, ПутьККаталогу, Истина);

Разберем различия в режимах работы утилиты:

  1. stamp — берет первую страницу файла со штампом и накладывает ее поверх первой страницы базового документа.
  2. background — помещает второй файл в качестве фоновой подложки под базовый документ (подходит, если в основном документе не перекрыт белый фон).
  3. multistamp / multibackground — применяются, когда необходимо наложить штампы постранично для многостраничных документов одинакового размера.

Вариант 2. Использование современной утилиты QPDF

Утилита QPDF является современным аналогом PDFtk, корректно обрабатывающим новейшие спецификации PDF (включая сжатые таблицы перекрестных ссылок XRef и шифрование). Синтаксис наложения выполняется одной строкой:


КомандаЗапуска = "qpdf """ + ФайлНакладной + """ --overlay """ + ФайлШтампа + """ -- """ + ИтоговыйФайл + """";
ЗапуститьПриложение(КомандаЗапуска, "", Истина);

Если требуется поместить документ на задний план, параметр --overlay заменяется на --underlay.

Вариант 3. Использование ImageMagick (convert.exe)

Если накладываемые элементы или исходные документы имеют нестандартное разрешение или требуют изменения масштаба, можно использовать утилиту ImageMagick. Параметр -adjoin позволяет совмещать графические потоки:


КомандаКонвертации = "convert.exe """ + ФайлНакладной + """ """ + ФайлШтампа + """ -adjoin """ + ИтоговыйФайл + """";
ЗапуститьПриложение(КомандаКонвертации, "", Истина);

Важные технические нюансы при совмещении слоев

Чтобы итоговый документ отображался корректно, проанализируем частые причины проблем при наложении:

  1. Прозрачность фона: Накладываемый PDF (например, со штрихкодом) обязательно должен иметь прозрачный фон страницы. Если файл сгенерирован с непрозрачной белой заливкой листа, операция stamp или overlay перекроет собой весь текст накладной, расположенный под ним.
  2. Система координат (MediaBox): Консольные утилиты совмещают слои по левому нижнему углу документа (0, 0). Чтобы элемент встал строго в верхний правый угол накладной, он должен быть сгенерирован на странице того же формата (например, А4) именно в требуемых координатах.
  3. Конвертация в растр: Если исходный штрихкод невозможно сформировать с прозрачным фоном в PDF, его можно предварительно сконвертировать в BMP или PNG с помощью внешней компоненты, обрезать пустые поля и штатно поместить в ТабличныйДокумент.Рисунки перед экспортом в итоговый PDF.
← На главную