Конвертируем печатную форму pdf в картинку (jpg, gif, png и прочие) на сервере

14.03.24

Разработка - Универсальные функции

Была поставлена интересная задача конвертировать печатную форму в файл картинку. По условию задачи клиенту на почту нужно присылать только файл картинку (jpg, gif).

Сразу замечу, что использование виртуального принтера (вроде PDFCreator) невозможно, т.к. печать и рассылка писем идет на сервере (не под клиентом), и команда ТабличныйДокумент.Напечатать() недоступна для использования.

Весь код выполняется на сервере. Вначале получим "ТабличныйДокумент" внешней печатной формы.

 

 

ТабличныйДокумент = ПечатьИзВПФ("Заявка клиента","ЗаявкаКлиента");

Функция ПечатьИзВПФ(ИмяВП, Макет) Экспорт
 
    СсылкаНаВПФ = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(ИмяВПФ);
    
    Если СсылкаНаВПФ.Пустая() Тогда
        Сообщить("В справочнике ""Дополнительные отчеты и обработки"" не найдена внешнюю печатную форму с наименованием '" + ИмяВПФ + "'");
        Возврат "";
    КонецЕсли;
    
    Попытка
        ОбработкаОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаВПФ);
    Исключение
        Сообщить("Не удалось напечатать """ + ИмяВПФ + "'"". Ошибка создания объекта дополнительной ПФ");
        Возврат "";
    КонецПопытки;
    
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(СсылкаНаДокумент);
    	
    ТабличныйДокумент = "";
    Попытка
        ТабличныйДокумент = ОбработкаОбъект.СформироватьПечатнуюФорму(МассивОбъектов,Макет);
    Исключение
    	Сообщить("Не удалось напечатать """ + ИмяВПФ + "'""." + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки; 
 
    Возврат ТабличныйДокумент; 
        
КонецФункции

 

В модуле печатной формы должна быть экспортная процедура СформироватьПечатнуюФорму(МассивОбъектов,Макет)

 

 

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	                                                                         
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ЗаявкаКлиента");
	                                           
	Если ПечатнаяФорма <> Неопределено Тогда
		ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов,"ЗаявкаКлиента");
		ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Заявка клиента'");
	КонецЕсли;
	
КонецПроцедуры

Функция СформироватьПечатнуюФорму(МассивОбъектов,МакетДляПечати) Экспорт
	Если МакетДляПечати = "ЗаявкаКлиента" Тогда
		Возврат СформироватьПечатнуюФормуЗаявкаКлиента(МассивОбъектов,МакетДляПечати);		
	КонецЕсли;	
КонецФункции

Функция СформироватьПечатнуюФормуЗаявкаКлиента(МассивОбъектов,МакетДляПечати) 
	
	Док = МассивОбъектов[0];
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	Макет =  ПолучитьМакет(МакетДляПечати);
		
	Возврат ТабличныйДокумент;
	
КонецФункции

 

Сохраним "ТабличныйДокумент" в файл pdf

 

 

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

 

На сервере должна быть установлена программа ImageMagick и Ghostscript

https://imagemagick.org/

https://www.ghostscript.com/

В скрипте мы запускаем ImageMagick, а Ghostscript является вспомогательной программой ее использует сама ImageMagick.

Иногда требуется установка переменной среды: setx MAGICK_CODER_MODULE_PATH "C:\Program Files\gs\gs10.03.0\lib"
Проверить переменную среды: echo %MAGICK_CODER_MODULE_PATH%

Устанавливаем нужное расширение у "ИмяВременногоФайла_img" (jpg,gif,png и прочие).

ПаузаВСекундах нужна, чтобы если мы хотим дальше использовать файл "ИмяВременногоФайла_img", программа  ImageMagick успела сохранить результат на диск.

 

 

ИмяВременногоФайла_img = ИмяВременногоФайла + ".jpg";
КонвертироватьPDFtoImg(ИмяВременногоФайла,ИмяВременногоФайла_img);
		
Процедура КонвертироватьPDFtoImg(ИмяВременногоФайла,ИмяВременногоФайла_img) Экспорт	
	СтрокаЗапуска = """C:\Program Files (x86)\ImageMagick-7.1.0-portable-Q16-x64\convert.exe"" -density 300 -trim "+ИмяВременногоФайла+" -quality 100 "+" "+ИмяВременногоФайла_img;
	ЗапуститьПриложение(СтрокаЗапуска,,Истина,Неопределено);

	ПаузаВСекундах(5);		
КонецПроцедуры

Функция ПаузаВСекундах(СекундЗадержки)  Экспорт
	Если СекундЗадержки>0 Тогда
		scr = Новый COMОбъект("WScript.Shell"); 
		scr.Run("TIMEOUT -T "+Число(СекундЗадержки)+" -NOBREAK",0,1);
	КонецЕсли;
КонецФункции

 

 

 
Полный текст модуля

 

Тестировал: 

1С:Комплексная автоматизация 2 (2.4.13.209)

Платформа 1С:Предприятие 8.3 (8.3.18.1646)

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3408    Abysswalker    8    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6334    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    48692    dimanich70    83    

169

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7295    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    60887    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9088    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. salexdv 2418 22.12.21 11:36 Сейчас в теме
Делал в своё время вот такое, но там страницы режутся на отдельные картинки. Тут получается будет одна большая картинка на все страницы?
2. John_d 6071 22.12.21 11:48 Сейчас в теме
(1) через командную строку можно обращаться к страницам как к массиву [0]
-density 300 -trim D:\22.pdf[0] -quality 100 D:\11.jpg
user803412; rmIvanT; salexdv; +3 Ответить
3. VKislitsin 1043 22.12.21 12:47 Сейчас в теме
Евгений, подскажите пожалуйста, а какие-то варианты без использования ImageMagick, Ghostscript и прочих cpdf, не прорабатывались?
Я, честно говоря, прочитав заголовок, обрадовался что вы нашли способ сделать картинку из PDF без использования сторонних модулей.
Aleskey_K; +1 Ответить
4. John_d 6071 22.12.21 13:03 Сейчас в теме
(3) я не нашел таких вариантов.
VKislitsin; +1 Ответить
5. SGordon1 22.12.21 13:44 Сейчас в теме
(4) А На клиенте же можно Напечатать табдокуменнт ( это чтобы без магии с призраками) Плнятно что костыль....
6. John_d 6071 22.12.21 14:08 Сейчас в теме
(5) нужно на сервере.
8. shard 292 22.12.21 14:43 Сейчас в теме
(4) раньше пользовал пакет xpdfreader, полагаю pdfimages будет полегче, чем связка ImageMagick и Ghostscript
Baturskii; +1 Ответить
29. Baturskii 11.07.25 13:37 Сейчас в теме
(8) Мне это помогло. Там можно найти pdftopng.exe. Весит чуть и работает быстро и без бубнов
1) Сохраняю двоичные данные в файл
2) Запускаю в командной строке конвертацию
3) Забираю результат в виде двоичных данных
4) Подчищаю следы)

#Область ПрограммныйИнтерфейс

Функция PDFtoPNG(Знач ДанныеPDF) Экспорт
	ПроверитьУстановитьКомпонентуКонвертацииPDFtoPNG();
	ИмяВременногоФайла	= ИмяВременногоФайла(ДанныеPDF);
	ЗапуститьПриложение(КаталогВременныхФайлов() + "pdftopng.exe -l 1 -r 300 -gray " + ИмяВременногоФайла + " " + ИмяВременногоФайла,,Истина);
	ФайлPNG	= Новый Файл(ИмяВременногоФайла + "-000001.png");
	Если ФайлPNG.Существует() Тогда
		ДанныеPNG	= Новый ДвоичныеДанные(ФайлPNG.ПолноеИмя);
		УдалитьФайлы(ИмяВременногоФайла);
		УдалитьФайлы(ФайлPNG.ПолноеИмя);
		Возврат ДанныеPNG;
	КонецЕсли;
КонецФункции //PDFtoPNG

#КонецОбласти //ПрограммныйИнтерфейс

#Область СлужебныеПроцедурыИФункции

Процедура ПроверитьУстановитьКомпонентуКонвертацииPDFtoPNG()
	Файл = Новый Файл(КаталогВременныхФайлов() + "\pdftopng.exe");
	Если НЕ Файл.Существует() Тогда
		КонвертацияДанныхВызовСервера.ПолучитьДвоичныеДанныеКонвертераPDFtoPNG().Записать(Файл.ПолноеИмя);		
	КонецЕсли;		
КонецПроцедуры //ПроверитьУстановитьКомпонентуКонвертацииPDFtoPNG

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

#КонецОбласти //СлужебныеПроцедурыИФункции
Показать


И вот:

Функция ПолучитьДвоичныеДанныеКонвертераPDFtoPNG() Экспорт
	Возврат ПолучитьОбщийМакет("PDFtoPNG");		
КонецФункции //ПолучитьДвоичныеДанныеКонвертераPDFtoPNG


Тут просто хранится этот EXE-шник как есть
30. exitel 11 24.07.25 10:11 Сейчас в теме
(29) спасибо, помогло вывести в табличный документ PDF- файл
мне кажется это сообщение достойно отдельной статьи)
31. exitel 11 24.07.25 14:00 Сейчас в теме
(29) если несколько страниц в ПДФ то первую только конвертирует, можно ли получать все страницы?
32. exitel 11 25.07.25 08:04 Сейчас в теме
(31) разобрался в
ЗапуститьПриложение(КаталогВременныхФайлов() + "pdftopng.exe -l 1 -r 300 -gray " + ИмяВременногоФайла + " " + ИмяВременногоФайла,,Истина); 

параметр 1 - это сколько страниц конвертируется если они есть в ПДФ, сохраняются они отдельными файлами с окончанием -000001, -000002 и т.д.
33. BONKOMAT 26.08.25 05:45 Сейчас в теме
Все выполнялось на сервере , были проблемы что в папке temp присутствовал пустой файл (это нормально, проверьте сам pdf мб. вы его перезаписали как пустую страницу) + игрался с параметрами Ghostscript , в самом низу уже вызов функции для вывода в картинку.
ПутьКPDF - это полный путь с расширением файла .pdf
ПутьДляИзображений - это путь до папки куда будет сохраняться картинка.

Ну и не забудьте посмотреть куда установлен Ghostscript и какой он у вас версии.
После чего поменяйте в коде.

Вроде я сделал удаление временного файла , но чет с последним не работает , в лбом случае при повторе печати они будет затирать вообще все старый файлы.


Функция КонвертироватьPDFВИзображениеGS(ПутьКPDF, ПутьДляИзображений, Разрешение = 300)
    
    Результат = Новый Структура("Успех, Сообщение, Файлы, КоличествоСтраниц, Команда, КодОшибки");
    Результат.Успех = Ложь;
    Результат.Сообщение = "";
    Результат.Файлы = Новый Массив;
    Результат.КоличествоСтраниц = 0;
    Результат.Команда = "";
    Результат.КодОшибки = 0;
    
    Попытка
        FSO = Новый COMObject("Scripting.FileSystemObject");
        WSH = Новый COMObject("WScript.Shell");
        
        // Проверка PDF файла
        Если Не FSO.FileExists(ПутьКPDF) Тогда
            Результат.Сообщение = "PDF файл не существует: " + ПутьКPDF;
            Возврат Результат;
        КонецЕсли;
        
        // Проверяем размер PDF файла
        РазмерФайла = FSO.GetFile(ПутьКPDF).Size;
        Если РазмерФайла = 0 Тогда
            Результат.Сообщение = "PDF файл пустой или поврежден";
            Возврат Результат;
        КонецЕсли;
        
        // Подготовка пути для изображений
        Если Прав(ПутьДляИзображений, 1) <> "\" Тогда
            ПутьДляИзображений = ПутьДляИзображений + "\";
        КонецЕсли;
        
        // Создание папки
        Если Не FSO.FolderExists(ПутьДляИзображений) Тогда
            FSO.CreateFolder(ПутьДляИзображений);
        КонецЕсли;
        
        // Очищаем старые файлы
        ОчиститьСтарыеФайлы(ПутьДляИзображений);
        
        // Поиск Ghostscript
        ПутьКGS = НайтиGhostscript();
        Если ПутьКGS = "" Тогда
            Результат.Сообщение = "Ghostscript не найден";
            Возврат Результат;
        КонецЕсли;
        
        // Оптимизированная команда
        Параметры = "-sDEVICE=jpeg -r" + Разрешение + 
		            " -sOutputFile=" + ПутьДляИзображений + "page_%d.jpg " + 
		            "-dNOPAUSE -dBATCH " +
		            "-dTextAlphaBits=4 " +
		            "-dGraphicsAlphaBits=4 " +
		            "-dJPEGQ=95 " + // Качество JPEG
		            "-dBackgroundColor=16#FFFFFF " + // Белый фон
		            """" + ПутьКPDF + """";
        
        ПолнаяКоманда = """" + ПутьКGS + """ " + Параметры;
        Результат.Команда = ПолнаяКоманда;
        
        // Выполнение команды
        Процесс = WSH.Exec(ПолнаяКоманда);
        
        // Ждем завершения процесса (без дополнительной задержки)
        Пока Процесс.Status = 0 Цикл
            // Короткая пауза для избежания 100% загрузки CPU
            Ждать(10);
        КонецЦикла;
        
        Результат.КодОшибки = Процесс.ExitCode;
        
        // Проверяем созданные файлы
		Файлы = Новый Массив;
		Папка = FSO.GetFolder(ПутьДляИзображений);

		Для Каждого Файл In Папка.Files Цикл
		    ИмяФайла = Файл.Name;
		    Если (Лев(ИмяФайла, 5) = "page_" И Прав(ИмяФайла, 4) = ".jpg") ИЛИ
		       (Лев(ИмяФайла, 9) = "страница_" И Прав(ИмяФайла, 4) = ".jpg") Тогда
		        Если Файл.Size > 1024 Тогда
		            Файлы.Добавить(Файл.Path);
		        Иначе
		            FSO.DeleteFile(Файл.Path);
		        КонецЕсли;
		    КонецЕсли;
		КонецЦикла; 
		
        Если Файлы.Количество() > 0 Тогда
            Результат.Успех = Истина;
            Результат.Сообщение = "Создано файлов: " + Файлы.Количество();
            Результат.Файлы = Файлы;
            Результат.КоличествоСтраниц = Файлы.Количество();
        Иначе
            Результат.Сообщение = "Не создано ни одного файла. Код возврата: " + Результат.КодОшибки;
        КонецЕсли;
        
    Исключение
        Результат.Сообщение = "Ошибка: " + ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
    
КонецФункции
Показать


// Вспомогательная функция для записи логов (с дополнением)
Процедура ЗаписатьТекстовыйФайл(ПутьКФайлу, Текст, Дописывать = Ложь)
    Попытка
        Если Дописывать Тогда
            ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8", Истина); // Дописываем
        Иначе
            ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8", Ложь); // Перезаписываем
        КонецЕсли;
        ЗаписьТекста.ЗаписатьСтроку(Текст);
        ЗаписьТекста.Закрыть();
    Исключение
        // Игнорируем ошибки записи логов
    КонецПопытки;
КонецПроцедуры
Показать


// Упрощенная функция ожидания (только для циклов ожидания)
Процедура Ждать(Милисекунды)
    Попытка
        // Минимальная реализация для избежания 100% загрузки CPU
        WSH = Новый COMObject("WScript.Shell");
        WSH.Run("ping 127.0.0.1 -n 2 -w " + Милисекунды + " > nul", 0, Истина);
    Исключение
        // Просто продолжаем выполнение если не получилось
    КонецПопытки;
КонецПроцедуры
Показать


Функция НайтиGhostscript()
    
    Попытка
        FSO = Новый COMObject("Scripting.FileSystemObject");
        
        // Стандартные пути
        СтандартныеПути = Новый Массив;
        СтандартныеПути.Добавить("C:\Program Files\gs\gs10.05.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs10.04.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs10.03.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs10.02.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs10.01.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs10.00.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs9.56.1\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs9.55.0\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs9.54.0\bin\gswin64c.exe");
        СтандартныеПути.Добавить("C:\Program Files\gs\gs9.53.3\bin\gswin64c.exe");

        // Также проверяем 32-битные версии
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs10.05.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs10.04.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs10.03.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs10.02.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs10.01.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs10.00.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs9.56.1\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs9.55.0\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs9.54.0\bin\gswin32c.exe");
        СтандартныеПути.Добавить("C:\Program Files (x86)\gs\gs9.53.3\bin\gswin32c.exe");
        
        Для Каждого Путь Из СтандартныеПути Цикл
            Если FSO.FileExists(Путь) Тогда
                Возврат Путь;
            КонецЕсли;
        КонецЦикла;
        
        // Поиск через реестр
        Попытка
            WSH = Новый COMObject("WScript.Shell");
            КлючРеестра = "HKLM\SOFTWARE\GPL Ghostscript\";
            Попытка
                ИменаВерсий = WSH.RegRead(КлючРеестра);
                Если ТипЗнч(ИменаВерсий) = Тип("Массив") Тогда
                    Для Каждого Версия Из ИменаВерсий Цикл
                        Попытка
                            ПутьУстановки = WSH.RegRead(КлючРеестра + Версия + "\GS_LIB");
                            Если ПутьУстановки <> Неопределено Тогда
                                ПутьКEXE = ПутьУстановки + "\bin\gswin64c.exe";
                                Если FSO.FileExists(ПутьКEXE) Тогда
                                    Возврат ПутьКEXE;
                                КонецЕсли;
                                ПутьКEXE = ПутьУстановки + "\bin\gswin32c.exe";
                                Если FSO.FileExists(ПутьКEXE) Тогда
                                    Возврат ПутьКEXE;
                                КонецЕсли;
                            КонецЕсли;
                        Исключение
                            Продолжить;
                        КонецПопытки;
                    КонецЦикла;
                КонецЕсли;
            Исключение
                // Пробуем другой ключ реестра
                Попытка
                    ПутьУстановки = WSH.RegRead("HKLM\SOFTWARE\GPL Ghostscript\InstallPath");
                    Если ПутьУстановки <> Неопределено Тогда
                        ПутьКEXE = ПутьУстановки + "\bin\gswin64c.exe";
                        Если FSO.FileExists(ПутьКEXE) Тогда
                            Возврат ПутьКEXE;
                        КонецЕсли;
                        ПутьКEXE = ПутьУстановки + "\bin\gswin32c.exe";
                        Если FSO.FileExists(ПутьКEXE) Тогда
                            Возврат ПутьКEXE;
                        КонецЕсли;
                    КонецЕсли;
                Исключение
                КонецПопытки;
            КонецПопытки;
        Исключение
        КонецПопытки;
        
    Исключение
    КонецПопытки;
    
    Возврат "";
    
КонецФункции
Показать


Процедура ОчиститьСтарыеФайлы(ПутьПапки)
    
    Попытка
        FSO = Новый COMObject("Scripting.FileSystemObject");
        Если FSO.FolderExists(ПутьПапки) Тогда
            Папка = FSO.GetFolder(ПутьПапки);
            
            Для Каждого Файл In Папка.Files Цикл
                // Удаляем все jpg и png файлы
                ИмяФайла = Файл.Name;
                Если Прав(ИмяФайла, 4) = ".jpg" ИЛИ Прав(ИмяФайла, 4) = ".png" Тогда
                    FSO.DeleteFile(Файл.Path);
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    Исключение
    КонецПопытки;
    
КонецПроцедуры
Показать


Ну и там где сам вывод картинки

//через Ghostscript 
ПутьДляИзображений = "C:\temp\images\" ; 
ПутьКPDF =  Выборка.СертификатНоменклатуры.DaniQS_ПутьКФайлу;


Результат = КонвертироватьPDFВИзображениеGS(ПутьКPDF, ПутьДляИзображений, 150);


//DaniQS++
Если Результат.Успех Тогда
// Берем первое изображение (первую страницу PDF)
Если Результат.Файлы.Количество() > 0 Тогда
ПутьКИзображению = Результат.Файлы[0];
						        
// Загружаем изображение в картинку
Попытка
Рисунок.Картинка = Новый Картинка(ПутьКИзображению);
Исключение
Сообщить("Ошибка загрузки изображения: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не создано ни одного файла изображения");
КонецЕсли;
Иначе
Сообщить("Ошибка конвертации: " + Результат.Сообщение);
КонецЕсли;
//DaniQS--
Показать
13. Dach 390 22.12.21 15:53 Сейчас в теме
14. crazycat 239 22.12.21 15:55 Сейчас в теме
(3) Есть внешняя компонента, которая позволяет сохранять PDF в различные форматы картинок, плюс она умеет "выдирать" картинки из PDF, т.е. рендеринга картинки не происходит, просто извлекается оригинальная картинка, которая интегрирована в PDF.
23. jumange 17.03.22 19:59 Сейчас в теме
(14) Добрый день. А что за компонента? Как называется? Где ее можно найти?
15. Трактор 1276 22.12.21 16:34 Сейчас в теме
(3) Питон довольно легко прикручивается к 1С. Вот питоний модуль для конвертации пдф в картинку
https://pypi.org/project/pdf2image/

Вот ещё конвертор из пдф в пнг. Этому я больше доверяю.
https://waksoft.susu.ru/2021/08/09/kak-s-pomoshhyu-python-preobrazovat-pdf%e2%80%91fajly-v-kartinki/


Вот как питон прикручивается к 1С https://infostart.ru/public/1523714/
romanstor; ivv1970; +2 Ответить
21. 1cembreg 25 18.01.22 09:55 Сейчас в теме
(15) Прошу прощения, но последняя ссылка на вопрос "как" не отвечает без скачивания вашей обработки. "Стандартно ставим питон и либы", скрипт кладём в макет, а дальше "магия"

Что под капотом? Заточена на установку питона на клиенте или на сервере? ВК? COM? Или стандартные консольные команды (и не забудьте про переменные окружения на сервере и клиенте)? Вот бы узнать
22. Трактор 1276 18.01.22 22:55 Сейчас в теме
>> последняя ссылка на вопрос "как" не отвечает без скачивания вашей обработки
(21) вы же и ответили. ставим питон, библиотеки. Прошу заметить, библиотеки с открытым кодом. Интересно - разбирайтесь.
Скрипты все свои результаты кладут в файлы. Разбираем эти файлы и показываем пользователю. Всё. Добавить нечего. Файл обработки для ленивых. Грамотный 1Сник всё повторит не скачивая. Ну или скачает, чтобы время не тратить.

>> Что под капотом?
1. 1С сохраняет питоний скрипт и картинку в файлы.
2. Создаёт командный файл и запускает его.
3. Скрипт пишет штрихкоды в выходной файл. Картинку в ещё один файл.
4. 1С разбирает выходные файлы и показывает их пользователю

>> Заточена на установку питона на клиенте или на сервере?
На сервере.

>> ВК? COM? Или стандартные консольные команды
Консоль

>> (и не забудьте про переменные окружения на сервере и клиенте)?
Путь к питону можно указать полностью. Остальные переменные не важны.
7. quazare 3982 22.12.21 14:42 Сейчас в теме
Евгений, это у тебя какое-то регламентное задание отрабатывается? Рассылка отчетов?
11. John_d 6071 22.12.21 15:02 Сейчас в теме
9. quazare 3982 22.12.21 14:48 Сейчас в теме
спасибо, что напомнил про ЗапуститьПриложение. И не забудь указать, если у кого-то включен профиль безопасности на сервере на запрет запуска сторонних программ на сервере.
10. quazare 3982 22.12.21 14:49 Сейчас в теме
паузу в секундах я бы сделал через пинг
12. blockcode 40 22.12.21 15:12 Сейчас в теме
Подобную задачу я решал с использованием консольной утилиты pdftk http://softhelp.org.ua/?p=7118
Если вам необходимо исполнить не одну а несколько команд рекомендую создать временный temp.bat, записать в него все команды, выполнить его, и удалить после этого.
16. quazare 3982 22.12.21 17:37 Сейчас в теме
вы бы лучше нашли библиотечку с обратным ходом (распознавалкой)
17. ВикторП 356 23.12.21 09:51 Сейчас в теме
Решение проверено уже временем в Документообороте - там это стандартный функционал
18. dolter 120 29.12.21 10:41 Сейчас в теме
Image Printer Pro - виртуальный принтер во многие графические и не только графические форматы. Есть клиентский и серверный вариант. Штука платная, но работает хорошо (правильно и без танцев с бубном).
19. oleg-x 23 08.01.22 21:57 Сейчас в теме
(18) Вот только одна загвоздка. На сервере нет метода печати. Печать на сервере делается только через костыли (внешними компонентами или через ком-соединение).
20. dolter 120 09.01.22 11:03 Сейчас в теме
(19) действительно... остается только поиграть с сохранением файла и копированием на lpt(N) с предварительными настройками.
24. user1744698 27.06.22 05:58 Сейчас в теме
(2)
спасибо, тебе. очень помог.
25. svezr 5 23.08.22 10:30 Сейчас в теме
Когда-то реализовывал печать из нескольких многостраничных tiff файлов. 1с очень долго обрабатывал получение из томов хранилища tiff файлов и их вывод на печать. Все решилось при помощи IrfanView (если не путаю) - там весьма гибкий функционал с поддержкой режима двусторонней печати. Программно создавался скрипт для запуска irfanView с ключами и путями, и все замечательно печаталось. Коммент не по теме, но где-то далеко около, мало ли, кому пригодится.
26. пользователь 14.07.23 13:54
Сообщение было скрыто модератором.
...
27. G_105347262781639825029 01.04.24 14:07 Сейчас в теме
А как потом удалять созданные изображения ImageMagick ?
28. Kuzja_R 172 18.07.24 21:35 Сейчас в теме
Как вариант, Native компонета для конвертации PDF в картинку: https://infostart.ru/marketplace/2122606/
34. userUlyana 16.11.25 16:48 Сейчас в теме
Добрый день
У меня что-то не получается в картинку сохранить..
у меня обычные формы (если это имеет значение)
вот моя строка
СтрокаЗапуска = "C:\Program Files\ImageMagick-7.1.2-Q16-HDRI\convert.exe" -density 300 -trim D:\1452058.PDF -quality 100 D:\1452058.jpg;

далее запускаю приложение
ЗапуститьПриложение(СтрокаЗапуска,,Истина,Неопределено);

может подскажете что не так?
очень нужно реализовать
Для отправки сообщения требуется регистрация/авторизация