Визуализация штампа с рег. номером (1С.Документооборот КОРП)
1С.Документооборот КОРП 2.1 релиз 27.1. Можно ли типовыми средствами визуализировать штамп (с рег. номером входящего документа) в файле прикрепленном к pdf-документу? То есть нужно, чтобы система взяла рег. номер документа и отобразила его в открытом pdf-файле, может быть в виде прямоугольника (рамки) с номером внутри, как обычный штамп.
Кажется, что типового решения нет. Придется допиливать конфигурацию или делать внешнюю обработку.
Кажется, что типового решения нет. Придется допиливать конфигурацию или делать внешнюю обработку.
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(3) Я пробовал пользоваться несколькими, сейчас навскидку могу вспомнить только debenu PDF Library - работает через COM объект, pdftk, imageMagic - через командную строку. PDF library - по моему платная. Pdftk - условно-бесплатная (какие-то функции обработки PDF в платной версии), imageMagic - бесплатная.
Штампы я накладывал через pdftk и 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, Истина);
ДвоичныеДанные = Новый ДвоичныеДанные(Результат);
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецФункции
Показать
(9) Это я писал функцию для своих целей. У меня она в общем серверном модуле.Параметры ФайлСсылка - тип справочник.Файлы, если файл прикреплен к объекту или строка - Полный путь к файлу, доступный на сервере. Адрес хранилища штампа - двоичные данные pdf файла со штампом, помещенные в хранилище. У меня формируется печатная форма-штамп и сохраняется в pdf штатными средствами 1с.
в случае без использования справочника файлы должна выглядеть так:
Функция возвращает адрес хранилища двоичных данных pdf со штампом.
Можно, кстати, и на клиенте использовать. Но pdftk должна быть тогда на клиенте установлена.
в случае без использования справочника файлы должна выглядеть так:
Функция ДобавитьШтампВPdf_V2(ФайлСсылка, АдресХранилищаШтампа, Перезаписывать = Ложь) Экспорт
Если ТипЗнч(ФайлСсылка) = Тип("Строка") И Не ПустаяСтрока(ФайлСсылка) Тогда
Файл = Новый Файл(ФайлСсылка);
Иначе
возврат Неопределено:
КонецЕсли;
КопияИсходногофайла = ПолучитьИмяВременногоФайла("pdf");
КопироватьФайл(ИсходныйФайл, КопияИсходногофайла);
Результат = ПолучитьИмяВременногоФайла("pdf");
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаШтампа);
Штамп = ПолучитьИмяВременногоФайла("pdf");
ДвоичныеДанные.Записать(Штамп);
СтрокаЗапуска = """c:\Program Files (x86)\PDFtk\bin\pdftk.exe"" " + КопияИсходногофайла + " multistamp " + Штамп + " output "+Результат;
Shell = Новый COMОбъект("WScript.Shell");
Shell.Run(СтрокаЗапуска, 0, Истина);
ДвоичныеДанные = Новый ДвоичныеДанные(Результат);
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецФункции
ПоказатьФункция возвращает адрес хранилища двоичных данных pdf со штампом.
Можно, кстати, и на клиенте использовать. Но pdftk должна быть тогда на клиенте установлена.
Пример реализации, если добавитьШтампАPDF_V2 вызывается на клиенте:
&НаКлиенте
Процедура ДобавитьШтамп(Команда)
ПутьШтампа = "c:\штамп.pdf";
ПутьPDF = "c:\Файл.pdf";
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьШтампа);
АдресРезультата = ДобавитьШтампВPdf_V2(ПутьPDF, ПоместитьВоВременноеХранилище(ДвоичныеДанные, Новый УникальныйИдентификатор));
ДвоичныеДанныеРезультат = ПолучитьИзВременногоХранилища(АдресРезультата);
ДвоичныеДанныеРезультат.Записать(ПутьPDF);
КонецПроцедуры
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)