Вывод pdf и картинок в табличный документ

Статья показывает, как вывести на экран или в печатную форму файлы pdf и картинок.

Задача: выводить согласующих на входящих счетах от контрагентов. Сканы счетов могут быть различных форматов, но чаще всего это pdf. В данном примере файлы хранятся в справочнике ПрисоединенныеФайлы конфигурации ЕРП, но можно исходный файл брать из любого места.

Перед использованием необходимо установить бесплатное ПО

1. ImageMagick это консольный растровый редактор. https://imagemagick.org/ С его помощью мы будем рисовать программно на изображении.
2. Ghostscript это для преобразования файлов pdf в картинку Можно взять тут https://www.ghostscript.com/download/gsdnld.html Нужен для конвертации файлов pdf в файл jpg

 

Описание работы:

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

2. Конвертируем с помощью ImageMagick файлы из pdf в jpg. Если pdf многостраничный то на выходе будет столько файлов jpg, сколько страниц. Файлы будут пронумерованы.

3. На каждом файле полученным на предыдущем этапе рисуем текст в правом нижнем углу.

4. Файлы с добавленным текстом по очереди выводятся в результирующий табличный документ, который можно открыть на экране, напечатать и т.п. 

 

За основу взята статья //infostart.ru/public/830374/

 

Функция ВывестиФайлыПоЗаявкеВТабдок(Заявка)

ТабДок = Новый ТабличныйДокумент;
СогласователиСтрокой = "Иванов"+Символы.ПС+"Петров";
СписокФайлов = ПолучитьСписокФайлов(Заявка,Истина);

Для Каждого Файл Из СписокФайлов цикл

ДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(Файл);
ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(ДанныеФайла.Расширение);

ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
ДвоичныеДанныеФайла.Записать(ИмяФайлаСПутем);

ИмяФайлаРезультата = ПолучитьИмяВременногоФайла("jpg");
ИмяФайлаРезультата2 = ПолучитьИмяВременногоФайла("jpg");
ПутьКПрограммеКонвертацииPDF = "C:Program FilesImageMagick-7.0.8-Q16magick.exe";//РаботаСФайламиВызовСервера.ПолучитьПутьКПрограммеКонвертацииPDF();

стрПуть = ИмяФайлаСПутем;
//конвертация в катинку, если многостраничный файл то много картинок
стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """" +" convert  -density 150 -quality 100 -debug none "+ стрПуть + " " + ИмяФайлаРезультата;
ЗапуститьПриложение(стрПуть,,Истина);

ИмяФайла = Прав(ИмяФайлаРезультата,СтрДлина(ИмяФайлаРезультата)-СтрДлина(КаталогВременныхФайлов()));
МасФайлов = НайтиФайлы(КаталогВременныхФайлов(),Лев(ИмяФайла,СтрДлина(ИмяФайла)-4)+"*");

Для Каждого Файл Из МасФайлов Цикл
//на каждой картинке рисуем согласователей
стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """" +" convert -density 150 -quality 100 -debug none "+ Файл.ПолноеИмя
+ " -resize 1754x1240> -font Tahoma -pointsize 12 -draw ""gravity SouthEast text 90,70 '"+ СогласователиСтрокой + "'"" " + ИмяФайлаРезультата2;
ЗапуститьПриложение(стрПуть,,Истина);

ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);

УдалитьФайлы(ИмяФайлаСПутем);
УдалитьФайлы(ИмяФайлаРезультата);
УдалитьФайлы(ИмяФайлаРезультата2);

//вывод в таблок
Область = Макет.ПолучитьОбласть("ОбластьКартинки");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);

Рисунок.Верх = 0;
Рисунок.Высота = 290;
Рисунок.Ширина = 210;
Рисунок.Лево = 0;
Рисунок.ГраницаСверху = Ложь;
Рисунок.ГраницаСнизу = Ложь;
Рисунок.ГраницаСправа = Ложь;
Рисунок.ГраницаСлева = Ложь;

Рисунок.Картинка = Новый Картинка(ДвоичныеДанныеРезультата);

ТабДок.АвтоМасштаб = Истина;
ТабДок.ОтображатьСетку = Ложь;

ТабДок.Вывести(Область);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
конеццикла;

Возврат Табдок;

КонецФункции

Функция ПолучитьСписокФайлов(Знач Заявки, КартинкиИПДФ = Ложь) Экспорт

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы.Ссылка КАК Файл
|ИЗ
| Справочник.ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы КАК ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы
|ГДЕ
| НЕ ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы.ПометкаУдаления
| И ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы.ВладелецФайла В(&Заявки)
| И ВЫБОР
|   КОГДА &КартинкиИПДФ
|    ТОГДА ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы.Расширение В (&РасширенияКартинок)
|   ИНАЧЕ НЕ ЗаявкаНаРасходованиеДенежныхСредствПрисоединенныеФайлы.Расширение В (&РасширенияКартинок)
|  КОНЕЦ";

Запрос.УстановитьПараметр("Заявки", Заявки);
Запрос.УстановитьПараметр("КартинкиИПДФ", КартинкиИПДФ);
РасширенияКартинок = Новый СписокЗначений;
РасширенияКартинок.Добавить("jpg");
РасширенияКартинок.Добавить("pdf");
РасширенияКартинок.Добавить("tif");
РасширенияКартинок.Добавить("jpeg");
РасширенияКартинок.Добавить("png");
РасширенияКартинок.Добавить("bmp");
РасширенияКартинок.Добавить("jp2");
Запрос.УстановитьПараметр("РасширенияКартинок", РасширенияКартинок);

РезультатЗапросаТЗ = Запрос.Выполнить().Выгрузить();

Возврат РезультатЗапросаТЗ.ВыгрузитьКолонку("Файл");

КонецФункции

 

2 Comments

  1. Rudakov_D

    Добрый день

    Поясните где используется Ghostscript. В коде не вижу упоминаний…

    Reply
  2. Aleksandr

    Добрый день!

    Ghostscript используется неявно когда мы подсовываем файл pdf в ImageMagick(1)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *