Имя: Пароль:
1C
1С v8
преобразование типов файлов: PDF в PNG
0 Алекс587444
 
14.05.25
14:46
здравствуйте, подскажите пожалуйста у меня есть  присоединенный файл  в формате pdf  при печати хочу его выводить в форме картинки png, накидайте пожалуйста идей как сделать, пока есть вариант ImageMagick но просит  в  параметры запуска путь к файлу а он у меня присоединенный, не понимаю как получить путь
1 Алекс587444
 
14.05.25
14:48
через РаботаСФайлами.ДанныеФайла получаю его данные
2 Гипервизор
 
14.05.25
14:48
"при печати выводить в форме картинки png" куда?
3 Asmody
 
14.05.25
14:48
Сохранить присоединенный файл на диск
4 maxab72
 
14.05.25
14:49
у вас на бумаге так и будет png? Или хотите просто конвертнуть и хранить в формате png?
5 Алекс587444
 
14.05.25
14:50
(3) сориентируйте пожалуйста как
6 Asmody
 
14.05.25
14:51
(5) через РаботаСФайлами
7 Алекс587444
 
14.05.25
14:51
(4) просто при выводе хочу конвертировать т.к. он не выводится  как картинка, а просто как двоичные данные выбивает  в ворде
8 Волшебник
 
14.05.25
14:52
(5) Методом Записать()
9 Гипервизор
 
14.05.25
14:53
(0) А если попадётся вам многостраничный pdf и ваши действия? Многостраничных именно png не бывает.
10 Алекс587444
 
14.05.25
14:55
(9) на это будут условия, думаю над их перечнем
11 Алекс587444
 
14.05.25
14:58
(8) спасибо, ищу как, у меня сейчас спровочникссылка.мойсправойчникПрисоединенныефайлы так записи вроде у его нет
12 Алекс587444
 
14.05.25
14:59
(6) пересмотрел все процедуры и функции, не нашёл  никакой связанной с сохранением на диск, мб она не явно называется?
13 maxab72
 
14.05.25
15:02
"а просто как двоичные данные выбивает  в ворде" это понятно. Вы получили двоичные данные из хранилища и без обработки запихнули в несчастный ворд. А надо их было сперва представить как файл определенного типа, например как pdf, через метод записать(). После этого можно с этим файлом делать что угодно.
14 Алекс587444
 
14.05.25
15:03
(13) а почему тогда картинки png без проблем отображаются?
15 Алекс587444
 
14.05.25
15:05
(13) я заполняю двоичные данные в параметр и потом параметры заливаю в область через УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры
16 maxab72
 
14.05.25
15:07
(14) потому что pdf не картинка. у картинок другие сигнатуры и 1с их распознает.
17 Алекс587444
 
14.05.25
15:11
(16) бл сложно, подскажите пожалуйста что почитать
18 Алекс587444
 
14.05.25
15:12
(13) спасибо, проанализирую что вы написали и вернусь
19 Мультук
 
гуру
14.05.25
15:14
(0)

1) Сохраняем присоединенный PDF файл в временный файл (см ниже)
2) С помощью ImageMagick конвертируем PDF в картинки (см ниже)
3) Вставляем картинки в табличный документ (как-нибудь сами)
4) Не забывайте удалять после себя временные файлы и картинки

Функция КонвертироватьПрисоединенныйФайл_2_JPG(СсылкаПрисоединенныйФайл) Экспорт
	пСтр = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаПрисоединенныйФайл, "ИндексКартинки, Расширение, Наименование");   
	
	//Сохранием файл 
	//!ПолноеИмяФайлаPDF = ПутьКФайлам() + пСтр.Наименование + ".pdf";
	//ПолноеИмяФайлаPDF = ПутьКФайлам() + ПолучитьИмяВременногоФайла("pdf");
	ПолноеИмяФайлаPDF = ПолучитьИмяВременногоФайла("pdf");
	
	ДанныеФайла = РаботаСФайлами.ДвоичныеДанныеФайла(СсылкаПрисоединенныйФайл);
	Если ДанныеФайла <> Неопределено Тогда    
		Попытка
			ДанныеФайла.Записать(ПолноеИмяФайлаPDF);
		Исключение  
			Комментарий = СтрШаблон("Ошибка записи файла <%1> : %2",  ПолноеИмяФайлаPDF, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			ЗаписьЖР("КонвертироватьПрисоединенныйФайл_2_JPG", Комментарий, СсылкаПрисоединенныйФайл, Истина);
		КонецПопытки	
	КонецЕсли;
	
	//Конвертируем файл
	масФайлы =  КонвертироватьФайл_PDF_TO_JPG(ПолноеИмяФайлаPDF);

	Возврат масФайлы;
КонецФункции

Функция КонвертироватьФайл_PDF_TO_JPG(ПолноеИмяФайлаPDF, ИмяФайла = "") Экспорт
	пФайл = Новый Файл(ПолноеИмяФайлаPDF);
	ПутьКФайлам = пФайл.Путь;
	
	ИмяФайла = пФайл.ИмяБезРасширения; 
	пФайл = Неопределено;
	
	
	СтрокаВыполнить = ПутьImageMagic() + "convert -density 250 " + """" + ПолноеИмяФайлаPDF +  """" +" -quality 120 " + """" + ИмяФайла + "-%02d.jpg" + """";  
	//СтрокаВыполнить = ПутьImageMagic() + "convert -density 150 " + """" + ПолноеИмяФайлаPDF +  """" +" -quality 90 " + "123-%02d.jpg";  
	//СтрокаВыполнить = ПутьImageMagic() + "convert -density 150 " + ПолноеИмяФайлаPDF +" -quality 90 " + "123-%02d.jpg";  
	
	//todo
	//!Сообщить(СтрокаВыполнить);
	
	КодВозврата = 0;
	ЗапуститьПриложение(СтрокаВыполнить, ПутьКФайлам, Истина, КодВозврата);
	
	//todo
	//!Сообщить("КодВозврата = " + Строка(КодВозврата));
	
	МаскаДляПоиска = ИмяФайла + "-??.jpg";
	массивИменJPG = НайтиФайлы(ПутьКФайлам, МаскаДляПоиска);	
	
	мас = Новый Массив;
	Для каждого строка из массивИменJPG Цикл
		мас.Добавить(строка.ПолноеИмя);
	КонецЦикла;	
	
	Возврат мас;
КонецФункции



Ну и
https://infostart.ru/1c/articles/1573726/
20 АгентБезопасной Нацио
 
14.05.25
17:15
//Сохраняет конвертируемый файл в каталоге временных файлов, 
// конвертирует GhostScript'ом в jpg с разрешением 150 точек,
// возвращает сконвертированную первую страницу в хранилище
//  или неопределено, если не смог сконвертировать 

Функция КонверторPDFtoJPG_двоичные(СсылкаНаДвоичныеДанныеФайла, УникальныйИдентификаторФормы=Неопределено, РазмерКонвертации = "r150")  Экспорт
	
	Путь_ВТ_КаталогаРаспознаванияPDF=КаталогВременныхФайлов();
	ПутьПриложенияКонвекторPDFtoJPG =ПутьККонвертеруPDFtoJPG();
	ФайлКонвертирования		 = СтрЗаменить(новый УникальныйИдентификатор, "-","");
	ИмяФайлКонвертирования	  = ФайлКонвертирования+".pdf";
	ИмяФайлКонвертированияJPG   = ФайлКонвертирования+"_p%%02d"+".jpg";
	
	ПутьФайлКонвертированияPDF=Путь_ВТ_КаталогаРаспознаванияPDF+"\"+ИмяФайлКонвертирования;	
	ПутьФайлКонвертированияJPG=Путь_ВТ_КаталогаРаспознаванияPDF+"\"+ИмяФайлКонвертированияJPG;	

	ДвоичныеДанныеФайла=ПолучитьИзВременногоХранилища(СсылкаНаДвоичныеДанныеФайла);
	ДвоичныеДанныеФайла.Записать(ПутьФайлКонвертированияPDF);
	
	ИмяКомандногоФайлаКонвертирования = СтрЗаменить(новый УникальныйИдентификатор, "-","");
	ПутьКомандногоФайлаКонвертирования= Путь_ВТ_КаталогаРаспознаванияPDF+"\" + ИмяКомандногоФайлаКонвертирования + ".cmd";

	//-----------------------------------------------
	СтрокаЗапуска			=  "@""" + ПутьПриложенияКонвекторPDFtoJPG +"""" 
							+" -q -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -"+РазмерКонвертации+" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -dMaxStripSize=8192 -sOutputFile="
							+""""+ПутьФайлКонвертированияJPG+""""+" "	 	
							+""""+ПутьФайлКонвертированияPDF+"""";	 	
			
	//-----------------------------------------------
	WshShell = Новый COMОбъект("Wscript.Shell");
	WshShell.CurrentDirectory =Путь_ВТ_КаталогаРаспознаванияPDF;
	
	КомандныйФайл = Новый ЗаписьТекста(ПутьКомандногоФайлаКонвертирования, КодировкаТекста.ANSI);
	КомандныйФайл.ЗаписатьСтроку(СтрокаЗапуска);
	КомандныйФайл.Закрыть();
	WshShell.Run(ПутьКомандногоФайлаКонвертирования,0,Истина);
	//------------------------------------------------
	//ЗапуститьПриложение(ПутьФайлаБатКонвектор, ,Истина);
	
	МассивФайлов = НайтиФайлы(Путь_ВТ_КаталогаРаспознаванияPDF ,ФайлКонвертирования+"*.jpg");//"*.txt");
	Если МассивФайлов.Количество()>0 Тогда
		НовыеДвоичныеДанныеФайла = Новый ДвоичныеДанные(МассивФайлов[0].ПолноеИмя);
		СсылкаНаДвоичныеДанныеФайла =ПоместитьВоВременноеХранилище(НовыеДвоичныеДанныеФайла,УникальныйИдентификаторФормы);
	Иначе
		// можно закомментировать, чтоб возвращался неконвертированный
		СсылкаНаДвоичныеДанныеФайла = Неопределено;
	КонецЕсли;
	
	Возврат СсылкаНаДвоичныеДанныеФайла;
	
КонецФункции //КонверторPDFtoJPG
21 Алекс587444
 
14.05.25
15:17
(19) благодарю, пошёл пробовать
22 maxab72
 
14.05.25
15:17
(17) по тому как 1с распознает, что есть картинка а что нет? хз, на инфорстарте были в комментах какие-то указания на перечень файлов, gif bpm png точно распознает. PDF надо сохранять с типом pdf и выводить на печать как файл (1с может сама выводить pdf без обращения к адобе), а не вставлять в ворд. Если вставить в ворд, там вставится только иконка с типом файла, но без ссылки на него (если он не сохранен нигде). А как в ворд присоединять кодом данные файла - я сейчас не помню, надо документацию по vba освежить в памяти.
23 АгентБезопасной Нацио
 
14.05.25
15:20
(22) pdf - в платформах старше какой-то (вроде 23)
24 АгентБезопасной Нацио
 
14.05.25
15:26
(22) распознает по сигнатуре в начале файла
25 maxab72
 
14.05.25
15:29
(23) 8.3.21
(22) это понятно, просто я перечень этих файлов не помню где видел. svg вроде не распознает.
26 Fish
 
гуру
14.05.25
15:30
"файл  в формате pdf  при печати хочу его выводить в форме картинки png"

Извините, что вмешиваюсь, но какой в этом смысл? Почему нельзя перед печатью показывать файл, как pdf?
27 Fish
 
гуру
14.05.25
15:34
+(26) И кстати, если ПДФ многостраничный, то как надо конвертить? Всё равно в одну картинку (что будет не очень удобно для просмотра) или каждая страница отдельной картинкой?
28 Fish
 
гуру
14.05.25
15:37
(20) "WshShell = Новый COMОбъект("Wscript.Shell");
    WshShell.CurrentDirectory =Путь_ВТ_КаталогаРаспознаванияPDF;"

Фу-фу. На Линуксе не взлетит. Сейчас уже модно и молодёжно кроссплатформенный код писать.
29 Garykom
 
гуру
14.05.25
16:05
Имхо сложность задачи превышает знания и возможности ТС
Использование ImageMagick + GhostScript хороший путь, но куча тонкостей
30 Hmster
 
15.05.25
10:54
(26) а может надо неинтерактивно, а пдф так не дает печатать
31 Мультук
 
гуру
15.05.25
11:03
(26)

Например

Нужно в один табличный документ добавить некие данные по товару,
а затем в этот же табличный документ спецификации по этому товару. А спецификации могут быть как картинками, так и PDF, так и многостраничным PDF.

Затем этот единый табличный документ отправить почтой.

И менять тех.задание - нельзя. :-)
32 Rovan
 
гуру
15.05.25
12:39
Закон Брукера: Даже маленькая практика стоит большой теории.