Итак, задача:
Необходимо создать макет печатной формы, на котором будет штамп "Коммерческая тайна".
Далее необходимо вывести на любой печатаемый макет водяным знаком в верхний левый угол.
P.S. макет в формате ТабДок, по причине необходимости менять данные в зависимости от содержания БД, смена организации, изменение реквизитов организации.
Путь поиска решения:
Тут будет очень кратко. Я рылся на Инфостарте, рылся на иных схожих по темам порталах в поиске решений, предлагалось поставить на сервер виртуальный принтер и с его помощью формировать картинку и использовать для решения поставленной задачи. НО, устанавливать сторонний софт - НЕЛЬЗЯ...
Непосредственно решение:
1. Я нашел софтину: "wkhtmltopdf", она консольная и работает как утилита без установки.
2. Закинул утилиту в общий макет в двоичные данные.
Далее наконец-то я добрался до написания кода.
Для собственного удобства я создал новый ОбщийМодуль, тут вы вольны решать, как вам удобно.
Функция формирования изображения
Функция ПолучитьКартинкуШтампКТ(СтруктураДанных) Экспорт
СтруктураВозврата = ПодготовитьданныеОбработки();
КаталогСДокументами = СтруктураВозврата.КаталогФайловJPGУтилит;
Имя = Строка(Новый УникальныйИдентификатор);
ПолноеИмяHTMLФайла = КаталогСДокументами + "\" + Имя + ".html";
ПолноеИмяКартинки = КаталогСДокументами + "\" + Имя + ".png";
ПолноеимяОбработки = СтруктураВозврата.wkhtmltoimage;
ДанныеДляФормированияПечатнойФормы = Новый Структура;
ДанныеДляФормированияПечатнойФормы.Вставить("ИмяФайлаhtml", ПолноеИмяHTMLФайла);
ДанныеДляФормированияПечатнойФормы.Вставить("НаименованиеОрганизацииДляПечати", СтруктураДанных.НаименованиеОрганизацииДляПечати);
ДанныеДляФормированияПечатнойФормы.Вставить("ИННОрганизации", СтруктураДанных.ИННОрганизации);
ДанныеДляФормированияПечатнойФормы.Вставить("ЮрАдресКомпании", СтруктураДанных.ЮрАдресКомпании);
СформироватьШтампКомерческаяТайна(ДанныеДляФормированияПечатнойФормы);
Приложение = СтруктураВозврата.wkhtmltoimage;
КомандаЗапуска = Новый Массив();
КомандаЗапуска.Добавить(Приложение);
КомандаЗапуска.Добавить("--transparent");
КомандаЗапуска.Добавить("--crop-w");
КомандаЗапуска.Добавить("390");
КомандаЗапуска.Добавить("--format");
КомандаЗапуска.Добавить("png");
КомандаЗапуска.Добавить(ПолноеИмяHTMLФайла);
КомандаЗапуска.Добавить(ПолноеИмяКартинки);
РезультатЗапуска = ВыполнитьЗапускУтилитыКонвертации(КомандаЗапуска);
Картинка = Новый Картинка(ПолноеИмяКартинки);
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Картинка, Новый УникальныйИдентификатор);
УдалитьФайлы(ПолноеИмяHTMLФайла);
УдалитьФайлы(ПолноеИмяКартинки);
УдалитьФайлы(ПолноеимяОбработки);
Возврат АдресВоВременномХранилище;
КонецФункции
Что тут происходит?
Подготавливаем каталог, в котором сохраняем утилиту из двоичных данных.(в этот же каталог будем сохранять временные файлы HTML и Изображения).
Далее формируем печатную форму, сохраняем её в формате html.
Формируем команду для запуска утилиты:
КомандаЗапуска = Новый Массив();
КомандаЗапуска.Добавить(Приложение); // путь до утилиты
КомандаЗапуска.Добавить("--transparent"); // делаем фон получаемого изображения прозрачным
КомандаЗапуска.Добавить("--crop-w"); //обрезка изображения по ширине
КомандаЗапуска.Добавить("390"); //ширина изображения на выходе в px
КомандаЗапуска.Добавить("--format"); //команда для задания формата
КомандаЗапуска.Добавить("png"); //непосредственно формат изображения (jpeg,png,svg)
КомандаЗапуска.Добавить(ПолноеИмяHTMLФайла); //путь до html файла макета печатной формы
КомандаЗапуска.Добавить(ПолноеИмяКартинки); //путь до получаемой картинки
Далее вызываем функцию запуска утилиты, а на выходе получаем изображение. В каталоге.
Помещаем его во временное хранилище, и удаляем все фалы которые наплодили.
Далее все вспомогательные функции и процедуры будут без пояснения.
Подготовка данных обработки
Функция ПодготовитьданныеОбработки()
МассивОшибок = Новый Массив;
СтрВозврата = Новый Структура;
КаталогФайлов = КаталогВременныхФайлов();
СтрВозврата.Вставить("КаталогФайлов", КаталогФайлов);
КаталогФайловJPGУтилит = КаталогВременныхФайлов() + "ktjpg";
Если Не ФайлСуществует(КаталогФайловJPGУтилит) Тогда
СоздатьКаталог(КаталогФайловJPGУтилит);
КонецЕсли;
СтрВозврата.Вставить("КаталогФайловJPGУтилит", КаталогФайловJPGУтилит);
ПолноеИмяКонвертера = КаталогФайловJPGУтилит + "\"+ "wkhtmltoimage.exe";
Данныеwkhtmltopdf = ПолучитьОбщийМакет("wkhtmltoimage");
Попытка
Данныеwkhtmltopdf.Записать(ПолноеИмяКонвертера);
СтрВозврата.Вставить("wkhtmltoimage", ПолноеИмяКонвертера);
Исключение
Инфо = ОписаниеОшибки();
ТекстОшибки = СтрШаблон("Не удалось записать файл конвертера %1 по причине %2", "wkhtmltoimage", Инфо);
МассивОшибок.Добавить(ТекстОшибки);
СтрВозврата.Вставить("Ошибки", МассивОшибок);
КонецПопытки;
Возврат СтрВозврата;
КонецФункции
Проверка на существование файла
Функция ФайлСуществует(ПутьКФайлу) Экспорт
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл.Существует();
КонецФункции
Формирование Печатной формы
Функция СформироватьШтампКомерческаяТайна(ДанныеДляФормированияПечатнойФормы) Экспорт
НаименованиеОрганизацииДляПечати = ДанныеДляФормированияПечатнойФормы.НаименованиеОрганизацииДляПечати;
ИННОрганизации = ДанныеДляФормированияПечатнойФормы.ИННОрганизации;
ЮрАдресКомпании = ДанныеДляФормированияПечатнойФормы.ЮрАдресКомпании;
ИмяФайла = ДанныеДляФормированияПечатнойФормы.ИмяФайлаhtml;
Макет = ПолучитьОбщийМакет("мо_КомерческаяТайна");
ОбластьКомТайна = Макет.ПолучитьОбласть(1,1,5,3); //сделал так, без именования области, вы можете сделать как вам удобно
ОбластьКомТайна.Параметры.ОрганизацияНаименованиеДляПечати = НаименованиеОрганизацииДляПечати;
ОбластьКомТайна.Параметры.ОрганизацияИНН = ИННОрганизации;
ОбластьКомТайна.Параметры.ОрганизацияЮридическийАдрес = ЮрАдресКомпании;
ТабДок = Новый ТабличныйДокумент;
Табдок.Вывести(ОбластьКомТайна);
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML);
КонецФункции
Функция ВыполнитьЗапускУтилитыКонвертации(Команда)
РезультатВыполнения = Новый Структура("Успех, КодВозврата, ПотокОшибок", Ложь, Неопределено, "");
ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы();
ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина;
ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок = Истина;
ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
РезЗапуска = ФайловаяСистема.ЗапуститьПрограмму(Команда, ПараметрыЗапускаПрограммы);
Если РезЗапуска.КодВозврата <> 0 Тогда
РезультатВыполнения.ПотокОшибок = РезЗапуска.ПотокОшибок;
КонецЕсли;
РезультатВыполнения.Успех = РезЗапуска.КодВозврата = 0;
РезультатВыполнения.КодВозврата = РезЗапуска.КодВозврата;
Возврат РезультатВыполнения;
КонецФункции
На этом все, можете брать и пользоваться.
P.S. на прикрепленном скриншоте перечислены команды с инструкции официального сайта разработчика утилиты. Чтобы получить утилиту, нужно скачать установочник с портала: "https://wkhtmltopdf.org/downloads.html", после установки в каталоге появится папка с набором файлов, но нужный вам лежит в папке "bin", там будет файл "wkhtmltoimage", его и закидывайте в макет.