Изменение штампа электронной подписи
Пример демонстрирует вставку собственных изображений штампов электронной подписи в файл, приложенный к карточке Docsvision.
Ссылка на пример на GitHub: CSPSignatureVisualization.
Пример рассчитан на версию Web-клиента 6.1 или выше.
-
Microsoft Visual Studio 2022.
Создайте описание расширения для 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 .
Параметры:
|
2 | Получаем название расширения. |
3 | Получаем версию расширения. |
4 | Регистрируем типы в IoC контейнере.
Параметры:
|
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 | Полный код приведён в файле | в репозитории примера на 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-файла.
Параметры:
|
5 | Задаём начальные координаты первого изображения штампов электронной подписи. |
6 | Максимальная высота изображения штампа в текущей строке (нужна для выравнивания изображений в строке). |
7 | Если верхняя левая координата текущего изображения больше высоты страницы PDF-документа, прекращаем вставку изображений. |
8 | Если ширина строки вставленных изображений превышает ширину страницы, переходим на следующую строку. |
9 | В противном случае вычисляем максимальную высоту изображения штампа в текущей строке. |
10 | Вставляем текущее изображение по указанным координатам. |
11 | Вычисляем горизонтальную координату следующего изображения. |
12 | Копируем в поток сформированный PDF-файл со вставленными изображениями штампов электронной подписи. |
13 | Полный код приведён в файле | в репозитории примера на GitHub.