Нанесение штампа на PDF файл при регистрации (входящий номер и дата)

14.05.18

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

Данный код реализует возможность автоматического нанесения штампа на PDF файл при регистрации (входящий номер и дата).

UPD 30.05 
Добавил параметр функции ДелатьБольшие - это позволяет ограничить установку штампа на файлы до 5Мб, если этого не сделать можно на больших входящих повесить сервак.
Письма с большими файлами можно (при необходимости) штрихкодировать вызывая функцию вручную, для этого я в меню команд Входящего документа (Форма элемента) добавил свою команду "Нанести штамп".
Добавил изменение, которое проставляет штамп только на первой странице файла. Так лучше.

Основной текст статьи:
Обязательное условие - установленный на сервере ImageMagic, Ghostscript. У меня версия ImageMagick-6.9.1-Q8, работает стабильно, как на счет других версий - не знаю.

Процедура размещена в общем модуле, обращение к ней происходит по дополнительному обработчику бизнес-события "Регистрация входящего документа".

Единственный минус, который я сейчас вижу - сильное увеличение размера файла PDF после нанесения штампа, в ситуации когда дисковое пространство стоит копейки, этот минус несущественный.

Кроме штампа я еще решил наносить штрих-код, его рисую вместе с числовым представлением на случай если придется его считать, а сканер "не возьмёт", тогда его можно будет идентифицировать по номеру кода.

Штрих-код присваивается элементу справочника - входящему документу, а не файлу, так мне кажется правильнее.

Штамп наносится только на файлы, которые помечены в карточке как "скан-копии оригинала", кроме того к версии добавляется автоматический комментарий, который указывает, что версия уже "проштампована" и не требует повторной обработки.

Текст функции привожу как есть

&НаСервере
Функция НанестиШтампНаСканКопиюОригина (ДокументСсылка, ДелатьБольшие = Ложь) Экспорт
	
	Документ = ДокументСсылка.ПолучитьОбъект();
	
	стрРезультат = Ложь;
	
	если НЕ ЗначениеЗаполнено(Документ.РегистрационныйНомер) или НЕ ЗначениеЗаполнено(Документ.ДатаРегистрации) тогда
		Возврат стрРезультат;
	конецесли;
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Файлы.ТекущаяВерсия,
	|	Файлы.Ссылка КАК Файл,
	|	Файлы.ПометкаУдаления,
	|	Файлы.Зашифрован,
	|	Файлы.ВладелецФайла КАК ВладелецФайла,
	|	ISNULL(СведенияОФайлах.ЯвляетсяОригиналом, ЛОЖЬ) КАК ЯвляетсяОригиналом
	|ИЗ
	|	Справочник.Файлы КАК Файлы
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОФайлах КАК СведенияОФайлах
	|		ПО (СведенияОФайлах.Файл = Файлы.Ссылка)
	|ГДЕ
	|	Файлы.ВладелецФайла = &ВладельцыФайлов
	|	И Файлы.ТекущаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)
	|	И выразить(Файлы.ТекущаяВерсия.Комментарий как строка(17))<> ""Вставка штрихкода""
	|	И НЕ Файлы.ПометкаУдаления И СведенияОФайлах.ЯвляетсяОригиналом = ИСТИНА";
	
	Запрос.Параметры.Вставить("ВладельцыФайлов", Документ.Ссылка);
	
	Результат = Запрос.Выполнить().Выбрать();
	
	Пока Результат.Следующий() цикл
		
		если ВРЕГ(Результат.Файл.ТекущаяВерсия.Расширение) <> ВРЕГ("pdf") тогда
			Продолжить;
		конецесли;
		
		если ДелатьБольшие тогда
			если Результат.Файл.ТекущаяВерсия.Размер > 50000000 тогда
				Продолжить;
			конецесли;							
		иначе
			если Результат.Файл.ТекущаяВерсия.Размер > 5000000 тогда
				Продолжить;
			конецесли;				
		конецесли;
		
		ТипХраненияФайла = Результат.Файл.ТекущаяВерсия.ТипХраненияФайла;
		ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);		
		
		Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
			
			ХранилищеФайла = РаботаСФайламиВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(Результат.Файл.ТекущаяВерсия);
			ДвоичныеДанныеФайла = ХранилищеФайла.Получить();
			ДвоичныеДанныеФайла.Записать(ИмяФайлаСПутем);
			
		Иначе 
			
			Если НЕ Результат.Файл.ТекущаяВерсия.Том.Пустая() Тогда
				ИмяФайлаСПутемВТоме = ФайловыеФункции.ПолныйПутьТома(Результат.Файл.ТекущаяВерсия.Том) + Результат.Файл.ТекущаяВерсия.ПутьКФайлу; 
				КопироватьФайл(ИмяФайлаСПутемВТоме, ИмяФайлаСПутем);
				Файл = Новый Файл(ИмяФайлаСПутем);
				Файл.УстановитьТолькоЧтение(Ложь);
			КонецЕсли;
			
		КонецЕсли;
		
		ИмяФайлаРезультата = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);
		ИмяФайлаРезультата2 = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);
		
		ПутьКПрограммеКонвертацииPDF = РаботаСФайламиВызовСервера.ПолучитьПутьКПрограммеКонвертацииPDF();
		
		стрПуть = " -density 150 -quality 100 " + ИмяФайлаСПутем + "[0] null: ";
		
		Если ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ВнутренниеДокументы")
				ИЛИ ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ВходящиеДокументы")
				ИЛИ ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ИсходящиеДокументы") Тогда
				
			Штрихкод = ШтрихкодированиеСервер.СформироватьШтрихКод();
			Штрихкод_ориг = ШтрихкодированиеСервер.ПолучитьШтрихКод(Документ.Ссылка);
			если Штрихкод_ориг <> Неопределено тогда
				Штрихкод = Штрихкод_ориг;
			иначе
				ШтрихкодированиеСервер.ПрисвоитьШтрихКод(Документ.Ссылка, Штрихкод);
			конецесли;
			НастройкиШтрихкода = ШтрихкодированиеСервер.ПолучитьПерсональныеНастройкиПоложенияШтрихкодаНаСтранице();
			
			Если НЕ Штрихкод = Неопределено Тогда
				
				ИмяВременногоФайлаКартинки = ПолучитьИмяВременногоФайла("JPG");
				ДвоичныеДанныеИзображения = ШтрихкодированиеСервер.ПолучитьКартинкуШтрихкода(Штрихкод,, НастройкиШтрихкода.ВысотаШК, НастройкиШтрихкода.ПоказыватьЦифры).ПолучитьДвоичныеДанные();				
		        ДвоичныеДанныеИзображения.Записать(ИмяВременногоФайлаКартинки);
				
				Если ДвоичныеДанныеИзображения <> Неопределено Тогда

					стрПуть = стрПуть + "( " + ИмяВременногоФайлаКартинки + " -resize +150% -quality 100 ) -gravity SouthEast -compose multiply -geometry +300+50 -layers composite ";

				конецесли;
			
			конецесли;
		конецесли;
		
		стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """ " + стрПуть + " -font Tahoma -pointsize 12 -draw ""gravity SouthEast text 90,70 '"+ Строка(Документ.РегистрационныйНомер) + "'"" -draw ""gravity SouthEast text 90,40 '"+Строка(Формат(Документ.ДатаРегистрации, "ДЛФ=Д"))+ "'""" + " " + ИмяФайлаРезультата; 
		ЗапуститьПриложение(стрПуть,,Истина);	
		
		стрПуть = " -density 150 -quality 100 " + ИмяФайлаРезультата + " " + ИмяФайлаСПутем + "[1-10000]  " + ИмяФайлаРезультата2;
		стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """ " + стрПуть;
		ЗапуститьПриложение(стрПуть,,Истина);	
		
		ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
		
		АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДвоичныеДанныеРезультата, Результат.Файл, "Вставка штрихкода");
		
		стрРезультат = Истина;
		
		УдалитьФайлы(ИмяФайлаСПутем);
		УдалитьФайлы(ИмяФайлаРезультата);
		УдалитьФайлы(ИмяФайлаРезультата2);
		УдалитьФайлы(ИмяВременногоФайлаКартинки);
		Файл = Неопределено;
		
	конеццикла;	
	
	Документ = Неопределено;
	
	Возврат стрРезультат;
	
КонецФункции

 

штамп документооборот штрих-код

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    4608    atdonya    22    

45

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3961    ke.92@mail.ru    16    

61

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8822    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16144    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

109
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 15.05.18 05:49
Сообщение было скрыто модератором.
...
2. user790607 15.05.18 11:32 Сейчас в теме
Интересный функционал, возьму на заметку...
aabogachev; +1 Ответить
9. пользователь 17.05.18 05:52
Сообщение было скрыто модератором.
...
3. ivan811 15.05.18 17:44 Сейчас в теме
Я правильно понимаю что меняется входящий pdf файл? То есть например для файл подписанного электронной подписью это сделать уже будет нельзя- подпись будет неверна?
4. aabogachev 171 15.05.18 17:47 Сейчас в теме
(3) не совсем "меняется", а делается новая версия, которая назначается активной. конечно в случае с применением электронной подписи это не сработает, но у нас по крайней мере нет и не предвидится входящих документов заверенных электронной подписью.
5. spezc 782 16.05.18 06:47 Сейчас в теме
В качестве штампа может быть только текст? Картинка может быть? Можно ли такое провернуть с doc, xls?
6. konstruktiv 16.05.18 08:23 Сейчас в теме
(5) штатный 1С: Документооборот из коробки может вставлять в doc картинку штрихкода или вместе с текстом штампа
aabogachev; +1 Ответить
22. romulanin 09.04.19 11:56 Сейчас в теме
(6) как функционал называется ?
23. konstruktiv 09.04.19 15:39 Сейчас в теме
(22) на скрине
Прикрепленные файлы:
adhocprog; romulanin; +2 Ответить
7. Поручик 4670 16.05.18 16:18 Сейчас в теме
Это интересно. В прошлом году парились с этой темой, как бы картинку- штамп в файл pdf засунуть. Так ничего путного не придумали.
8. Lapitskiy 1057 17.05.18 03:43 Сейчас в теме
Интересная штука!
А можно гиперссылку вставлять с помощью этой ImageMagic?
10. Kami4 17.05.18 07:08 Сейчас в теме
Интересная фича. В закладку!
11. mylogin 107 17.05.18 11:39 Сейчас в теме
Автор забыл упомянуть, что помимо ImageMagick необходимо будет установить Ghostscript, Magick работает с pdf через него.

Единственный минус, который я сейчас вижу - сильное увеличение размера файла PDF после нанесения штампа, в ситуации когда дисковое пространство стоит копейки, этот минус несущественный.


Use -type optimize to ensure the image is written in the smallest possible file size. - это должно помочь.
Так же через -type можно задать цветовой режим изображения, например если не нужны цвета, то можно использовать "оттенки серого" , -type Grayscale или -type GrayscaleMatte - с альфа-каналом для поддержки прозрачности. Это во первых ускорит работу скрипта, во вторых естественно уменьшится размер выходного файла.

Делал подобное, но для штампов ЭЦП. У меня файлы формировались на лету, только для просмотра и печати, эти версии не сохранялись по понятным причинам.
Созинов; adhocprog; e-9; antonio_i; aabogachev; +5 Ответить
12. webester 26 17.05.18 12:18 Сейчас в теме
(0)Тоже не смогли осилить ком объект? Я устал с ним воевать :( тоже делал через выполнить.
adhocprog; aabogachev; +2 Ответить
13. a.x.a 2 21.05.18 01:47 Сейчас в теме
Как раз то, что нужно. Спасибо за идею.
14. samvani 35 05.07.18 08:34 Сейчас в теме
А что с разрешением?
Если отсканированный документ, точнее первый лист, имеет другую размерность. Как ляжет штамп?
Мы реализовали вставку штампа на pdf похожим способом, но делали resize первой страницы под нужный размер, чтобы по координатам прорисовать. Но возникли ошибки при печати: pdf не понимал размер и первая страница печаталась в уменьшенном виде.
15. samvani 35 05.07.18 08:36 Сейчас в теме
Если бы получить оригинальный размер страницы, тогда можно было бы относительными координатами все нарисовать.
Может есть какая-то возможность получить информацию о размере листа?
16. antonio_i 80 23.12.18 20:30 Сейчас в теме
Как раз понадобилось такое реализовать. Буду пробовать.
17. antti2015 15.01.19 18:41 Сейчас в теме
Все прекрасно, но после обработки на моменте
ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);

Валится ошибка
{ВнешняяОбработка.ТестДиадок.Форма.Форма.Форма(116)}: Ошибка при вызове конструктора (ДвоичныеДанные)
ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
по причине:
Файл не обнаружен 'C:\Users\Андрей\AppData\Local\Temp\v8_38D9_f0.pdf'

Установлена ImageMagick-7.0.8-23-Q8-x64-dll.exe
Возможно это из-за версии ImageMagick?

Кто-нибудь сталкивался?
25. mariya.mary.00 19.11.19 17:22 Сейчас в теме
(17) Добрый день! Не подскажите, как-то удалось побороть данную ошибку?
28. vladimir-89 24 23.12.19 13:07 Сейчас в теме
(25) Добрый день. Тоже столкнулся с такой ошибкой. На рабочей базе на платформе 8.3.1565 вылетает ошибка, а на старой тестовой на платформе 8.2 файл добавляется нормально. Может это от версии платформы зависит? У меня вообще в документообороте 1.3, при добавлении файла используется конструктор "ДвоичныеДанные".
38. DEG156 28 05.06.20 08:38 Сейчас в теме
&НаСервере
Функция НанестиШтампНаСканКопиюОригина(ДокументСсылка, ДелатьБольшие = Ложь) Экспорт
	
	Документ = ДокументСсылка.ПолучитьОбъект();
	
	стрРезультат = Ложь;
	
	если НЕ ЗначениеЗаполнено(Документ.РегистрационныйНомер) или НЕ ЗначениеЗаполнено(Документ.ДатаРегистрации) тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Документ не зарегистрирован !");
		Возврат Ложь;
	конецесли;
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Файлы.ТекущаяВерсия,
	|	Файлы.Ссылка КАК Файл,
	|	Файлы.ПометкаУдаления,
	|	Файлы.Зашифрован,
	|	Файлы.ВладелецФайла КАК ВладелецФайла,
	|	ISNULL(СведенияОФайлах.ЯвляетсяОригиналом, ЛОЖЬ) КАК ЯвляетсяОригиналом
	|ИЗ
	|	Справочник.Файлы КАК Файлы
	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОФайлах КАК СведенияОФайлах
	|		ПО (СведенияОФайлах.Файл = Файлы.Ссылка)
	|ГДЕ
	|	Файлы.ВладелецФайла = &ВладельцыФайлов
	|	И Файлы.ТекущаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)
	|	И выразить(Файлы.ТекущаяВерсия.Комментарий как строка(17))<> ""Вставка штрихкода""
	|	И НЕ Файлы.ПометкаУдаления И СведенияОФайлах.ЯвляетсяОригиналом = ИСТИНА";
	
	Запрос.Параметры.Вставить("ВладельцыФайлов", Документ.Ссылка);
	РВЗ = Запрос.Выполнить();
	
	Если РВЗ.Пустой() Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найден нужный файл PDF !");
		Возврат Ложь;
	КонецЕсли;	
	
	Результат = РВЗ.Выбрать();
	Пока Результат.Следующий() цикл
		
		если ВРЕГ(Результат.Файл.ТекущаяВерсия.Расширение) <> ВРЕГ("pdf") тогда
			Продолжить;
		конецесли;
		
		если ДелатьБольшие тогда
			если Результат.Файл.ТекущаяВерсия.Размер > 50000000 тогда
				Продолжить;
			конецесли;							
		иначе
			если Результат.Файл.ТекущаяВерсия.Размер > 5000000 тогда
				Продолжить;
			конецесли;				
		конецесли;
		
		ТипХраненияФайла = Результат.Файл.ТекущаяВерсия.ТипХраненияФайла;
		ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);		
		
		Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
			
			ХранилищеФайла = РаботаСФайламиВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(Результат.Файл.ТекущаяВерсия);
			ДвоичныеДанныеФайла = ХранилищеФайла.Получить();
			ДвоичныеДанныеФайла.Записать(ИмяФайлаСПутем);
			
		Иначе 
			
			Если НЕ Результат.Файл.ТекущаяВерсия.Том.Пустая() Тогда
				ИмяФайлаСПутемВТоме = ФайловыеФункции.ПолныйПутьТома(Результат.Файл.ТекущаяВерсия.Том) + Результат.Файл.ТекущаяВерсия.ПутьКФайлу; 
				КопироватьФайл(ИмяФайлаСПутемВТоме, ИмяФайлаСПутем);
				Файл = Новый Файл(ИмяФайлаСПутем);
				Файл.УстановитьТолькоЧтение(Ложь);
			КонецЕсли;
			
		КонецЕсли;
		
		ИмяФайлаРезультата = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);
		ИмяФайлаРезультата2 = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);
		
		ПутьКПрограммеКонвертацииPDF = СокрЛП(РаботаСФайламиВызовСервера.ПолучитьПутьКПрограммеКонвертацииPDF());
		ПутьКПрограммеКонвертацииPDF2 = "C:\Program Files\ImageMagick-7.0.10-Q16\convert.exe";
		
		стрПуть = "-density 150 -quality 100 " + СокрЛП(ИмяФайлаСПутем) + "[0] null: ";
		
		Если ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ВнутренниеДокументы")
			ИЛИ ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ВходящиеДокументы")
			ИЛИ ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ИсходящиеДокументы") Тогда
			
			Штрихкод = ШтрихкодированиеСервер.СформироватьШтрихКод();
			Штрихкод_ориг = ШтрихкодированиеСервер.ПолучитьШтрихКод(Документ.Ссылка);
			если Штрихкод_ориг <> Неопределено тогда
				Штрихкод = Штрихкод_ориг;
			иначе
				ШтрихкодированиеСервер.ПрисвоитьШтрихКод(Документ.Ссылка, Штрихкод);
			конецесли;
			НастройкиШтрихкода = ШтрихкодированиеСервер.ПолучитьПерсональныеНастройкиПоложенияШтрихкодаНаСтранице();
			
			Если Штрихкод = Неопределено Или Штрихкод = "" Тогда
			   ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Штрих-код документа не определен !");	
				Продолжить;
			Иначе
				
				ИмяВременногоФайлаКартинки = ПолучитьИмяВременногоФайла("JPG");
				ДвоичныеДанныеИзображения = ШтрихкодированиеСервер.ПолучитьКартинкуШтрихкода(Штрихкод,, НастройкиШтрихкода.ВысотаШК, НастройкиШтрихкода.ПоказыватьЦифры).ПолучитьДвоичныеДанные();				
				ДвоичныеДанныеИзображения.Записать(ИмяВременногоФайлаКартинки);
				
				Если ДвоичныеДанныеИзображения <> Неопределено Тогда
					
					стрПуть = стрПуть + "( " + ИмяВременногоФайлаКартинки 
					+ " -resize +150% -quality 100 ) -gravity SouthEast -compose multiply -geometry +300+50 -layers composite ";
					
				конецесли;
				
			конецесли;
		Иначе
		   ИмяВременногоФайлаКартинки = "";	
		конецесли;
		
		стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """ " + стрПуть + " -font Tahoma -pointsize 12 -draw ""gravity SouthEast text 90,70 '"
		+ Строка(Документ.РегистрационныйНомер) 
		+ "'"" -draw ""gravity SouthEast text 90,40 '"+Строка(Формат(Документ.ДатаРегистрации, "ДЛФ=Д"))
		+ "'""" + " " + ИмяФайлаРезультата; 
		ЗапуститьПриложение(стрПуть,,Истина);	
		
		стрПуть = " -density 150 -quality 100 " + ИмяФайлаРезультата + " " + ИмяФайлаСПутем + "[1-10000] " 
		+ ИмяФайлаРезультата2;
		стрПуть = """" + ПутьКПрограммеКонвертацииPDF2 + """" + стрПуть;
		ЗапуститьПриложение(стрПуть,,Истина);	
		
		Попытка
			ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
		Исключение
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю("стрПуть: "+стрПуть+Символы.ПС+"ИмяФайлаРезультата2: "+ИмяФайлаРезультата2+Символы.ПС+ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
		
		АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДвоичныеДанныеРезультата, Результат.Файл, "Вставка штрихкода");
		
		стрРезультат = Истина;
		
		УдалитьФайлы(ИмяФайлаСПутем);
		УдалитьФайлы(ИмяФайлаРезультата);
		УдалитьФайлы(ИмяФайлаРезультата2);
		Если ИмяВременногоФайлаКартинки <> "" Тогда
		   УдалитьФайлы(ИмяВременногоФайлаКартинки);
		КонецЕсли;	
		Файл = Неопределено;
		
	конеццикла;	
	
	Документ = Неопределено;
	
	Возврат стрРезультат;
	
КонецФункции
Показать
47. user706076_stravin 26.03.21 15:57 Сейчас в теме
(17) Помогла переустановка ImageMagick на более свежий (ImageMagick-7.0.11-Q16).
18. podelis 25.03.19 14:11 Сейчас в теме
Приветствую. Воспользовались Вашим кодом. Спасибо! Вот так с такими параметрами у нас запускается Меджик:

1)"magick.exe" -density 150 -quality 100 E:\d1\v8_7EF5_1b1.pdf[0] null: -font Tahoma -pointsize 12 -draw "gravity SouthEast text 90,70 '9'" -draw "gravity SouthEast text 90,40 '25.03.2019'" E:\d1\v8_7EF5_1b2.pdf

2) "magick.exe" -density 150 -quality 100 E:\d1\v8_7EF5_1b2.pdf E:\d1\v8_7EF5_1b1.pdf[1-10000] E:\d1\v8_7EF5_1b3.pdf

Штамп ставится, но если док. многостраничный - все страницы кроме первой обрезаются.
19. aabogachev 171 25.03.19 14:51 Сейчас в теме
(18) потому что команда должна делать это в один заход,
у меня это

стрПуть = " -density 150 -quality 100 " + ИмяФайлаРезультата + " " + ИмяФайлаСПутем + "[1-10000] " + ИмяФайлаРезультата2;

выполняется вместе с обработкой страницы [0] а у вас получается, что вы сначала делаете работу со страницей [0] а потом из нее пытаетесь получить [1-10000] которых там уже нет
20. podelis 27.03.19 23:52 Сейчас в теме
(19) Спасибо! Взяли Ваш код как есть, многостраничные штампует как надо, а вот одностраничные не отрабатывает. В момент обращения:

АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДвоичныеДанныеРезультата, Результат.Файл, "Вставка штампа");

Валится с ошибкой:

{ОбщийМодуль.рт_ДополнительныеВозможностиСервер.Модуль(202)}: Ошибка при вызове конструктора (ДвоичныеДанные)
ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
по причине:
Файл не обнаружен 'E:\d1\v8_1D20_e6.pdf'

На всякий пожарный, вот код, который используем:


Документ = ДокументСсылка.ПолучитьОбъект();
	
	стрРезультат = Ложь;
	
	если НЕ ЗначениеЗаполнено(Документ.РегистрационныйНомер) или НЕ ЗначениеЗаполнено(Документ.ДатаРегистрации) тогда
		Возврат стрРезультат;
	конецесли;
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Файлы.ТекущаяВерсия,
	|	Файлы.Ссылка КАК Файл,
	|	Файлы.ПометкаУдаления,
	|	Файлы.Зашифрован,
	|	Файлы.ВладелецФайла КАК ВладелецФайла,
	|	ISNULL(СведенияОФайлах.ЯвляетсяОригиналом, ЛОЖЬ) КАК ЯвляетсяОригиналом
	|ИЗ
	|	Справочник.Файлы КАК Файлы
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОФайлах КАК СведенияОФайлах
	|		ПО (СведенияОФайлах.Файл = Файлы.Ссылка)
	|ГДЕ
	|	Файлы.ВладелецФайла = &ВладельцыФайлов
	|	И Файлы.ТекущаяВерсия <> ЗНАЧЕНИЕ(Справочник.ВерсииФайлов.ПустаяСсылка)
	|	И выразить(Файлы.ТекущаяВерсия.Комментарий как строка(17))<> ""Вставка штампа""
	|	И НЕ Файлы.ПометкаУдаления";
	
	Запрос.Параметры.Вставить("ВладельцыФайлов", Документ.Ссылка);
	
	Результат = Запрос.Выполнить().Выбрать();
	
	Пока Результат.Следующий() цикл
		
		если ВРЕГ(Результат.Файл.ТекущаяВерсия.Расширение) <> ВРЕГ("pdf") тогда
			Продолжить;
		конецесли;
		
		если ДелатьБольшие тогда
			если Результат.Файл.ТекущаяВерсия.Размер > 50000000 тогда
				Продолжить;
			конецесли;							
		иначе
			если Результат.Файл.ТекущаяВерсия.Размер > 5000000 тогда
				Продолжить;
			конецесли;				
		конецесли;
		
		ТипХраненияФайла = Результат.Файл.ТекущаяВерсия.ТипХраненияФайла;
		ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);		
		
		Если ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда
			
			ХранилищеФайла = РаботаСФайламиВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(Результат.Файл.ТекущаяВерсия);
			ДвоичныеДанныеФайла = ХранилищеФайла.Получить();
			ДвоичныеДанныеФайла.Записать(ИмяФайлаСПутем);
			
		Иначе 
			
			Если НЕ Результат.Файл.ТекущаяВерсия.Том.Пустая() Тогда
				ИмяФайлаСПутемВТоме = ФайловыеФункции.ПолныйПутьТома(Результат.Файл.ТекущаяВерсия.Том) + Результат.Файл.ТекущаяВерсия.ПутьКФайлу; 
				КопироватьФайл(ИмяФайлаСПутемВТоме, ИмяФайлаСПутем);
				Файл = Новый Файл(ИмяФайлаСПутем);
				Файл.УстановитьТолькоЧтение(Ложь);
			КонецЕсли;
			
		КонецЕсли;
		
		ИмяФайлаРезультата = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);
		ИмяФайлаРезультата2 = ПолучитьИмяВременногоФайла(Результат.Файл.ТекущаяВерсия.Расширение);
		
		ПутьКПрограммеКонвертацииPDF = РаботаСФайламиВызовСервера.ПолучитьПутьКПрограммеКонвертацииPDF();
		
		стрПуть = " -density 150 -quality 100 " + ИмяФайлаСПутем + "[0] null: ";
		
		Если ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ВнутренниеДокументы")
				ИЛИ ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ВходящиеДокументы")
				ИЛИ ТипЗнч(Результат.Файл.ВладелецФайла) = Тип("СправочникСсылка.ИсходящиеДокументы") Тогда
				
			Штрихкод = ШтрихкодированиеСервер.СформироватьШтрихКод();
			Штрихкод_ориг = ШтрихкодированиеСервер.ПолучитьШтрихКод(Документ.Ссылка);
			если Штрихкод_ориг <> Неопределено тогда
				Штрихкод = Штрихкод_ориг;
			иначе
				ШтрихкодированиеСервер.ПрисвоитьШтрихКод(Документ.Ссылка, Штрихкод);
			конецесли;
			НастройкиШтрихкода = ШтрихкодированиеСервер.ПолучитьПерсональныеНастройкиПоложенияШтрихкодаНаСтранице();
			
			Если НЕ Штрихкод = Неопределено Тогда
				
				ИмяВременногоФайлаКартинки = ПолучитьИмяВременногоФайла("JPG");
				ДвоичныеДанныеИзображения = ШтрихкодированиеСервер.ПолучитьКартинкуШтрихкода(Штрихкод,, НастройкиШтрихкода.ВысотаШК, НастройкиШтрихкода.ПоказыватьЦифры).ПолучитьДвоичныеДанные();				
		        ДвоичныеДанныеИзображения.Записать(ИмяВременногоФайлаКартинки);
				
				Если ДвоичныеДанныеИзображения <> Неопределено Тогда

					стрПуть = стрПуть + "( " + ИмяВременногоФайлаКартинки + " -resize +150% -quality 100 ) -gravity SouthEast -compose multiply -geometry +300+50 -layers composite ";

				конецесли;
			
			конецесли;
		конецесли;
		
		стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """ " + стрПуть + " -font Tahoma -pointsize 12 -draw ""gravity SouthEast text 90,70 '"+ Строка(Документ.РегистрационныйНомер) + "'"" -draw ""gravity SouthEast text 90,40 '"+Строка(Формат(Документ.ДатаРегистрации, "ДЛФ=Д"))+ "'""" + " " + ИмяФайлаРезультата; 
		ЗапуститьПриложение(стрПуть,,Истина);	
		
		стрПуть = " -density 150 -quality 100 " + ИмяФайлаРезультата + " " + ИмяФайлаСПутем + "[1-10000]  " + ИмяФайлаРезультата2;
		стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """ " + стрПуть;
		
		
		ЗапуститьПриложение(стрПуть,,Истина);	
		
		ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
		
				
		АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДвоичныеДанныеРезультата, Результат.Файл, "Вставка штампа");
		
		стрРезультат = Истина;
		
		УдалитьФайлы(ИмяФайлаСПутем);
		УдалитьФайлы(ИмяФайлаРезультата);
		УдалитьФайлы(ИмяФайлаРезультата2);
		УдалитьФайлы(ИмяВременногоФайлаКартинки);
		Файл = Неопределено;
		
	конеццикла;	
	
	Документ = Неопределено;
	
	Возврат стрРезультат;
Показать
26. mariya.mary.00 19.11.19 17:23 Сейчас в теме
(20) Добрый день! Не подскажите, как-то удалось побороть данную ошибку?
ВИЛенин; +1 Ответить
37. ВИЛенин 1 04.06.20 07:51 Сейчас в теме
(20)
magick


аналогичная ошибка...
48. user706076_stravin 26.03.21 15:58 Сейчас в теме
(20) Помогла переустановка ImageMagick на более свежий (ImageMagick-7.0.11-Q16).
21. aabogachev 171 01.04.19 15:09 Сейчас в теме
У меня сейчас нет возможности проверить ваш код, я последнее время перестал программить :( единственное, что могу посоветовать - сравнить мой код и ваш и понять разницу. кроме того, поставить точку остановки перед той строкой на которую он ругается и посмотреть на сервере - создается ли вообще этот временный файл.
у меня работало все нормально и одностраничными и многостраничными документами. пишите если что.
24. Andrey1210 10.04.19 12:07 Сейчас в теме
Крутая штука запустил. А как штамп на всех страницах проставлять ?
27. mariya.mary.00 20.11.19 13:15 Сейчас в теме
Вдруг кому-то пригодиться, при ошибке -
"ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
по причине:
Файл не обнаружен"
Мне помогло явное указание в константах - "Путь к программе конвертации ПДФ" - вместо "convert.exe" - "C:\Program Files\ImageMagick-6.9.10-Q8\convert.exe".
Конфигурация ДО.
Автору спасибо за идею!
29. Rom1k 19 30.01.20 12:34 Сейчас в теме
(27)
Дополню, перенесите конвертацию на сервер или тащите все файлы на клиента.
36. ВИЛенин 1 04.06.20 06:40 Сейчас в теме
(27) прописал так, а ошибка всё равно осталась. Нет файла. Не создаёт на сервере...
30. DEG156 28 27.04.20 11:20 Сейчас в теме
Да. Спасибо автору. Внесу свои пять копеек. Процедуру пришлось доработать. Какой - то хитрый нюанс работы программы "ImageMagick"

В этой процедуре идет 2 запуска конвертации.

Путь для запуска берется из константы где вызывается утилита "magick.exe"

а вот уже второй запуск должен быть уже другой утилиты - "convert.exe"
35. ВИЛенин 1 04.06.20 06:17 Сейчас в теме
(30) Если не секрет то как доработали?
39. DEG156 28 05.06.20 08:40 Сейчас в теме
(35) Привел текст доработанной функции которая у меня работает. В Константы.ПутьКПрограммеКонвертацииPDF
40. DEG156 28 05.06.20 08:43 Сейчас в теме
(39)
C:\Program Files\ImageMagick-7.0.10-Q16\magick.exe
45. alex649 106 17.11.20 16:37 Сейчас в теме
(30)а вот уже второй запуск должен быть уже другой утилиты - "convert.exe" а где ее взять? в 7 версии ImageMagick ее нет.
31. emcya 4 24.05.20 15:04 Сейчас в теме
Вместо цифр даты регистрации и рег. номера в файле pdf появляются черные прямоугольники. Версия ImageMagick-7.0.10-Q16. Как думаете, в чем причина?
32. user1263334 27.05.20 13:01 Сейчас в теме
Доброго времени суток!
Процедура размещена в общем модуле, обращение к ней происходит по дополнительному обработчику бизнес-события "Регистрация входящего документа".

Прошу простить, не программист. Как обратиться к процедуре из обработчика бизнес-события? Куда смотреть?
33. Jasam 03.06.20 08:27 Сейчас в теме
Подскажите, пожалуйста. Это решение бесплатное?
34. Bukaska 140 03.06.20 14:20 Сейчас в теме
(33)Читать никто не запрещает. Файлов там нет.
41. ВИЛенин 1 05.06.20 09:37 Сейчас в теме
Вот обработочка, где всё работает))
Вставляет офигено красивый Регистрационный штамп :)
Вдруг кому тоже понадобится.... и ошибок для ДО не выдаёт... оригинальный код подправлен...

https://yadi.sk/i/ZXqsqQVqG3h4TA пример рег штампа, ну и приложил, чтобы если удалю с яндекса тут осталось)
Прикрепленные файлы:
Вставка рег штампа.epf
42. nosferat 12.11.20 09:14 Сейчас в теме
(41)
т обработочка, где всё работает))
Вставляет офигено красивый Регистрационный штамп :)
Вдруг кому тоже понадобится.... и ошибок для ДО не выдаёт... оригинальный код подправлен...

https://yadi.sk/i/ZXqsqQVqG3h4TA пример рег штампа, ну и приложил, чтобы


Что не совсем оно работает 8)))
Не удалось запустить usr/bin/mognify -resize 1000% и тд и тп
43. ВИЛенин 1 12.11.20 11:27 Сейчас в теме
(42) Странно, я у себя внедрил, когда работал с ДокументоОборотом. Я просто в винде делал)
44. nosferat 13.11.20 08:04 Сейчас в теме
(43) тоже на винде.
поэтому и удивился путям. надо в отладке поглядеть кто и куда ломится
46. user1045238 19.11.20 09:42 Сейчас в теме
Здравствуйте! Столкнулись с тем, что у некоторых pdf-файлов первая страница со штампом отображается, а дальше некоторые страницы выходят пустые.
НО: 1. в браузере, microsoft edge, FoxitReader все страницы просматриваются.
2. такое поведение не со всеми файлами.
Предположительно, что это происходит с файлами, в которых есть текст, а при конвертации шрифты не переходят в новый файл. Первая страничка преобразуется в изображение, поэтому с ней все нормально.
Не подскажите, как остальные страницы преобразовать в изображение или передать шрифты в файл-результат.

пример командной строки:
"C:\Program Files (x86)\ImageMagick\magick.exe" -density 300 -quality 100 Ф1.pdf[0] null: ( Фкартинки.PNG -resize +200% -quality 100 ) -gravity NorthEast -compose add -geometry +100+300 -layers composite -font Tahoma -fill blue -pointsize 10 -draw "gravity NorthEast text 540,600 '149'" -draw "gravity NorthEast text 160,650 '30 10 20'" Фрез.pdf

"C:\Program Files (x86)\ImageMagick\convert.exe" -density 300 -quality 100 Фрез.pdf Ф1.pdf[1-10000] Фрез2.pdf
49. PAMO 28.04.22 08:43 Сейчас в теме
Здравствуйте, подскажите пожалуйста куда именно нужно вставить этот код?
50. user2046106 09.02.24 14:44 Сейчас в теме
(49) Разобрались?) А то сам не понял
Оставьте свое сообщение