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

Пример демонстрирует вставку собственных изображений штампов электронной подписи в файл, приложенный к карточке Docsvision.

Ссылка на пример на GitHub: CSPSignatureVisualization.

Пример рассчитан на версию Web-клиента 6.1 или выше.

Перечень необходимых инструментов:

Создайте описание расширения для Web-клиента, которое задано в текущей сборке

    public class CSPSignatureVisualizationExtension : WebClientExtension
    {
        public CSPSignatureVisualizationExtension() (1)
        {
        }

        #region Свойства

        public override string ExtensionName (2)
            => Assembly.GetAssembly(typeof(CSPSignatureVisualizationExtension)).GetName().Name;

        public override Version ExtensionVersion (3)
            => new Version(FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion);

        #endregion Свойства

        #region Обработчики событий

        public override void InitializeServiceCollection(IServiceCollection services) (4)
        {
            services.AddSingleton<IImageGenerator, CSPSignatureImageGenerator>(); (5)

            services.AddSingleton<IImagePositionSelector, CSPSignatureImagePositionSelector>(); (6)
        }

        #endregion Обработчики событий
    }
1 Создаём новый экземпляр класса CSPSignatureVisualizationExtension.
Параметры:
  • serviceProvider — сервис-провайдер.

2 Получаем название расширения.
3 Получаем версию расширения.
4 Регистрируем типы в IoC контейнере.
Параметры:
  • containerBuilder — контейнер.

5 Регистрируем тип CSPSignatureImageGenerator как реализацию интерфейса IImageGenerator в containerBuilder.
6 Регистрируем тип CSPSignatureImagePositionSelector как реализацию интерфейса IImagePositionSelector в containerBuilder.

Настройка штампа ЭП

Описание генератора изображений штампов электронной подписи выглядит следующим образом:

    public class CSPSignatureImageGenerator : IImageGenerator (1)
    {
        private const double ViewBoxHeight = 88; (2)

        private const double ViewBoxWidth = 314; (3)

        private const double ContentTop = 64; (4)

        private const double FontHeight = 14; (5)

        private const int MaxStringsLength = 38; (6)
 (7)
1 Высота изображения штампа электронной подписи.
2 Ширина изображения штампа электронной подписи.
3 Левая верхняя координата информационного содержимого штампа электронной подписи.
4 Высота используемого шрифта в пикселях (Используется десятый размер шрифта).
5 Максимальная длина используемого в изображении штампа электронной подписи текста. При стандартном интервале между символами. Используется для разбиения текста на отдельные строки.
6 Полный код приведён в файле CSPSignatureVisualization  CSPSignatureVisualizationServerExtension  DataVisualization  CSPSignatureImageGenerator.cs в репозитории примера на GitHub.

Описание класса, вставляющего в PDF-файл изображения штампов электронной подписи:

namespace CSPSignatureVisualizationServerExtension.DataVisualization
{
    public class CSPSignatureImagePositionSelector : IImagePositionSelector
    {
        private static readonly double ImageMargin = ImageHelper.PixelsToUnits(5); (1)

        private static readonly int PagePadding = 30; (2)

        private const int PageNumber = 0; (3)

        #region Реализация интерфейса IImagePositionSelector

        public GeneratedFileInfo Generate(SessionContext sessionContext, ImageGeneratorType generatorType, List<byte[]> images, Stream fileStream) (4)
        {
            ArgumentNullException.ThrowIfNull(images);
            ArgumentNullException.ThrowIfNull(fileStream);

            using var pdfDocument = PdfReader.Open(fileStream);
            var page = pdfDocument.Pages[PageNumber];

            var pageWidth = page.Width.Value;
            var pageHeight = page.Height.Value;

            double xIndent = PagePadding; (5)
            double yIndent = PagePadding;

            double maxImageHeight = 0; (6)

            foreach (var imageHelper in images.Select(x => new ImageHelper(x)))
            {
                if (yIndent + imageHelper.Height > pageHeight) (7)
                    break;

                if (xIndent + imageHelper.Width > pageWidth) (8)
                {
                    yIndent += maxImageHeight + ImageMargin;
                    xIndent = PagePadding;
                    maxImageHeight = imageHelper.Height;
                }
                else if (imageHelper.Height > maxImageHeight) (9)
                {
                    maxImageHeight = imageHelper.Height;
                }

                InsertImage(pdfDocument, page, imageHelper, xIndent, yIndent); (10)

                xIndent += imageHelper.Width + ImageMargin; (11)
            }

            var outputStream = new MemoryStream(); (12)
            pdfDocument.Save(outputStream);
            pdfDocument.Close();
            outputStream.Seek(0, SeekOrigin.Begin);

            return new GeneratedFileInfo { Stream = outputStream };
        }
(13)
1 Расстояние между изображениями штампов электронной подписи.
2 Координаты первого изображения штампа электронной подписи. 30 миллиметров.
3 Номер страницы, на которую требуется вставить изображение штампа.
4 Вставляет изображения штампов электронной подписи на первую страницу указанного PDF-файла.
Параметры:
  • sessionContext — контекст сессии.

  • generatorType — тип генератора изображений штампов электронной подписи.

  • images — массив изображений штампов электронной подписи.

  • fileStream — поток, содержащий PDF-файл, в который необходимо вставить указанные изображения.

    Возвращаемое значение: модель файла со вставленными изображениями.

5 Задаём начальные координаты первого изображения штампов электронной подписи.
6 Максимальная высота изображения штампа в текущей строке (нужна для выравнивания изображений в строке).
7 Если верхняя левая координата текущего изображения больше высоты страницы PDF-документа, прекращаем вставку изображений.
8 Если ширина строки вставленных изображений превышает ширину страницы, переходим на следующую строку.
9 В противном случае вычисляем максимальную высоту изображения штампа в текущей строке.
10 Вставляем текущее изображение по указанным координатам.
11 Вычисляем горизонтальную координату следующего изображения.
12 Копируем в поток сформированный PDF-файл со вставленными изображениями штампов электронной подписи.
13 Полный код приведён в файле CSPSignatureVisualization  CSPSignatureVisualizationServerExtension  DataVisualization  CSPSignatureImagePositionSelector.cs в репозитории примера на GitHub.