Правильно, на мой взгляд, после регистрации впечатать регистрационный штамп в нужное место сопроводительной записки и создать новую версию файла входящего документа уже со штампом. И старый сохранён на всякий случай, и новый для работы есть.
Сразу оговорюсь, что работу коллеги видел, но его метод мне не подошёл по 2-м причинам:
- письма приходят разные и место для впечатывания штампа необходимо выбирать вручную (не всегда в определённый угол и не всегда на первый лист документа).
- ImageMagick справляется с конвертацией не любых документов формата Adobe Pdf (это боль!).
Как выясняется при внимательном изучении, в 1С:Документооборот уже встроен функционал добавления регистрационного штампа в документ, но работает этот механизм только с файлами MS Office Word и Open Office Writer. А в этих форматах входящие письма редко приходят (примерно никогда), а в основном Adobe PDF или в каких-либо графических форматах.
Всё, что необходимо для решения данной задачи, оказывается, у нас есть. Почти у всех стоит на сервере и настроена такая прекрасная программа, как ImageMagick, соответственно константа ПутьКПрограммеКонвертацииPDF содержит путь к ней. Рекомендую ставить пакет Q8, а не Q16, т. к. работает он шустрее. Рассмотрим алгоритм впечатывания штампа в многостраничный формат (pdf, tiff) с обыкновенными картинками всё проще. Расширение умеет работать с любыми файлами, которые понимает пакет imagemagick.
1. Создаём временную папку и в неё сохраняем файл полистно в графическом формате (я использую jpeg с качеством 100%). Причём ImageMagick текстовый слой совмещает с графическим и получается полноценное изображение (последняя версия на момент написания публикации 7.0.10).
magick convert -density 200 “ПутьКВременномуКаталогу\image_%06d.jpg”
Данная команда создаёт файлы в формате jpeg с разрешением 200 dpi и автонумерацией от «000000» до «999999» в нашем каталоге. Удобство в том, что имя файла первой страницы всегда «image_000000.jpg». Запаса нумерации страниц должно хватить на все случаи жизни.
2. Создаём файл штампа. Тут может быть два решения, через параметр «-draw text x,y”, т. е. вставкой необходимого текста прямо на первую страницу документа или более сложный, но и более универсальный механизм создания штампа отдельно и впечатывания его куда нужно. Я пошёл вторым путём, хотя и с первым тоже поигрался (трудно выравнивать текст).
magick convert -size 472x157 -background #FFFFFF80 -gravity center -fill blue -font c:\windows\fonts\tahoma.ttf -pointsize 30 -interline-spacing 15 label:@text.txt stamp.png
Эта команда создаёт изображение размером 472х157 (60х20 мм при 200 dpi), с полупрозрачным фоном, синим цветом текста, выровненным по центру, шрифтом Tahoma размером 30 точек и межстрочным интервалом 15 точек и текстом, который лежит в файле text.txt. Я экспериментировал с разными шрифтами, есть очень интересные начертания, хорошо смотрятся на штампе. Можно отсканировать реальный штамп, подобрать шрифт, имитирующий рукописный, и через «-draw text x,y” впечатывать номер и дату. Очень круто, но много возни.
3. Определяем координаты вставки штампа. Тут нам помогает тип «Картинка», который после чтения первой страницы изображения, возвращает нам его размеры. А настройки вставки штампа мы берём из штатного параметра «НастройкиПоложения», который нам приходит из процедуры вставки штампа (мы его совсем немного дополняем). Там простая математика, не буду тут разбирать.
4. Впечатываем штамп.
magick convert image_000000.jpg stamp.png -geometry +2011+3200 -composite result.jpg
Команда к файлу «image_000000.jpg» прибавляет файл «stamp.png» со смещением 2100 и 3200 точек (для примера) и результат сохраняет в «result.jpg».
5. Собираем результат. Переименовываем «result.jpg» в «image_000000.jpg» собираем все файлы в один.
magick convert “ПутьКВременномуКаталогу\image_*.jpg" -adjoin -quality 90 result.pdf
Команда из файлов image_*.jpg собирает один файл в формате Adobe PDF с понижением качества до 90%.
6. Ну и всё, уже в рамках штатного механизма создаём новую версию файла.
Наименование организации для удобства вынес в новый реквизит справочника «Организации» и разместил на форме.
Теперь про боль. Всё бы ничего, но некоторые документы, приходящие в организацию обрабатывались некорректно. После преобразования в jpeg документ становился серым и в нём пропадала часть текста. Что делать? Оказалось, что есть более специализированный конвертер, написанный в рамках проекта XPDFReader. Он работает быстро и делает изображения в формате PNG с нужным разрешением. Исполняемый файл pdftopng.exe я в расширение не включил (блюдём авторские права), его нужно скачать на сайте разработчика, поместить в макет «ШРВД_ПрограммаКонвертации» и установить в значение «Истина» переменные «ПредварительноКонвертировать» и «ПрограммаКонвертацииВМакете». Можно не в макет помещать, а на диск куда-нибудь сохранить и тогда путь необходимо указать в настройках, а переменной «ПрограммаКонвертацииВМакете» оставить значение «Ложь».
// PDF не всегда корректно конвертируется
// можно использовать предварительную конвертацию
ПредварительноКонвертировать = Ложь;
ПрограммаКонвертацииВМакете = Ложь;
Все основные настройки вынесены в переменные расположенные в начале процедуры «ВставитьРегистрационныйШтампВФайлУказаниемПоложения()» общего модуля «ШРВД_ОбщиегоНазначенияСервер». Там указывается разрешение, размеры штампа, шрифт, его размер и межстрочный интервал.
Расширение разрабатывалось и тестировалось на платформе версии 8.3.17.1851 в конфигурации 1С:Документооборот государственного учреждения, редакция 2.1.28.12.
Адаптация для Linux производилась на платформе 8.3.22.1923 в конфигурации Документооборот государственного учреждения, редакция 2.1.32.6
Инструкция актуальна для Astra Linux 1.7 (ядро 5.4.0), для других дистрибутивов будет незначительно отличаться.
Первым делом нужно раздобыть ImageMagick версии 7, в Астре только 6-я и выше пока не предвидится, а Документооборот не умеет работать с 6-й версией. Но на сайте разработчика есть полноценное портативное приложение, его качаем и кладём в удобное место. Я все файлы складывал в домашнюю папку пользователя usr1cv8, от его имени работает сервер 1С и он точно туда имеет доступ. Идём в настройки программы -> работа с файлами, ставим галку «Использовать ImageMagick» и пишем путь /home/usr1cv8/magick (можно ~/magick), а если поставить галочку «Использовать Ghostscript», то заведётся сканирование в с клинских машин PDF.
Для полного счастья нужен конвертер pdftopng для Linux. Он есть на сайте разработчика в пакете xpdf-tools-linux. Качаем, распаковываем в домашнюю папку.
Теперь, что касается шрифтов, у меня нормально работает, если указать полный путь к шрифту. Системные шрифты лежат тут /usr/share/fonts, можно просто отдельно положить файл шрифта.
Обязательно проверяем, чтобы у файлов magick и pdftopng владельцами был пользователь usr1cv8, группа grp1cv8 и для пользователя были даны права на запуск (команды chown и chmod).
Теперь в модуле расширения ШРВД_ОбщиегоНазначенияСервер с процедуре ВставитьРегистрационныйШтампВФайлУказаниемПоложения указываем путь к файлу шрифта. В расширении прописан путь к одному из системных шрифтов.
Если нужно, проверяем путь к программе предварительной конвертации. Вот и всё.
Инструкция для Astra Linux 1.7 (ядро 5.4.0).
Формат PDF предполагает наличие 14-ти базовых шрифтов, наличие которых проверяется при запуске приложения pdftopng. Если их нет, то приложение об этим пишет. Чтобы увидеть список шрифтов, котороых не хватает, нужно перехватить в отладчике команду конвертации из PDF в PNG и выполнить в контексте пользователя USR1CV8. Среди этих базовых шрифтов два свободно распростаняемые, а вот остальные совершенно несвободные и в российских дистрибутивах отсутствующие. Тут написано где взять первые два и как писать конфиг, остальные можно поискать на машинах под управлением Windows (но это наверное не законно :-) и в Инете, потом складываем все находки в отдельную папочку и дописываем конфиг примерно так:
fontFile Symbol "/home/usr1cv8/pdftopng.fonts/s0500001.pfb"
fontFile ZapfDingbats "/home/usr1cv8/pdftopng.fonts/d050000.pfb"
fontFile Times-Roman "/home/usr1cv8/pdftopng.fonts/times.ttf"
fontFile Times-Bold "/home/usr1cv8/pdftopng.fonts/timesdb.ttf"
fontFile Times-BoldItalic "/home/usr1cv8/pdftopng.fonts/timesbi.ttf"
fontFile Times-Italic "/home/usr1cv8/pdftopng.fonts/timesi.ttf"
fontFile Courier "/home/usr1cv8/pdftopng.fonts/cour.ttf"
fontFile Courier-Bold "/home/usr1cv8/pdftopng.fonts/courdb.ttf"
fontFile Courier-BoldOblique "/home/usr1cv8/pdftopng.fonts/courbi.ttf"
fontFile Courier-Oblique "/home/usr1cv8/pdftopng.fonts/couri.ttf"
fontFile Helvetica "/home/usr1cv8/pdftopng.fonts/HelveticaRegular.ttf"
fontFile Helvetica-Bold "/home/usr1cv8/pdftopng.fonts/HelveticaBold.ttf"
fontFile Helvetica-BoldOblique "/home/usr1cv8/pdftopng.fonts/HelveticaBoldItalic.ttf"
fontFile Helvetica-Oblique "/home/usr1cv8/pdftopng.fonts/HelveticaItalic.ttf"
Теперь конвертер понимает какими шрифтами ему рисовать символы при преобразовании страницы документа в картинку и текст не пропадает.
В процедуре ВставитьРегистрационныйШтампВФайлУказаниемПоложения модуля расширения ШРВД_ОбщиегоНазначенияСервер указываем конфигурационный файл для работы конвертера (строка -cfg pdftopng.xpdfrc), у меня он лежит рядом с конвертером
// предварительная обработка
Если ПредварительноКонвертировать И ВРег(Расширение) = "PDF" Тогда
Команда = ПрограммаКонвертации + " -r " + Строка(Разрешение) + " -q -cfg pdftopng.xpdfrc """ + ИмяВходногоФайла + """ "
+ """" + КаталогФайлаПолистного + "preimage"""; // формируются файлы preimage-000000.png
ЗапуститьПриложение(Команда, КаталогВременныхФайлов(), Истина);
// проверяем, всегда должен быть файл preimage-000001.png
ПредварительныйФайл = Новый Файл(КаталогФайлаПолистного + "preimage-000001.png");
Если Не ПредварительныйФайл.Существует() Тогда
ЗаписьЖурналаРегистрации("Вставка регистрационного штампа",
УровеньЖурналаРегистрации.Ошибка,,,
"При выполнении команды " + Команда + ", файл " + ПредварительныйФайл.ПолноеИмя + " не был создан (т.е. команда не отработала)");
ВызватьИсключение "Ошибка конвертации файла";
КонецЕсли;
// пережимаем в jpeg для экономии места (утверждение спорное, всё зависит от контента)
Команда = ПутьКImageMagick + " convert -density " + Строка(Разрешение) + " -units PixelsPerInch """
+ КаталогФайлаПолистного + "preimage-*.png" + """ "
+ """" + КаталогФайлаПолистного + "image_%06d.jpg""";
Иначе
// формируем и запускаем команду
Команда = ПутьКImageMagick + " convert -density " + Строка(Разрешение) + " -units PixelsPerInch """
+ ИмяВходногоФайла + """ " + """" + КаталогФайлаПолистного + "image_%06d.jpg""";
КонецЕсли;
UPD: 08.02.2021 исправлена ошибка постановки штампа на обычное изображение и появилась возможность делать рамку вокруг штампа.
UPD: 03.07.2021 исправлена ошибка постановки штампа на не первую страницу документа, также мелкие доработки по результатам использования в организации.
UPD: 20.09.2023 добавлена версия для Linux и инструкция по установке
UPD: 10.12.2023 добавлено решение проблемы со шрифтами
Проверено на следующих конфигурациях и релизах:
- Документооборот КОРП, релизы 2.1.32.6