Для передачи печатной копии документа вместе с информацией об электронных подписях, можно использовать следующие подходы:
Печать листа согласования использует давно и во многих процессах. Лист согласования легко реализуется в виде отчета. Но, не во всех процессах рационально печатать отдельный лист согласования. Например, для служебных записок, в большинстве являющихся одностраничными документами. Кроме того, лист согласования не является неотъемлемой частью документа и может быть потерян или подделан.
PDF формат позволяет устанавливать ЭП на содержание документа и визуализировать их в виде вставленного изображения подписи в текст. При этом, подписи сохраняются в теле файла. Это красивый вариант подписания, но он не совместим с системой DIRECTUM, так как DIRECTUM не обладает инструментами для работы с такими подписями, а подписание в системе блокирует документ от изменения и не позволяет подписать ту же версию внутри формата.
При печати документа со штампом с информацией об ЭП, штамп становится неотъемлемой частью документа. Штамп не требует печати дополнительных листов. Однако, штампы сложны в реализации. Формирование штампа - не тривиальная задача. Каждый формат документа имеет свою внутреннюю структуру, свои приложения редакторы и требует отдельного обработчика для вставки штампа.
Требуется реализовать возможность печати версии документа со штампом, сформированным в СЭД DIRECTUM на основе электронных подписей на ней. Механизм должен иметь поддержку основных форматов, используемых в документообороте. Штамп должен вставляться в виде изображения, что бы уменьшить вероятность его изменения и подлога. Штамп должен содержать информацию об электронных подписях на конкретной версии документа, её идентификатор и ФИО пользователя, сформировавшего штамп. Штамп должен сохранять возможность прочтения текста документа.
На момент начала работ над данным функционалом у нас действовала система DIRECTUM версии 4.9.1. Во многом это повлияло на выбор инструментов и методов реализации. Так, механизм формирования штампов появился только в версии 5.0 и он поддерживает работу только с PDF документами.
Так же, следовало решить следующие проблемы:
Механизм печати со штампом было решено реализовывать как дополнительный функционал в виде кнопки на карточке документа. Позже, после перехода на версию DIRECTUM 5.2.1, была добавлена возможность формировать штамп с помощью пункта контекстного меню.
Штамп должен формироваться динамически, так как содержит информацию, характерную конкретной версии документа и ФИО пользователя, формирующего штамп. Желательно штамп отделить от текста документа рамкой, что бы текст штампа не сливался с текстом документа. Так же желательно вставить в штамп логотип корпорации. Такое форматирование можно описать в виде HTML документа.
Штамп необходимо формировать в виде изображения. Это с одной стороны упростит вставку штампа в различные форматы документов, а с другой, усложнит процесс подлога штампа. На штампе необходимо писать ФИО того, кто распечатал штамп, дату печати и оставлять место для подписи. Рукописная подпись в штампе подтверждает достоверность распечатанной информации.
Для преобразования HTML документа в изображение используется утилита «CutyCapt». Эта консольная утилита может преобразовывать HTML страницу в файлы формата PNG, SVG, PDF и другие. В данном решении производится преобразование HTML страницы в PNG файл с белым фоном и синим штампом.
Полученный штамп имеет непрозрачный белый фон. Если вставлять его в документ, то штамп может перекрывать текст. Для сохранения текста в читаемом виде, требуется изменить штампу фон на прозрачный. Поиск утилит в интернете для установки прозрачности изображения в зависимости от цвета не дал результата. Поэтому, было решено реализовать такую утилиту собственными силами.
Для создания утилиты была использована C++ библиотека «libpng», С++ компилятор «Dev C++». Утилита «setTransparency» принимает PNG изображение и меняет его, устанавливая прозрачность каждому пикселю в зависимости от того, насколько близко его цвет к белому.
Для вставки штампа в Word используется его объектная модель. Сильно помог материал Евгения Валькова. За основу взята его функция вставки изображения в Word. Система настроена на вставку штампа в верхний левый угол, но перед печатью пользователь может перенести штамп в более удобное место.
Вставка изображения в Excel производится так же, как и в Word, через объектную модель приложения с учетом его особенностей.
Вставка изображения в PDF документы появилась уже после перехода на версию DIRECTUM 5.2.1 и производится стандартным функционалом с помощью функции AddImageToPDFFile. Система настроена на вставку штампа в верхний левый угол документа.
На начальном этапе разработки получить документ со штампом можно было через кнопку на карточке документа. Это не очевидный и не удобный способ. После перехода на версию DIRECTUM 5.2.1 кнопка «Печать со штампом» была размещена в контекстном меню документа. Это позволило удобно и быстро вызывать данный функционал.
У документа может быть несколько подписанных версий разных форматов. Механизм «печати со штампом» составляет список подписанных ЭП версий, с форматами которых он может работать. Если таких больше 1, то он предоставляет выбор пользователю, какую версию следует отобразить со штампом. Если таких версий нет, то пользователь получает сообщение об этом.
После выбора версии, формируется список подписей и пользователь может выбрать, какие ЭП надо отобразить в штампе. На следующем этапе производится формирование документа со штампом и его отображение на экране.
Применение данного механизма не ограничивается программно какими-либо маршрутами, процессами или документами, но можно выделить процессы, в которых он наиболее активно используется:
Колесов А.Д. Разработка проектных решений.
Тарасов М.В. Разработка программной части.
Максимова Т.В., Светлолобова Е.О., Андреева Л.С., Туктарова А.В. Внедрение и сопровождение.
Обсудите реализацию с экспертом Directum
Михаил Тарасов - это уже бренд.
Михаил, как решалась задача распространения консольной утилиты на машины пользователей?
Не думали перейти на директумовский COM "GenerateTextImage.Image", он по сути делает то же самое?
А почему не использовали "стандартную" библиотеку Directum GenerateTextImage.dll (прозрачный фон поддерживается)?
Ее можно взять из любой старшей версии Directum скопировать, зарегистрировать и использовать. Будет работать даже в 4.9.1.
Утилиты (CutyCapt и setTransparency) выгружаются в TEMP из системы. В системе они заведены как документы.
Когда разрабатывали решение, были на версии 4.9.1. Новую версию не скачивали, не ставили и было не совсем ясно, как в ней вообще реализована работа со штампами (из статей это было не совсем ясно. Возникали вопросы вроде "а штамп вставляется на клиенте или на сервере?" или "Должна ли быть установлена служба преобразования?").
Ну а после перехода сработал принцип "работает, не трогай". Тем более, если она делает то же самое.
Если в будущем появится какая-то существенная необходимость, или преимущество стандартной библиотеки перед "самописной", переделаем на новый лад...
Пока же больше беспокоит, как бы сделать так, что бы в PDF документах масштаб соблюдался и можно было пользователю выбирать место вставки штампа. Для этого нужно размеры страницы правильно определять. Воспользовались советом отсюда, но как показала практика, не всегда корректно эти размеры определяются.
А в чем у вас проблема? Мы приняли за отправную точку размер страницы при 300dpi (или 150? в общем при 100% масштабе она соответствует листу А4 на мониторе, допустим 1000 на 600 (не помню точные цифры) это эталонные константы) сделали для такого размера штамп. Для любого документа получаем его высоту, и масштабируем штамп на это соотношение.
Т.е. если к нам пришел документ отсканированный в 1200dpi с высотой в 11000, чтобы штамп на нем выглядел красиво увеличиваем его масштаб в 11 раз. Если мелкий документ - уменьшаем. В стандартных функциях есть параметр масштаба.
На сколько я знаю сбоев пока не было.
Еще документ перед определением размеров надо обязательно нормализировать (есть такая функция в библиотеке дебеню).
Самое оно использовать Файлы как часть разработки. Способ организации работы. =)))
Согласен, тем более такая работа проведена по созданию своего механизма. Единственный плюс использовать директумовскую версию - не надо ничего на клиент каждый раз скачивать, и точно не будет проблем с правами на запуск exe'шников непонятных и антивирус не будет каждый раз его проверять.
В общем кратко: Получаю размеры страницы в отдельной функции так:
Используем, как ориентир не высоту, а ширину страницы. размер штампа по ширине - константа. По высоте изменяется. Задали соотношение, что штамп будет занимать 2/5 частей страницы.
Замечено, что в некоторых случая ширина штампа по отношению к ширине страницы соотносится не как 2/5, а примерно 3/5. Обычные вроде бы документы со страничной ориентацией.
Отсюда вывод, что определение ширины страницы отрабатывает не всегда корректно. Почему и как, ещё не разбирался.
Далее, что бы хотелось в будущем: Перед вставкой штампа показывать диалоговое окно, где превьюшкой рисовать первую страницу PDF документа (как то его ещё надо будет в изображение сконвертить), а поверх него штамп с возможностью его масштабировать и двигать. Пользователь выбирает для штампа место, нажимает ОК, мы считываем координаты и масштаб и производим вставку штампа. И в таком механизме нужно точное определение размеров первой страницы.
//В коде переводы строк почему - то съехали
попробуйте нормализировать страницу сразу после загрузки файла: http://www.debenu.com/docs/pdf_library_reference/NormalizePage.php
Спасибо, ваш совет помог.
Авторизуйтесь, чтобы написать комментарий