В процессе автоматизации документооборота часто возникает задача программного наложения факсимиле (скана подписи или печати) на уже сформированные файлы. Если исходный документ формируется непосредственно в конфигурации, то вставка картинки в табличный документ перед выгрузкой в PDF решается штатно. Однако если на вход поступает сторонний готовый PDF-файл (например, скан бумажного акта или накладной), типовые механизмы платформы не позволяют напрямую отредактировать его страницы.
Рассмотрим особенности работы с PDF в среде 1С:Предприятие и разберем проверенные способы решения этой задачи.
Проанализируем возможности встроенных объектов платформы. Объект ТабличныйДокумент позволяет сохранять результат в формате PDF с помощью метода Записать() с типом файла ТипФайлаТабличногоДокумента.PDF. Также платформа умеет объединять несколько готовых PDF-файлов в один с помощью пакета отображаемых документов. Однако встроенных методов для чтения структуры существующего PDF-файла, доступа к его слоям и вставки графических объектов поверх произвольной страницы в платформе 1С нет.
Для решения задачи можно использовать несколько практических подходов: от сборки документа через табличный документ до вызова внешних консольных утилит и сервисов.
Если скан документа изначально поступает в виде растрового изображения (JPEG, PNG, TIFF) или предварительно извлекается из PDF, мы можем собрать результирующий документ штатными средствами платформы 1С.
Разберем алгоритм по шагам:
ТабличныйДокумент в памяти.Посмотрим на пример программной реализации:
ТабДок = Новый ТабличныйДокумент;
// Добавляем фоновый скан документа
РисунокСкан = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокСкан.Картинка = Новый Картинка("C:\Scan_Page_1.jpg");
РисунокСкан.Верх = 0;
РисунокСкан.Лево = 0;
РисунокСкан.Ширина = 210; // Размер листа А4 в миллиметрах
РисунокСкан.Высота = 297;
// Добавляем поверх скана факсимиле с прозрачным фоном
РисунокПодпись = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
РисунокПодпись.Картинка = Новый Картинка("C:\Facsimile.png");
РисунокПодпись.Верх = 240; // Координата Y вставки подписи
РисунокПодпись.Лево = 120; // Координата X вставки подписи
РисунокПодпись.Ширина = 45;
РисунокПодпись.Высота = 20;
// Сохраняем итоговый документ в PDF
ТабДок.Записать("C:\Result_Signed.pdf", ТипФайлаТабличногоДокумента.PDF);
Важный момент: этот способ отлично работает, когда сканирование выполняется с фиксированным разрешением и документ состоит из одиночных страниц.
Если исходный документ уже является многостраничным PDF и переводить его в растр нежелательно (чтобы не потерять качество векторных элементов или текстового слоя), используют вызов специализированных консольных утилит через метод ЗапуститьПриложение().
Выделим два варианта работы через командную строку:
Посмотрим на пример вызова внешней утилиты из кода 1С:
КомандаЗапуска = "pdfutil.exe stamp ""C:\Source.pdf"" ""C:\Stamp.pdf"" --output ""C:\Result.pdf""";
КодВозврата = 0;
ЗапуститьПриложение(КомандаЗапуска, , Истина, КодВозврата);
Если КодВозврата <> 0 Тогда
ВызватьИсключение "Ошибка при обработке PDF-документа!";
КонецЕсли;
Для высоконагруженных задач, где запуск отдельного процесса операционной системы на каждый документ создает избыточную нагрузку, применяются внешние компоненты (Native API) или COM-соединения со специализированными издательскими и PDF-библиотеками.
Преимущество этого метода заключается в том, что документ обрабатывается в оперативной памяти без создания временных файлов на диске. Компонент открывает PDF, получает контекст рисования (Canvas) указанной страницы, размещает графический объект факсимиле по заданным координатам с масштабированием и возвращает модифицированный двоичный поток в 1С.
В современных гетерогенных инфраструктурах (где сервер 1С работает под управлением ОС Linux) оптимальным решением является вынос работы с PDF в отдельный легковесный HTTP-сервис.
В этом сценарии 1С формирует HTTPЗапрос, передавая в теле двоичные данные исходного файла и параметры вставки (координаты, страницу, изображение подписи). Сервис обрабатывает файл и возвращает готовый PDF в ответе. Это делает интеграцию независимой от операционной системы сервера приложений 1С.
Когда документы сканируются вручную, изображение на странице может смещаться или поворачиваться, из-за чего фиксированные координаты подписи могут попасть на текст или выйти за пределы строки. Для автоматизации точного позиционирования применяют следующие подходы: