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

Редактирование штампа электронной подписи

С ответом

Комментарии

Комментариев: 11

  • Avatar
    Денис Елхов

    Николай, добрый день.

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

    Пока предполагаем, что пример покажет как можно изменить весь штамп ЭП.

    Я отпишусь сюда, когда пример будет готов.

    С уважением,
    Денис Елхов.

    0
    Действия с комментариями Постоянная ссылка
  • Денис, спасибо! ждем пример.

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день! когда можно будет получить пример?

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Денис Елхов

    Добрый день, Николай.

    Мы ожидаем, что сможем взять требование в работу в течение месяца.

    Я отпишусь сюда, когда пример будет готов.

    С уважением,
    Денис Елхов.

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Денис Елхов (Изменен )

    Николай, добрый день.

    Наша команда подготовила инструкцию с примером подключения альтернативного генератора через дополнительную библиотеку.
    Обратите внимание, что вместе с Веб-клиентом 15 выйдет еще и другой пример того как можно поменять штамп, используя тот генератор, который используется нами в версии Веб-клиентом 14+.
    Также обратите внимание, что вам потребуется обновить Веб-клиент до версии 5.5.5238.101.
    Эту версию можно запросить через обращение в техническую поддержку или подождать, когда выложат в Менеджер загрузок.

    РЕАЛИЗАЦИЯ СОБСТВЕННОГО ШТАМПА ЭЛЕКТРОННОЙ ПОДПИСИ

    Web-клиент предоставляет возможность печати основных файлов карточки Документ со штампом электронной подписи (ЭП), если для подписания использовался сертификат.

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

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

    Генератор изображений – класс, реализующий интерфейс IImageGenerator. Данный интерфейс определяет общие функции генераторов изображений: проверка возможности генерации изображения и формирования изображений. Штамп ЭП является частным случаем изображения, которое может быть сгенерировано IImageGenerator.

    Возможность использования компонента IImageGenerator для генерации штампов ЭП проверяется по возвращаемому значению функции IImageGenerator.IsAllowed: если реализация поддерживает генерацию штампов, функция должна возвращать true, когда в generatorType передано значение ImageGeneratorType.ElectronicSignature.

    Ниже приведёт код примера генератора штампов.

    public class SimpleImageGenerator : IImageGenerator
    {
        private const int imageWidth = 100; // Ширина изображения
        private readonly ServiceHelper serviceHelper;
        
        public SimpleImageGenerator(IServiceProvider serviceProvider)
        {
            serviceHelper = new ServiceHelper(serviceProvider);
        }
    
        // Реализация метод IImageGenerator.IsAllowed
        public bool IsAllowed(SessionContext sessionContext, ImageGeneratorType generatorType, Guid cardId, Guid fileCardId, Guid? fileVersionId = null)
        {
            // Метод должен возвращать true, если generatorType имеет значение ImageGeneratorType.ElectronicSignature
            // Здесь могут содержаться дополнительные проверки
            return generatorType == ImageGeneratorType.ElectronicSignature;
        }
        
        // Реализация метод IImageGenerator.Generate
        public Image[] Generate(SessionContext sessionContext, ImageGeneratorType generatorType, Guid cardId, Guid fileCardId, Guid? fileVersionId = null)
        {
            var generatedImages = new List<Image>();
            
            // Модели с данными подписей на файле документа с fileCardId получаем
            //  с помощью сервиса DocumentSignatureService
            // Может использоваться собственная реализация способа получения данных о подписях
            var stampModels = serviceHelper.DocumentSignatureService.GetStampSignatureModel(sessionContext, cardId, fileCardId, fileVersionId);
    
            // Штамп формируем для каждой подписи
            foreach (var stampModel in stampModels)
            {
                if (stampModel.Certificate == null) continue;
    
                // Подготавливаем данные для штампа: номер, срок действия и владелец сертификата
                var certificateNumber = stampModel.Certificate.GetSerialNumberString();
                var notBefore = stampModel.Certificate.NotBefore;
                var owner = stampModel.Certificate.GetNameInfo(X509NameType.SimpleName, false);
    
                // Формируем изображение штампа
                // В данном примере изображение формируется путём преобразования HTML в PNG с
                //  помощью сторонней библиотеки NReco
                // В собственной релизации могут использоваться любые другие способы генерации 
                //  изображений из текста
                var html = String.Format(Resources.StampHtml, Resources.Css, certificateNumber, owner, notBefore);
                var htmlToImageConv = new NReco.ImageGenerator.HtmlToImageConverter();
                htmlToImageConv.Width = imageWidth;
    
                using (var pngStream = new MemoryStream())
                {
                    htmlToImageConv.GenerateImage(html, "png", pngStream);
                    generatedImages.Add(Image.FromStream(pngStream));
                }
            }
    
            // Метод возвращает изображения штампов всех электронных подписей
            return generatedImages.ToArray();
        }
    }

    Непосредственно генерация изображений из текстовых данных в данном примере выполняется с помощью компонента NReco.ImageGenerator.

    Пример html-кода получаемого из ресурса Resources.StampHtml:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>Docsvision mail client email</title>
    		<style type="text/css" media="all">
                {0}
    		</style>
    		</head>
    
            <body>
    		<div class="stamp">
                <div class="top">
    				<div class="main">
    					Документ подписан<br/> электронной подписью
    				</div>
    			</div>
    			<table class="bottom">
    				<tr>
    					<td>Сертификат:</td>
    					<td>{1}</td>
    				</tr>
    				<tr class="bold">
    					<td>Владелец:</td>
    					<td>{2}</td>
    				</tr>
    				<tr>
    					<td>Действителен:</td>
    					<td>{3}</td>
    				</tr>
    			</table>
    		</div>
    	</body>
    </html>

    Пример стилей (из ресурса Resources.Css):

    .stamp {
        display: inline-block;
        font-family: Arial, serif;
        padding: .5rem;
        border: 3px double blue;
        border-radius: 6px;
        color: blue;
    }
    .top {
        display: flex;
        justify-content: space-around;
        border-bottom: 2px dotted blue;
        padding-bottom: .3rem;
    }
    .main {
        font-size: .75rem;
        text-transform: uppercase;
        display: inline-block;
    }
    .bottom {
        margin-top: 3px;
        font-size: 0.64rem;
        white-space: nowrap;
        line-height: 100%;
    }
    .bottom td {
        padding: 0 1px;
    }
    .bold {
        font-weight: bold;
    }

    Разработанный генератор изображений должен быть зарегистрирован в ядре серверного расширения в методе InitializeContainer:

    public override void InitializeContainer(ContainerBuilder containerBuilder)
    {
        containerBuilder.RegisterOrderedType<SimpleImageGenerator, IImageGenerator>();
    }

    Обратите внимание: если в Web-клиенте зарегистрировано несколько реализаций IImageGenerator с поддержкой ImageGeneratorType.ElectronicSignature, будет использоваться реализация из последнего загруженного серверного расширения.

    С уважением, Денис Елхов.

    0
    Действия с комментариями Постоянная ссылка
  • Денис, спасибо за пример кода. Возник следующий вопрос - можно ли после подписания в СЭД файла и завершения согласования программно формировать файл со штампами ЭП в PDF  и сохранять его в карточке документа?

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Денис Елхов

    Николай, добрый день.

    Считаю это уже можно сделать через предоставленный код и программирование БП.

    С уважением, Денис Елхов.

    0
    Действия с комментариями Постоянная ссылка
  • Добрый день.

    При разработке серверного расширения какую библиотеку нужно поключать для работы с компонентом IImageGenerator?

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Владимир

    Добрый день, Марина.

    Интерфейс IImageGenerator определён в сборке DocsVision.BackOffice.WebClient.dll.

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Марина Авдюшкина (Изменен )

    В примере, который предоставили для работы есть подключение


    using DocsVision.BackOffice.WebClient.DataVisualization;

    Библиотека DocsVision.BackOffice.WebClient, которая доступна для скачивания на https://github.com/DocsVision/WebClient-Samples по позволяет подключить DocsVision.BackOffice.WebClient.DataVisualization в серверном расширении.

    Эта же библиотека (DocsVision.BackOffice.WebClient) подключена у меня в серверном раширении, но при попытке создать свой класс наследованием от IImageGenerator, VS пишет, что не обнаружен такой тип.

    Возможно нужна новая версия  DocsVision.BackOffice.WebClient. Подскажите где ее скачать?

     

    0
    Действия с комментариями Постоянная ссылка
  • Avatar
    Владимир

    Добрый день, Марина.

    Денис выше указывает требования к версии ВК, поддерживающий формирование штампов - от 5.5.5238.101, а также вариант её получения - через ТП. Другой вариант - из Менеджер загрузок, пока не подходит (в разделе более старая сборка).

    В релизной версии ВК14 (сборки этой версии на github) функции формирования штампов ЭП не было - она появилась в накопительном патче.

    0
    Действия с комментариями Постоянная ссылка

Войдите в службу, чтобы оставить комментарий.