Формирование штампа ЭП

Опубликовано:
30 ноября 2016 в 12:35
  • 11
В DIRECTUM существует стандартный механизм подписания документов электронной подписью. В рамках системы, этот механизм обеспечивает неизменность подписанного текста, позволяет однозначно идентифицировать, кто, за кого и какую версию подписал. Но, если требуется передать документ на бумажном носите, то человек не сможет удостовериться, кто именно подписал документ без проверки подписей в системе. Эту проблему решает разработанный нами механизм печати документов со штампами.

Методы передачи печатных документов

Для передачи печатной копии документа вместе с информацией об электронных подписях, можно использовать следующие подходы:

  • Печать отдельного листа согласования
  • Подписание внутри формата и вставка в текст изображения рукописной подписи
  • Вставка в текст штампа ЭП

Печать листа согласования использует давно и во многих процессах. Лист согласования легко реализуется в виде отчета. Но, не во всех процессах рационально печатать отдельный лист согласования. Например, для служебных записок, в большинстве являющихся одностраничными документами. Кроме того, лист согласования не является неотъемлемой частью документа и может быть потерян или подделан.

PDF формат позволяет устанавливать ЭП на содержание документа и визуализировать их в виде вставленного изображения подписи в текст. При этом, подписи сохраняются в теле файла. Это красивый вариант подписания, но он не совместим с системой DIRECTUM, так как DIRECTUM не обладает инструментами для работы с такими подписями, а подписание в системе блокирует документ от изменения и не позволяет подписать ту же версию внутри формата.

При печати документа со штампом с информацией об ЭП, штамп становится неотъемлемой частью документа. Штамп не требует печати дополнительных листов. Однако, штампы сложны в реализации. Формирование штампа - не тривиальная задача. Каждый формат документа имеет свою внутреннюю структуру, свои приложения редакторы и требует отдельного обработчика для вставки штампа. 

Задача

Требуется реализовать возможность печати версии документа со штампом, сформированным в СЭД DIRECTUM на основе электронных подписей на ней. Механизм должен иметь поддержку основных форматов, используемых в документообороте. Штамп должен вставляться в виде изображения, что бы уменьшить вероятность его изменения и подлога. Штамп должен содержать информацию об электронных подписях на конкретной версии документа, её идентификатор и ФИО пользователя, сформировавшего штамп. Штамп должен сохранять возможность прочтения текста документа.

Проблемы реализации

На момент начала работ над данным функционалом у нас действовала система DIRECTUM версии 4.9.1. Во многом это повлияло на выбор инструментов и методов реализации. Так, механизм формирования штампов появился только в версии 5.0 и он поддерживает работу только с PDF документами.

Так же, следовало решить следующие проблемы:

  • Требуется обеспечить работу с основными офисными форматами (RTF, DOC, DOCX, XLS, XLSX и т.д.) и форматом PDF документов. Для каждого формата документа используется свой подход вставки изображения и поэтому требуется разработать как минимум 3 процедуры вставки штампов: в редактор Word, в редактор Excel и в PDF документ.
  • Штамп должен динамически создаваться в формате изображения. Что бы сохранить читаемость текста, фон штампа должен быть прозрачным.
  • Штамп не может быть сохранен в виде версии документа, так как вставка штампа – это изменение содержания документа, а подписанный документ в системе запрещено изменять.
  • Штамп не может быть динамически вставлен в текст при каждом открытии документа, так как в СЭД DIRECTUM нет возможности выполнить дополнительный программный код при открытии документа. Кроме того, просмотр документа может происходить разными способами: предпросмотр, экспорт и открытие, открытие из системы и т.д.
  • Так как штамп нельзя сохранить в документе в системе и нельзя каждый раз вставлять при просмотре документа, требуется найти удобный способ запуска этого механизма.
  • Не всегда все подписи требуется отображать в штампе. Подпись на некоторые документы может поставить любой пользователь системы с зарегистрированным сертификатом ЭП, при этом, не являясь для него согласующим или утверждающим лицом.

Описание решения

Механизм печати со штампом было решено реализовывать как дополнительный функционал в виде кнопки на карточке документа. Позже, после перехода на версию DIRECTUM 5.2.1, была добавлена возможность формировать штамп с помощью пункта контекстного меню.

Получение штампа

Штамп должен формироваться динамически, так как содержит информацию, характерную конкретной версии документа и ФИО пользователя, формирующего штамп. Желательно штамп отделить от текста документа рамкой, что бы текст штампа не сливался с текстом документа. Так же желательно вставить в штамп логотип корпорации. Такое форматирование можно описать в виде HTML документа.

Штамп необходимо формировать в виде изображения. Это с одной стороны упростит вставку штампа в различные форматы документов, а с другой, усложнит процесс подлога штампа. На штампе необходимо писать ФИО того, кто распечатал штамп, дату печати и оставлять место для подписи. Рукописная подпись в штампе подтверждает достоверность распечатанной информации.

Для преобразования HTML документа в изображение используется утилита «CutyCapt». Эта консольная утилита может преобразовывать HTML страницу в файлы формата PNG, SVG, PDF и другие. В данном решении производится преобразование HTML страницы в PNG файл с белым фоном и синим штампом.

Прозрачность фона

Полученный штамп имеет непрозрачный белый фон. Если вставлять его в документ, то штамп может перекрывать текст. Для сохранения текста в читаемом виде, требуется изменить штампу фон на прозрачный. Поиск утилит в интернете для установки прозрачности изображения в зависимости от цвета не дал результата. Поэтому, было решено реализовать такую утилиту собственными силами.

Для создания утилиты была использована C++ библиотека «libpng», С++ компилятор «Dev C++». Утилита «setTransparency» принимает PNG изображение и меняет его, устанавливая прозрачность каждому пикселю в зависимости от того, насколько близко его цвет к белому.

Вставка штампа в редакторе MS Word

Для вставки штампа в Word используется его объектная модель. Сильно помог материал Евгения Валькова. За основу взята его функция вставки изображения в Word. Система настроена на вставку штампа в верхний левый угол, но перед печатью пользователь может перенести штамп в более удобное место.

Вставка штампа в редакторе MS Excel

Вставка изображения в Excel производится так же, как и в Word, через объектную модель приложения с учетом его особенностей. 

Вставка штампа в документы формата PDF

Вставка изображения в PDF документы появилась уже после перехода на версию DIRECTUM 5.2.1 и производится стандартным функционалом с помощью функции AddImageToPDFFile. Система настроена на вставку штампа в верхний левый угол документа.

Интерфейс механизма

На начальном этапе разработки получить документ со штампом можно было через кнопку на карточке документа. Это не очевидный и не удобный способ. После перехода на версию DIRECTUM 5.2.1 кнопка «Печать со штампом» была размещена в контекстном меню документа. Это позволило удобно и быстро вызывать данный функционал.

У документа может быть несколько подписанных версий разных форматов. Механизм «печати со штампом» составляет список подписанных ЭП версий, с форматами которых он может работать. Если таких больше 1, то он предоставляет выбор пользователю, какую версию следует отобразить со штампом. Если таких версий нет, то пользователь получает сообщение об этом.

После выбора версии, формируется список подписей и пользователь может выбрать, какие ЭП надо отобразить в штампе. На следующем этапе производится формирование документа со штампом и его отображение на экране.

Результаты применения решения

Применение данного механизма не ограничивается программно какими-либо маршрутами, процессами или документами, но можно выделить процессы, в которых он наиболее активно используется:

  • Электронное согласование служебных записок в DIRECTUM появилось уже давно. Теперь, при распечатке СЗ можно отобразить на ней факт согласования теми или иными службами без дополнительного листа согласования.
  • В 2016 году введен процесс электронного утверждения договорных документов между ВСМПО и дочерними организациями. Фактом утверждения являются ЭП с признаком «Утверждающая» представителей ВСМПО и дочерней организации. При передаче пакета договорных документов в электронном виде в налоговую, эти документы выгружаются и сохраняются со штампом. Для этого были сделаны доработки в системе «КАС Бизнес Люкс» и в сценарии «Экспорт договорных документов».
  • ПВК (Протокол выбора контрагента) согласуются в DIRECTUM с 2014 года. Введена обязательность ЭП в маршруте согласования. При передаче пакета договорных документов на подпись генеральному директору, ПВК печатается со штампом.

Планы и возможности развития

  • На данный момент идет внедрение механизма автоматизации процесса управления служебными записками. Этот механизм позволит создавать служебные записки на основе шаблона и направлять их на электронное согласование с руководителем подразделения. Его использование ещё больше расширит применение штампов в служебной записке. Об этом механизме рассказано в этой статье.
  • Существует возможность реализовать сценарий для интеграции с другими системами. Сценарий мог бы формировать файл со штампом на основе ИД документа DIRECTUM. Это позволит формировать документы со штампом из других систем.
  • Планируется реализовать электронное согласование и утверждение договорных документов с TISA (дочернее общество в Швейцарии). Штампы так же будут востребованы при направлении таких документов в налоговую или на аудит

Состав участников.

Исполнители:

Колесов А.Д. Разработка проектных решений.

Тарасов М.В. Разработка программной части.

Максимова Т.В., Светлолобова Е.О., Андреева Л.С., Туктарова А.В. Внедрение и сопровождение.

Организация: Организация не указана
16

Комментарии

Михаил Тарасов - это уже бренд.

Михаил, как решалась задача распространения консольной утилиты на машины пользователей?
Не думали перейти на директумовский COM "GenerateTextImage.Image", он по сути делает то же самое?
yes
 

А почему не использовали "стандартную" библиотеку Directum GenerateTextImage.dll (прозрачный фон поддерживается)?

Ее можно взять из любой старшей версии Directum скопировать, зарегистрировать и использовать. Будет работать  даже в 4.9.1.

Михаил, как решалась задача распространения консольной утилиты на машины пользователей?

Утилиты (CutyCapt и setTransparency) выгружаются в TEMP из системы. В системе они заведены как документы.

Не думали перейти на директумовский COM "GenerateTextImage.Image", он по сути делает то же самое?

Когда разрабатывали решение, были на версии 4.9.1. Новую версию не скачивали, не ставили и было не совсем ясно, как в ней вообще реализована работа со штампами (из статей это было не совсем ясно. Возникали вопросы вроде "а штамп вставляется на клиенте или на сервере?" или "Должна ли быть установлена служба преобразования?"). 

Ну а после перехода сработал принцип "работает, не трогай". Тем более, если она делает то же самое. 

 

Если в будущем появится какая-то существенная необходимость, или преимущество стандартной библиотеки перед "самописной", переделаем на новый лад...

 

Пока же больше беспокоит, как бы сделать так, что бы в PDF документах масштаб соблюдался и можно было пользователю выбирать место вставки штампа. Для этого нужно размеры страницы правильно определять. Воспользовались советом отсюда, но как показала практика, не всегда корректно эти размеры определяются.

 

Пока же больше беспокоит, как бы сделать так, что бы в PDF документах масштаб соблюдался и можно было пользователю выбирать место вставки штампа. Для этого нужно размеры страницы правильно определять. Воспользовались советом отсюда, но как показала практика, не всегда корректно эти размеры определяются.

А в чем у вас проблема? Мы приняли за отправную точку размер страницы при 300dpi (или 150? в общем при 100% масштабе она соответствует листу А4 на мониторе, допустим 1000 на 600 (не помню точные цифры) это эталонные константы) сделали для такого размера штамп. Для любого документа получаем его высоту, и масштабируем штамп на это соотношение.

Т.е. если к нам пришел документ отсканированный в 1200dpi с высотой в 11000, чтобы штамп на нем выглядел красиво увеличиваем его масштаб в 11 раз. Если мелкий документ - уменьшаем. В стандартных функциях есть параметр масштаба.

На сколько я знаю сбоев пока не было.

Еще документ перед определением размеров надо обязательно нормализировать (есть такая функция в библиотеке дебеню).

 

 

выгружаются в TEMP из системы. В системе они заведены как документы.

Самое оно использовать Файлы как часть разработки. Способ организации работы. =)))

"работает, не трогай"

Согласен, тем более такая работа проведена по созданию своего механизма. Единственный плюс использовать директумовскую версию - не надо ничего на клиент каждый раз скачивать, и точно не будет проблем с правами на запуск exe'шников непонятных и антивирус не будет каждый раз его проверять.

 

 

А в чем у вас проблема? Мы приняли за отправную точку размер страницы при 300dpi (или 150? в общем при 100% масштабе она соответствует листу А4 на мониторе, допустим 1000 на 600 (не помню точные цифры) это эталонные константы) сделали для такого размера штамп. Для любого документа получаем его высоту, и масштабируем штамп на это соотношение. Т.е. если к нам пришел документ отсканированный в 1200dpi с высотой в 11000, чтобы штамп на нем выглядел красиво увеличиваем его масштаб в 11 раз. Если мелкий документ - уменьшаем. В стандартных функциях есть параметр масштаба. На сколько я знаю сбоев пока не было. Еще документ перед определением размеров надо обязательно нормализировать (есть такая функция в библиотеке дебеню).

В общем кратко: Получаю размеры страницы в отдельной функции так:

 INSERT_IMAGE_MODE = 2 FUNCTION_ERROR = 0 Result = CreateList() // Подключаемся к библиотеке try PDFDocument = CreateObject('DebenuPDFLibraryLite1011.PDFLibrary')
 except Raise(CreateException('ERROR'; Loadstring('DIRB9A32A61_8B1D_49A2_A4F1_E1C60270757E'; 'COMMON'); ecException)) endExcept if PDFDocument.LoadFromFile(PDFFilePath; "") = FUNCTION_ERROR Raise(CreateException('ERROR';
 Loadstring('DIRFC866118_0E64_4205_BCCB_FC3B537B217B'; 'COMMON'); ecException)) endif IDDoc = PDFDocument.SelectedDocument Result.add("W"; PDFDocument.PageWidth) Result.add("H"; PDFDocument.PageHeight) PDFDocument.RemoveDocument(IDDoc)
 PDFDocument = NIL 

Используем, как ориентир не высоту, а ширину страницы. размер штампа по ширине - константа. По высоте изменяется. Задали соотношение, что штамп будет занимать 2/5 частей страницы.

Замечено, что в некоторых случая ширина штампа по отношению к ширине страницы соотносится не как 2/5, а примерно 3/5. Обычные вроде бы документы со страничной ориентацией.

Отсюда вывод, что определение ширины страницы отрабатывает не всегда корректно. Почему и как, ещё не разбирался.  

Далее, что бы хотелось в будущем: Перед вставкой штампа показывать диалоговое окно, где превьюшкой рисовать первую страницу PDF документа (как то его ещё надо будет в изображение сконвертить), а поверх него штамп с возможностью его масштабировать и двигать. Пользователь выбирает для штампа место, нажимает ОК, мы считываем координаты и масштаб и производим вставку штампа. И в таком механизме нужно точное определение размеров первой страницы.

//В коде переводы строк почему - то съехали

Отсюда вывод, что определение ширины страницы отрабатывает не всегда корректно. Почему и как, ещё не разбирался.  

попробуйте нормализировать страницу сразу после загрузки файла: http://www.debenu.com/docs/pdf_library_reference/NormalizePage.php

 

 

попробуйте нормализировать страницу сразу после загрузки файла

Спасибо, ваш совет помог.

 

Авторизуйтесь, чтобы написать комментарий