Нанесение штампа на 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);
УдалитьФайлы(ИмяВременногоФайлаКартинки);
Файл = Неопределено;
конеццикла;
Документ = Неопределено;
Возврат стрРезультат;
КонецФункции
Вступайте в нашу телеграмм-группу Инфостарт
штамп документооборот штрих-код
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Универсальные функции 1С 8.3 1С:Документооборот Россия Платные (руб)
ДО+ — расширение конфигурации, в котором собран постоянно пополняемый набор из 33 востребованных доработок для 1С:Документооборот КОРП 3.0: согласование задач прямо из мессенджеров MAX и Telegram, отзыв согласования и исполнения, гибкие повторные круги, эскалация с точностью до минут, контроль исполнительской дисциплины, выгрузка вложений в ZIP и склейка PDF, реестр документов в Excel, проверка дублей контрагентов и регистрационных номеров. Каждая возможность активируется отдельным флажком в режиме предприятия — включается только то, что нужно конкретной организации. Список функций расширяется с каждым релизом — текущая версия 2.1.0. Режим AddOn: типовая конфигурация не модифицируется, обновления ДО ставятся штатно, дополнительные лицензии и внешние компоненты не требуются. Внедрение силами администратора — около часа.
30000 руб.
09.07.2026 1425 1 0
Загрузка и выгрузка в Excel Универсальные функции Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).
30.10.2025 8778 Abysswalker 11
Универсальные функции Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.
14.05.2025 14533 DeerCven 16
Инструментарий разработчика Универсальные функции Запросы Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Бесплатно (free)
Внешняя обработка для создания запроса на основании табличных данных.
22.07.2024 11973 278 ixijixi 10
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.
21.05.2024 68819 dimanich70 87
Универсальные функции Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.
1 стартмани
18.03.2024 9299 7 John_d 13
Универсальные функции Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.
12.02.2024 85878 atdonya 31
Универсальные функции Разработчик 1С:Предприятие 8 Бесплатно (free)
На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.
30.11.2023 13498 ke.92@mail.ru 18
Use -type optimize to ensure the image is written in the smallest possible file size. - это должно помочь.
Так же через -type можно задать цветовой режим изображения, например если не нужны цвета, то можно использовать "оттенки серого" , -type Grayscale или -type GrayscaleMatte - с альфа-каналом для поддержки прозрачности. Это во первых ускорит работу скрипта, во вторых естественно уменьшится размер выходного файла.
Делал подобное, но для штампов ЭЦП. У меня файлы формировались на лету, только для просмотра и печати, эти версии не сохранялись по понятным причинам.
Если отсканированный документ, точнее первый лист, имеет другую размерность. Как ляжет штамп?
Мы реализовали вставку штампа на pdf похожим способом, но делали resize первой страницы под нужный размер, чтобы по координатам прорисовать. Но возникли ошибки при печати: pdf не понимал размер и первая страница печаталась в уменьшенном виде.
ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);Валится ошибка
{ВнешняяОбработка.ТестДиадок.Форма.Форма.Форма(116)}: Ошибка при вызове конструктора (ДвоичныеДанные)
ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
по причине:
Файл не обнаружен 'C:\Users\Андрей\AppData\Local\Temp\v8_38D9_f0.pdf'
Установлена ImageMagick-7.0.8-23-Q8-x64-dll.exe
Возможно это из-за версии ImageMagick?
Кто-нибудь сталкивался?
&НаСервере
Функция НанестиШтампНаСканКопиюОригина(ДокументСсылка, ДелатьБольшие = Ложь) Экспорт
Документ = ДокументСсылка.ПолучитьОбъект();
стрРезультат = Ложь;
если НЕ ЗначениеЗаполнено(Документ.РегистрационныйНомер) или НЕ ЗначениеЗаполнено(Документ.ДатаРегистрации) тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Документ не зарегистрирован !");
Возврат Ложь;
конецесли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Файлы.ТекущаяВерсия,
| Файлы.Ссылка КАК Файл,
| Файлы.ПометкаУдаления,
| Файлы.Зашифрован,
| Файлы.ВладелецФайла КАК ВладелецФайла,
| 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);
Если ИмяВременногоФайлаКартинки <> "" Тогда
УдалитьФайлы(ИмяВременногоФайлаКартинки);
КонецЕсли;
Файл = Неопределено;
конеццикла;
Документ = Неопределено;
Возврат стрРезультат;
КонецФункции Показать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
Штамп ставится, но если док. многостраничный - все страницы кроме первой обрезаются.
у меня это
стрПуть = " -density 150 -quality 100 " + ИмяФайлаРезультата + " " + ИмяФайлаСПутем + "[1-10000] " + ИмяФайлаРезультата2;
выполняется вместе с обработкой страницы [0] а у вас получается, что вы сначала делаете работу со страницей [0] а потом из нее пытаетесь получить [1-10000] которых там уже нет
АвтозаполнениеШаблоновФайловСервер.ОбновитьВерсиюИзДвоичныхДанных(ДвоичныеДанныеРезультата, Результат.Файл, "Вставка штампа");
Валится с ошибкой:
{ОбщийМодуль.рт_ДополнительныеВозможностиСервер.Модуль(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);
УдалитьФайлы(ИмяВременногоФайлаКартинки);
Файл = Неопределено;
конеццикла;
Документ = Неопределено;
Возврат стрРезультат; Показатьу меня работало все нормально и одностраничными и многостраничными документами. пишите если что.
"ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(ИмяФайлаРезультата2);
по причине:
Файл не обнаружен"
Мне помогло явное указание в константах - "Путь к программе конвертации ПДФ" - вместо "convert.exe" - "C:\Program Files\ImageMagick-6.9.10-Q8\convert.exe".
Конфигурация ДО.
Автору спасибо за идею!
В этой процедуре идет 2 запуска конвертации.
Путь для запуска берется из константы где вызывается утилита "magick.exe"
а вот уже второй запуск должен быть уже другой утилиты - "convert.exe"
Прошу простить, не программист. Как обратиться к процедуре из обработчика бизнес-события? Куда смотреть?
Вставляет офигено красивый Регистрационный штамп :)
Вдруг кому тоже понадобится.... и ошибок для ДО не выдаёт... оригинальный код подправлен...
пример рег штампа, ну и приложил, чтобы если удалю с яндекса тут осталось)
Вставляет офигено красивый Регистрационный штамп :)
Вдруг кому тоже понадобится.... и ошибок для ДО не выдаёт... оригинальный код подправлен...
пример рег штампа, ну и приложил, чтобы
Что не совсем оно работает 8)))
Не удалось запустить usr/bin/mognify -resize 1000% и тд и тп
НО: 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
стрПодготовил = "Подготовил: " + ПредметИсточника.Подготовил.ПредставлениеВДокументах + Символы.ПС +
"Отдел: "+ ПредметИсточника.Подготовил.Подразделение + Символы.ПС +
"Содержание: " + ПредметИсточника.Содержание + Символы.ПС +
Формат(ПредметИсточника.ДатаСоздания, "ДЛФ=Д");
стрПуть = """" + ПутьКПрограммеКонвертацииPDF + """ " + стрПуть +
" -fill blue -font Tahoma -pointsize 10" +
" -gravity SouthWest" +
" -draw ""text 20,100 '" + стрПодготовил + "'"""+
" " + ИмяФайлаРезультата; ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 830374
Создание 14.05.18 16:23
Обновление 14.05.18 16:23
Просмотры 34878
Загрузки 0
Рейтинг
103
Комментарии 49
Код открыт Да
Рубрики Универсальные функции
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1С:Документооборот
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)