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

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

При формировании печатных форм (например, комплекта отгрузочных документов с приложенными паспортами качества, сертификатами или инструкциями) часто возникает необходимость встроить существующий файл PDF непосредственно в табличный документ. Однако стандартная попытка загрузить двоичные данные файла PDF в объект Картинка приводит к отображению перечеркнутого прямоугольника («креста»). Разберем, почему возникает эта ошибка и какие существуют практические способы решения задачи.

Анализ проблемы: почему PDF нельзя передать в объект Картинка

Проанализируем исходную попытку реализации:


Если ВыборкаКартинки.МестоХраненения = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
    ХранилищеКартинки = ВыборкаКартинки.Номенклатура.Приложение;
    ЗнКартинки = ХранилищеКартинки.Получить();
Иначе
    Попытка
        ХранФайл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ВыборкаКартинки.СтрокаРазмещенияФайла), Новый СжатиеДанных(9));
        ЗнКартинки = ХранФайл.Получить();
    Исключение
        ЗнКартинки = "";
    КонецПопытки;
КонецЕсли;

Сертификат.Картинка = Новый Картинка(ЗнКартинки);

Выясним причину ошибки: встроенный тип Картинка и свойство Картинка области табличного документа предназначены строго для работы с растровыми и векторными графическими форматами. В перечислении ФорматКартинки поддерживаются следующие форматы:

  1. BMP
  2. GIF
  3. JPEG
  4. PNG
  5. TIFF
  6. WMF / EMF
  7. Icon

Файл PDF является сложным форматом электронного документа, содержащим шрифты, разметку страниц и векторные потоки, а не обычным растровым изображением. Платформа 1С определяет такой файл как НеизвестныйФормат, из-за чего в табличном документе отображается системная заглушка ошибки.

Способ 1. Конвертация страниц PDF в изображения (рекомендуемый подход)

Чтобы вывести многостраничный документ (например, паспорт изделия или сертификат) в табличный документ, необходимо предварительно преобразовать страницы PDF в графический формат (PNG или JPEG). Рассмотрим по шагам, как это реализовать с помощью внешней утилиты (например, Poppler / pdftoppm, Ghostscript или ImageMagick):

  1. Выгружаем двоичные данные PDF из информационной базы во временный файл на диске с помощью метода Записать().
  2. Вызываем внешнюю консольную утилиту через метод ЗапуститьПриложение(), передавая путь к исходному PDF-файлу и каталог для сохранения результирующих картинок.
  3. В цикле считываем полученные изображения страниц, создаем новый объект Новый Картинка(ПутьКФайлуИзображения) и выводим их в область табличного документа.
  4. Если страниц несколько, между ними программно добавляем разделитель страниц вызовом ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц().
  5. Удаляем созданные временные файлы с диска.

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


// Создаем область с картинкой для каждой страницы
Для Каждого ПутьКИзображению Из МассивФайловСтраниц Цикл
    ОбластьСтраницы = Макет.ПолучитьОбласть("ОбластьИзображения");
    ОбластьСтраницы.Рисунки.Сертификат.Картинка = Новый Картинка(ПутьКИзображению);
    ТабличныйДокумент.Вывести(ОбластьСтраницы);
    
    // Если это не последняя страница, добавляем разрыв
    Если ПутьКИзображению <> МассивФайловСтраниц[МассивФайловСтраниц.ВГраница()] Тогда
        ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЕсли;
КонецЦикла;

Альтернативой консольным утилитам выступает использование внешних компонент (Native API), скомпилированных на базе библиотеки PDFium. Такая компонента подключается через ПодключитьВнешнююКомпоненту() и позволяет рендерить страницы PDF в двоичные данные формата PNG прямо в оперативной памяти без создания промежуточных файлов на жестком диске.

Ограничения использования внедренных OLE-объектов

В меню табличного документа существует возможность интерактивной вставки сторонних документов: Таблица -> Вставить объект -> Создать из файла (OLE-объект). Однако на практике этот метод имеет критические ограничения:

  1. Отсутствие динамической замены: В платформе 1С:Предприятие нет стандартного программного интерфейса для того, чтобы в процессе формирования печатной формы подменить двоичные данные или путь к файлу внутри уже созданного OLE-контейнера.
  2. Зависимость от операционной системы: Технология OLE поддерживается исключительно в операционной системе Windows при наличии зарегистрированного OLE-сервера (например, Adobe Acrobat Reader). В среде Linux и в веб-клиенте OLE-объекты не работают.

Способ 2. Объединение сформированного PDF-документа

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

  1. Формируем стандартный табличный документ 1С (накладная, счет или акт).
  2. Сохраняем табличный документ в файл формата PDF с помощью метода: ТабличныйДокумент.Записать(ПутьКФайлуФормы, ТипФайлаТабличногоДокумента.PDF);
  3. Программно объединяем полученный файл PDF и файл сертификата в один общий результирующий документ.
  4. Показываем готовый файл пользователю или открываем его встроенным средством платформы с помощью объекта ДокументPDF и метода Показать().

Способ 3. Отображение через ПолеHTMLДокумента на форме

Если требуется предоставить пользователю возможность предварительного просмотра вложенного файла PDF на управляемой форме перед печатью, можно использовать элемент формы ПолеHTMLДокумента. Внутрь поля передается прямой путь к локальному файлу PDF или HTML-код с тегом <iframe> или <embed>. Встроенный браузерный движок отобразит документ со стандартными панелями прокрутки, масштабирования и кнопкой прямой печати.

← На главную