При автоматизации документооборота и складской логистики часто возникает задача совместить два независимых графических документа на одной странице. Типичный пример: из сторонней службы получен PDF-файл с готовым штрихкодом маркировки, транспортной этикеткой или факсимильной печатью, и его необходимо разместить поверх стандартной накладной или служебной записки, сформированной в 1С.
Рассмотрим особенности работы платформы 1С с форматом PDF, проанализируем ограничения штатных инструментов и подробно разберем рабочие варианты решения задачи с помощью консольных утилит и системной интеграции.
Объект платформы ТабличныйДокумент позволяет легко выгружать сформированные печатные формы в файл PDF с помощью метода Записать() с параметром ТипФайлаТабличногоДокумента.PDF. Однако выполнить обратную операцию — внедрить готовый многостраничный или векторный PDF-файл непосредственно в ячейки макета или коллекцию Рисунки — средствами платформы напрямую невозможно.
Штатный механизм вставки через ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка) поддерживает растровые и векторные форматы изображений (PNG, JPG, BMP, SVG), но не принимает PDF. Поэтому для решения задачи используют два основных подхода:
Популярным решением для работы с 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");
// Запускаем утилиту в синхронном режиме с ожиданием завершения
ЗапуститьПриложение(ИмяБатФайла, ПутьККаталогу, Истина);
Разберем различия в режимах работы утилиты:
Утилита QPDF является современным аналогом PDFtk, корректно обрабатывающим новейшие спецификации PDF (включая сжатые таблицы перекрестных ссылок XRef и шифрование). Синтаксис наложения выполняется одной строкой:
КомандаЗапуска = "qpdf """ + ФайлНакладной + """ --overlay """ + ФайлШтампа + """ -- """ + ИтоговыйФайл + """";
ЗапуститьПриложение(КомандаЗапуска, "", Истина);
Если требуется поместить документ на задний план, параметр --overlay заменяется на --underlay.
Если накладываемые элементы или исходные документы имеют нестандартное разрешение или требуют изменения масштаба, можно использовать утилиту ImageMagick. Параметр -adjoin позволяет совмещать графические потоки:
КомандаКонвертации = "convert.exe """ + ФайлНакладной + """ """ + ФайлШтампа + """ -adjoin """ + ИтоговыйФайл + """";
ЗапуститьПриложение(КомандаКонвертации, "", Истина);
Чтобы итоговый документ отображался корректно, проанализируем частые причины проблем при наложении:
stamp или overlay перекроет собой весь текст накладной, расположенный под ним.(0, 0). Чтобы элемент встал строго в верхний правый угол накладной, он должен быть сгенерирован на странице того же формата (например, А4) именно в требуемых координатах.ТабличныйДокумент.Рисунки перед экспортом в итоговый PDF.