Визуализация штампа с рег. номером (1С.Документооборот КОРП)

1. ovadia 01.02.21 16:29 Сейчас в теме
1С.Документооборот КОРП 2.1 релиз 27.1. Можно ли типовыми средствами визуализировать штамп (с рег. номером входящего документа) в файле прикрепленном к pdf-документу? То есть нужно, чтобы система взяла рег. номер документа и отобразила его в открытом pdf-файле, может быть в виде прямоугольника (рамки) с номером внутри, как обычный штамп.

Кажется, что типового решения нет. Придется допиливать конфигурацию или делать внешнюю обработку.
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. andy_zhav 197 01.02.21 16:40 Сейчас в теме
(1) Штатными средствами не получится. Я для этих целей использовал сторонние утилиты.
3. ovadia 01.02.21 16:42 Сейчас в теме
(2) Какие? Как они интегрируются с 1С?
4. andy_zhav 197 01.02.21 17:11 Сейчас в теме
(3) Я пробовал пользоваться несколькими, сейчас навскидку могу вспомнить только debenu PDF Library - работает через COM объект, pdftk, imageMagic - через командную строку. PDF library - по моему платная. Pdftk - условно-бесплатная (какие-то функции обработки PDF в платной версии), imageMagic - бесплатная.

Штампы я накладывал через pdftk и imagemagic,


даже код нашел:

Функция ДобавитьШтампВPdf(ФайлСсылка, СтруктураПодписи, НаКаждойСтранице = Истина, Смещение = "+750+2000", ТабличныйДокумент = Неопределено, Перезаписывать = Истина) Экспорт
	ПоСтарому = Ложь; // Для совместимости со старым механизмом - штамп в подписях
	Если ТабличныйДокумент = Неопределено Тогда
		ПоСтарому = Истина;
		// Генерируем подпись
		Макет = ПолучитьОбщийМакет("ШтампКЭП");
		Область = Макет.ПолучитьОбласть("Картинка");
		ЗаполнитьЗначенияСвойств(Область.Параметры, СтруктураПодписи);
		Область.Параметры.Дата = ТекущаяДата();
		ТабличныйДокумент = Новый ТабличныйДокумент;
		ТабличныйДокумент.Вывести(Область);
	КонецЕсли;
	// сохраняем подпись в PDF
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("pdf");
	Если ПоСтарому Тогда 
		ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("png");
	Иначе
		ИмяВыходногоФайла = ПолучитьИмяВременногоФайла("pdf");
	КонецЕсли;
	ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.PDF);
	// конвертируем подпись в картинку
	ПутьКИсполняемомуФайлу = """C:\Program files\ImageMagick-7.0.8-Q16\convert"" ";  // чуть чуть говнокода
	СтрокаЗапуска = ПутьКИсполняемомуФайлу + "-transparent white -density 200 " + ИмяВременногоФайла + " " + ИмяВыходногоФайла; 
	ЗапуститьПриложение(СтрокаЗапуска,,Истина);

	///////////////////// Накладываем штамп в pdf /////////////////
	ПолноеИмяФайла = ПолучитьПутьКФайлу(ФайлСсылка);
	Если Не Перезаписывать Тогда 
		ВремПолноеИмяФайла = ПолучитьИмяВременногоФайла("pdf");
		КопироватьФайл(ПолноеИмяФайла, ВремПолноеИмяФайла);
		ПолноеИмяФайла = ВремПолноеИмяФайла;
	КонецЕсли;
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(ФайлСсылка.ТекущаяВерсияРасширение);
	КопироватьФайл(ПолноеИмяФайла, ИмяВременногоФайла);
	ИсходыйФайл = Новый Файл(ПолноеИмяФайла);
	// Разбираем файл на страницы и одновременно конвертируем в картинки
	Если ПоСтарому Тогда
		ВременныйКаталог = Новый Файл(КаталогВременныхФайлов() + "MergePDF_stamp");
		Если ВременныйКаталог.Существует() Тогда
			УдалитьФайлы(ВременныйКаталог.ПолноеИмя,"*.*");
		Иначе
			СоздатьКаталог(ВременныйКаталог.ПолноеИмя);
		КонецЕсли;
		ИмяВыходногоФайлаPDF = ВременныйКаталог.ПолноеИмя + "\output.png";
		ИмяФайлаКартинок = ВременныйКаталог.ПолноеИмя + "\temp.png";
		СтрокаЗапуска = ПутьКИсполняемомуФайлу + "-density 200 " + ИмяВременногоФайла + " " + ИмяФайлаКартинок;

		ЗапуститьПриложение(СтрокаЗапуска,,Истина);
		// Накладываем штамп
		МассивФайлов = НайтиФайлы(ВременныйКаталог.ПолноеИмя, "*.png", Ложь);
		н = 0;
		
		Для Каждого Файл Из МассивФайлов Цикл
			СтрокаЗапуска = ПутьКИсполняемомуФайлу + "-colorspace RGB -composite -geometry " + Смещение + " " + Файл.ПолноеИмя + " " + ИмяВыходногоФайла + "  " + Файл.Путь + Файл.ИмяБезРасширения + ".pdf";
			Shell = Новый COMОбъект("WScript.Shell");
			Shell.Run(СтрокаЗапуска, 0, Истина);
			н = н + 1;
		КонецЦикла;
		УдалитьФайлы(ВременныйКаталог.ПолноеИмя, "*.png");
		МассивФайлов = НайтиФайлы(ВременныйКаталог.ПолноеИмя, "*.pdf", Ложь);
		СтрокаЗапуска = """c:\Program Files (x86)\PDFtk\bin\pdftk.exe"" ";
		Для Каждого Файл Из МассивФайлов Цикл
			СтрокаЗапуска = СтрокаЗапуска + Файл.ПолноеИмя + " ";
		КонецЦикла;
	Иначе 
		СтрокаЗапуска = """c:\Program Files (x86)\PDFtk\bin\pdftk.exe"" " + ПолноеИмяФайла + " multistamp " + ИмяВыходногоФайла;
	КонецЕсли;

	ВременныйФайл = ПолучитьИмяВременногоФайла("pdf");
	СтрокаЗапуска = СтрокаЗапуска + "output " + ВременныйФайл;
	
	Shell = Новый COMОбъект("WScript.Shell");
	Shell.Run(СтрокаЗапуска, 0, Истина);
	ФайлПриемник = Новый Файл(ПолноеИмяФайла);
	ФайлПриемник.УстановитьТолькоЧтение(Ложь);
	ФайлИсточник = Новый Файл(ВременныйФайл);
	Если Перезаписывать Тогда
		КопироватьФайл(ВременныйФайл, ПолноеИмяФайла);
		УдалитьФайлы(ВременныйКаталог.ПолноеИмя, "*.*");
	Иначе
		Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВыходногоФайла));
	КонецЕсли;
КонецФункции
Показать


Функция ДобавитьШтампВPdf_V2(ФайлСсылка, АдресХранилищаШтампа, Перезаписывать = Ложь) Экспорт
	Если ТипЗнч(ФайлСсылка) = Тип("СправочникСсылка.Файлы") Тогда
		ИсходныйФайл = ПолучитьПутьКФайлу(ФайлСсылка);
	ИначеЕсли ТипЗнч(ФайлСсылка) = Тип("Строка") И Не ПустаяСтрока(ФайлСсылка) Тогда
		Файл = Новый Файл(ФайлСсылка);
		Если Не  Файл.Расширение = ".pdf" Тогда
			СконвертироватьФайлВPDF(ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ФайлСсылка)),Файл.Расширение, ФайлСсылка);
		КонецЕсли;
		ИсходныйФайл = ФайлСсылка;
	КонецЕсли;
	КопияИсходногофайла = ПолучитьИмяВременногоФайла("pdf");
	КопироватьФайл(ИсходныйФайл, КопияИсходногофайла);
	Результат = ПолучитьИмяВременногоФайла("pdf");
	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаШтампа);
	Штамп = ПолучитьИмяВременногоФайла("pdf");
	ДвоичныеДанные.Записать(Штамп);
	СтрокаЗапуска = """c:\Program Files (x86)\PDFtk\bin\pdftk.exe"" " + КопияИсходногофайла + " multistamp " + Штамп + " output "+Результат;
	Shell = Новый COMОбъект("WScript.Shell");
	Shell.Run(СтрокаЗапуска, 0, Истина);
	ДвоичныеДанные = Новый ДвоичныеДанные(Результат);
	Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);

КонецФункции
Показать
5. andy_zhav 197 01.02.21 17:12 Сейчас в теме
Лучше второй вариант. Там только pdftk используется, получается быстрее и лучше качество
6. ovadia 01.02.21 17:37 Сейчас в теме
(5) Спасибо. У меня на сервере стоит C:\Program files\ImageMagick-7.0.8-Q16\convert.exe
C этим будет работать?
9. ovadia 02.02.21 11:50 Сейчас в теме
(5) Покажите, пожалуйста, где и как вызывается функция
Функция ДобавитьШтампВPdf_V2()
7. andy_zhav 197 01.02.21 20:12 Сейчас в теме
(6) будет. Только надо справку почитать как правильно сделать. Он сильно навороченный. Фотошоп в командной строке
8. andy_zhav 197 02.02.21 08:45 Сейчас в теме
(6) Если только convert - не будет. Эта утилита только для конвертации из формата в формат. Обработкой занимаются другие утилиты из набора imagemagic. Точно не помню какая: montage.exe или magick.exe
10. andy_zhav 197 02.02.21 13:37 Сейчас в теме
(9) Это я писал функцию для своих целей. У меня она в общем серверном модуле.Параметры ФайлСсылка - тип справочник.Файлы, если файл прикреплен к объекту или строка - Полный путь к файлу, доступный на сервере. Адрес хранилища штампа - двоичные данные pdf файла со штампом, помещенные в хранилище. У меня формируется печатная форма-штамп и сохраняется в pdf штатными средствами 1с.

в случае без использования справочника файлы должна выглядеть так:

Функция ДобавитьШтампВPdf_V2(ФайлСсылка, АдресХранилищаШтампа, Перезаписывать = Ложь) Экспорт
    Если ТипЗнч(ФайлСсылка) = Тип("Строка") И Не ПустаяСтрока(ФайлСсылка) Тогда
        Файл = Новый Файл(ФайлСсылка);
    Иначе 
        возврат Неопределено:
    КонецЕсли;
    КопияИсходногофайла = ПолучитьИмяВременногоФайла("pdf");
    КопироватьФайл(ИсходныйФайл, КопияИсходногофайла);
    Результат = ПолучитьИмяВременногоФайла("pdf");
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаШтампа);
    Штамп = ПолучитьИмяВременногоФайла("pdf");
    ДвоичныеДанные.Записать(Штамп);
    СтрокаЗапуска = """c:\Program Files (x86)\PDFtk\bin\pdftk.exe"" " + КопияИсходногофайла + " multistamp " + Штамп + " output "+Результат;
    Shell = Новый COMОбъект("WScript.Shell");
    Shell.Run(СтрокаЗапуска, 0, Истина);
    ДвоичныеДанные = Новый ДвоичныеДанные(Результат);
    Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);

КонецФункции
Показать


Функция возвращает адрес хранилища двоичных данных pdf со штампом.

Можно, кстати, и на клиенте использовать. Но pdftk должна быть тогда на клиенте установлена.
11. andy_zhav 197 02.02.21 13:50 Сейчас в теме
Пример реализации, если добавитьШтампАPDF_V2 вызывается на клиенте:

&НаКлиенте
Процедура ДобавитьШтамп(Команда)
    ПутьШтампа = "c:\штамп.pdf";
    ПутьPDF = "c:\Файл.pdf";

    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьШтампа);

    АдресРезультата = ДобавитьШтампВPdf_V2(ПутьPDF, ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор));

    ДвоичныеДанныеРезультат = ПолучитьИзВременногоХранилища(АдресРезультата);
    ДвоичныеДанныеРезультат.Записать(ПутьPDF);

КонецПроцедуры
Показать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)