При формировании печатных форм (например, комплекта отгрузочных документов с приложенными паспортами качества, сертификатами или инструкциями) часто возникает необходимость встроить существующий файл PDF непосредственно в табличный документ. Однако стандартная попытка загрузить двоичные данные файла PDF в объект Картинка приводит к отображению перечеркнутого прямоугольника («креста»). Разберем, почему возникает эта ошибка и какие существуют практические способы решения задачи.
Проанализируем исходную попытку реализации:
Если ВыборкаКартинки.МестоХраненения = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
ХранилищеКартинки = ВыборкаКартинки.Номенклатура.Приложение;
ЗнКартинки = ХранилищеКартинки.Получить();
Иначе
Попытка
ХранФайл = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ВыборкаКартинки.СтрокаРазмещенияФайла), Новый СжатиеДанных(9));
ЗнКартинки = ХранФайл.Получить();
Исключение
ЗнКартинки = "";
КонецПопытки;
КонецЕсли;
Сертификат.Картинка = Новый Картинка(ЗнКартинки);
Выясним причину ошибки: встроенный тип Картинка и свойство Картинка области табличного документа предназначены строго для работы с растровыми и векторными графическими форматами. В перечислении ФорматКартинки поддерживаются следующие форматы:
BMPGIFJPEGPNGTIFFWMF / EMFIconФайл PDF является сложным форматом электронного документа, содержащим шрифты, разметку страниц и векторные потоки, а не обычным растровым изображением. Платформа 1С определяет такой файл как НеизвестныйФормат, из-за чего в табличном документе отображается системная заглушка ошибки.
Чтобы вывести многостраничный документ (например, паспорт изделия или сертификат) в табличный документ, необходимо предварительно преобразовать страницы PDF в графический формат (PNG или JPEG). Рассмотрим по шагам, как это реализовать с помощью внешней утилиты (например, Poppler / pdftoppm, Ghostscript или ImageMagick):
Записать().ЗапуститьПриложение(), передавая путь к исходному PDF-файлу и каталог для сохранения результирующих картинок.Новый Картинка(ПутьКФайлуИзображения) и выводим их в область табличного документа.ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц().Рассмотрим пример кода для вывода полученных изображений в отчет:
// Создаем область с картинкой для каждой страницы
Для Каждого ПутьКИзображению Из МассивФайловСтраниц Цикл
ОбластьСтраницы = Макет.ПолучитьОбласть("ОбластьИзображения");
ОбластьСтраницы.Рисунки.Сертификат.Картинка = Новый Картинка(ПутьКИзображению);
ТабличныйДокумент.Вывести(ОбластьСтраницы);
// Если это не последняя страница, добавляем разрыв
Если ПутьКИзображению <> МассивФайловСтраниц[МассивФайловСтраниц.ВГраница()] Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
КонецЦикла;
Альтернативой консольным утилитам выступает использование внешних компонент (Native API), скомпилированных на базе библиотеки PDFium. Такая компонента подключается через ПодключитьВнешнююКомпоненту() и позволяет рендерить страницы PDF в двоичные данные формата PNG прямо в оперативной памяти без создания промежуточных файлов на жестком диске.
В меню табличного документа существует возможность интерактивной вставки сторонних документов: Таблица -> Вставить объект -> Создать из файла (OLE-объект). Однако на практике этот метод имеет критические ограничения:
Если задача заключается в том, чтобы предоставить пользователю итоговый файл для печати или отправки по почте, содержащий как саму печатную форму, так и вложенный сертификат, более надежным подходом является объединение двух документов формата PDF:
ТабличныйДокумент.Записать(ПутьКФайлуФормы, ТипФайлаТабличногоДокумента.PDF);ДокументPDF и метода Показать().Если требуется предоставить пользователю возможность предварительного просмотра вложенного файла PDF на управляемой форме перед печатью, можно использовать элемент формы ПолеHTMLДокумента. Внутрь поля передается прямой путь к локальному файлу PDF или HTML-код с тегом <iframe> или <embed>. Встроенный браузерный движок отобразит документ со стандартными панелями прокрутки, масштабирования и кнопкой прямой печати.