Как визуализировать штамп с регистрационным номером в PDF-файле в 1С:Документооборот?

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

При работе в 1С:Документооборот КОРП часто возникает задача визуализации регистрационного штампа непосредственно в теле прикрепленного PDF-документа. Это необходимо для того, чтобы при печати или просмотре файла сторонними средствами на нем был виден официальный номер и дата регистрации. В типовых решениях старых релизов (например, 2.1.27) прямой функции «вставить картинку в PDF» не предусмотрено, однако эту задачу можно решить несколькими способами: от использования внешних утилит до активации штатных механизмов в новых версиях программы. Для этой задачи есть интеграция с 1С:Документооборот для работы с задачами.

В этой статье мы подробно разберем, как программно наложить штамп на PDF-документ, проанализируем код интеграции с внешними инструментами и рассмотрим современные альтернативы.

Способ 1: Штатный механизм «Визуальная рабочая копия»

Прежде чем приступать к написанию кода и установке стороннего ПО, давайте проверим, позволяет ли ваша версия системы решить задачу типовыми средствами. В версиях 1С:Документооборот 2.1 (начиная с 2.1.28) и в редакции 3.0 появился функционал формирования визуальных рабочих копий.

Разберем по шагам, как это работает:

  1. Система автоматически генерирует PDF-файл, в который «вживляются» штампы регистрационного номера и электронной подписи (ЭП).
  2. Настройка производится в карточке Вида документа на вкладке «Настройки обработки».
  3. В 1С:ДО 3.0 доступен специальный справочник «Настройки визуализации ЭП и штампов», где можно без программирования задать шрифты, цвета и даже логотипы для штампа — для этого есть выгрузка документов для госорганов из 1С:ДО 3.0.

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

Способ 2: Использование утилиты PDFtk (рекомендуемый метод)

Проанализируем наиболее эффективный программный метод — использование консольной утилиты PDFtk. Она позволяет выполнять операцию multistamp, которая накладывает один PDF-файл (со штампом) поверх другого (исходного документа) как прозрачный слой.

Для реализации этого метода нам понадобятся две вещи: установленная утилита pdftk.exe на сервере и сформированный PDF-файл самого штампа. Рассмотрим код функции, которая выполняет это наложение:


Функция ДобавитьШтампВPdf_V2(ФайлСсылка, АдресХранилищаШтампа, Перезаписывать = Ложь) Экспорт
    // Определяем путь к исходному файлу
    Если ТипЗнч(ФайлСсылка) = Тип("СправочникСсылка.Файлы") Тогда
        ИсходныйФайл = ПолучитьПутьКФайлу(ФайлСсылка);
    ИначеЕсли ТипЗнч(ФайлСсылка) = Тип("Строка") И Не ПустаяСтрока(ФайлСсылка) Тогда
        ИсходныйФайл = ФайлСсылка;
    КонецЕсли;

    // Создаем временные файлы для работы
    КопияИсходногофайла = ПолучитьИмяВременногоФайла("pdf");
    КопироватьФайл(ИсходныйФайл, КопияИсходногофайла);
    Результат = ПолучитьИмяВременногоФайла("pdf");
    
    // Получаем PDF-макет штампа из хранилища
    ДвоичныеДанныеШтампа = ПолучитьИзВременногоХранилища(АдресХранилищаШтампа);
    ШтампФайл = ПолучитьИмяВременногоФайла("pdf");
    ДвоичныеДанныеШтампа.Записать(ШтампФайл);

    // Формируем строку запуска для PDFtk
    // Параметр multistamp накладывает штамп на все страницы документа
    ПутьКPDFtk = """c:\Program Files (x86)\PDFtk\bin\pdftk.exe"" ";
    СтрокаЗапуска = ПутьКPDFtk + КопияИсходногофайла + " multistamp " + ШтампФайл + " output " + Результат;

    // Запускаем приложение через COM-объект Shell
    Shell = Новый COMОбъект("WScript.Shell");
    Shell.Run(СтрокаЗапуска, 0, Истина);

    // Возвращаем результат в хранилище
    ДвоичныеДанныеРезультат = Новый ДвоичныеДанные(Результат);
    Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанныеРезультат);
КонецФункции

Важные замечания по коду:

Способ 3: Наложение через ImageMagick (если нужна конвертация)

Выясним причину, по которой иногда используют ImageMagick. Эта утилита незаменима, если ваш исходный файл — не PDF, а скан в формате JPG или PNG, или если вам нужно программно изменить прозрачность штампа. Однако стоит учитывать, что ImageMagick часто работает медленнее, так как конвертирует страницы в растровые изображения. Для этой задачи есть маркировка PDF документов QR-кодами в 1С.

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


ПутьКИсполняемомуФайлу = """C:\Program files\ImageMagick\convert.exe"" ";
// Делаем белый цвет прозрачным и устанавливаем плотность 200 DPI
СтрокаЗапуска = ПутьКИсполняемомуФайлу + "-transparent white -density 200 " + ИмяВременногоФайлаPDF + " " + ИмяВыходногоФайлаPNG;
ЗапуститьПриложение(СтрокаЗапуска, , Истина);

Альтернативные инструменты для продвинутых разработчиков

Посмотрим на ситуацию шире. Если политика безопасности вашей компании запрещает запуск внешних .exe файлов через WScript.Shell, существуют другие пути:

  1. iTextSharp (библиотека .NET): Позволяет работать с PDF «в памяти». С помощью этой библиотеки можно найти конкретные координаты в тексте (например, после слова «Регистрационный номер») и нарисовать штамп именно там. Это работает значительно быстрее внешних утилит.
  2. Ghostscript: Идеален для серверов на базе Linux. Команда gs позволяет объединять слои PDF крайне эффективно. К тому же Ghostscript бесплатен и часто уже предустановлен во многих дистрибутивах.
  3. Облачные микросервисы: Если у вас распределенная инфраструктура, можно вынести обработку PDF в отдельный небольшой сервис на Python или Node.js, который будет принимать файл по HTTP и возвращать его уже со штампом.

Проблема «слойности» и как ее избежать

Проанализируем важный нюанс: при использовании метода multistamp штамп иногда может оказаться «под» основным содержимым документа. Это происходит, если PDF был создан сканером как сплошная непрозрачная картинка на весь лист. Как это решить?

В таких случаях рекомендуется использовать параметр stamp (вместо multistamp), если нужно наложить только на первую страницу, либо предварительно «сплющивать» (flatten) исходный PDF, чтобы сделать его слои прозрачными там, где нет текста или графики.

Используя предложенные методы, мы можем гибко настроить визуализацию любых штампов в 1С:Документооборот, обеспечив соответствие электронных документов бумажным регламентам предприятия. Решить задачу обмена поможет интеграция 1С:ДО с внешней системой ЭДО.

← На главную