Задача: выводить согласующих на входящих счетах от контрагентов. Сканы счетов могут быть различных форматов, но чаще всего это 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");
Запрос.УстановитьПараметр("РасширенияКартинок", РасширенияКартинок);
РезультатЗапросаТЗ = Запрос.Выполнить().Выгрузить();
Возврат РезультатЗапросаТЗ.ВыгрузитьКолонку("Файл");
КонецФункции
Добрый день
Поясните где используется Ghostscript. В коде не вижу упоминаний…
Добрый день!
Ghostscript используется неявно когда мы подсовываем файл pdf в ImageMagick(1)