/// <summary> /// Определяет доступность класс, вставляющий в PDF-файл изображения штампов электронной подписи /// </summary> /// <param name="sessionContext">Контекст сессии</param> /// <param name="generatorType">Тип генератора изображений штампа электронной подписи</param> /// <param name="cardId">Идентификатор карточки</param> /// <param name="fileCardId">Идентификатор файла, для которого необходимо вставить изображения штампов электронной подписи</param> /// <param name="fileVersionId">Идентификатор версии файла, для которого необходимо вставить изображения штампов электронной подписи</param> /// <returns><see langword="true"/>, если класс удовлетворяет необходимым условиям. В противном случае возвращает <see langword="false"/></returns> public bool IsAllowed(SessionContext sessionContext, ImageGeneratorType generatorType, Guid cardId, Guid fileCardId, Guid?fileVersionId = null) { if (sessionContext is null) { throw new ArgumentNullException(nameof(sessionContext)); } return(generatorType == ImageGeneratorType.ElectronicSignature && sessionContext.AdvancedCardManager.GetCardTypeId(cardId) == CardDocument.ID); }
/// <summary> /// Создаёт массив изображений штампов электронной подписи /// </summary> /// <param name="sessionContext">Контекст сессии</param> /// <param name="generatorType">Тип генератора изображений штампов электронной подписи</param> /// <param name="cardId">Идентификатор карточки</param> /// <param name="fileCardId">Идентификатор файла, для которого необходимо вставить изображения штампов электронной подписи</param> /// <param name="fileVersionId">Идентификатор версии файла, для которого необходимо вставить изображения штампов электронной подписи</param> /// <returns>Массив изображений штампов электронной подписи, которые необходимо вставить в указанный файл</returns> public Image[] Generate(SessionContext sessionContext, ImageGeneratorType generatorType, Guid cardId, Guid fileCardId, Guid?fileVersionId = null) { var generatedImages = new List <Image>(); // Получаем список моделей электронной подписи указанного файла var stampModels = serviceHelper.DocumentSignatureService.GetStampSignatureModel(sessionContext, cardId, fileCardId, fileVersionId); if (stampModels.Any()) // Если указанный файл содержит хотя бы одну электронную подпись { foreach (var stampModel in stampModels) { if (stampModel.Certificate == null) { continue; // Для простых электронных подписей изображения не создаём } // Получаем номер сертификата электронной подписи var certificateNumber = stampModel.Certificate.GetSerialNumberString(); // Получаем имя владельца сертификата электронной подписи var owner = stampModel.Certificate.GetNameInfo(X509NameType.SimpleName, false); // Формируем изображение штампа электронной подписи в формате SVG на основе имени владельца, метки и номера сертификата электронной подписи, // а также дат начала и окончания срока действия сертификата var svg = GenerateSvg(owner, stampModel.LabelDisplayName, certificateNumber, stampModel.Certificate.NotBefore, stampModel.Certificate.NotAfter); // Преобразуем сформированное изображение в формат PNG var svgDocument = SvgDocument.FromSvg <SvgDocument>(svg); using (var pngStream = new MemoryStream()) { SvgToPngStream(svgDocument, pngStream); // и добавляем его в результирующий массив generatedImages.Add(Image.FromStream(pngStream)); } } } return(generatedImages.ToArray()); }
/// <summary> /// Initializes a new instance of the <see cref="TypeGenerator"/> class. /// </summary> public TypeGenerator() { Generators = new Dictionary <Type, IGeneratorType>(); IGeneratorType textBlock = new TextBlockGeneratorType(); Generators.Add(textBlock.XamlType, textBlock); IGeneratorType stackPanel = new StackPanelGeneratorType(); Generators.Add(stackPanel.XamlType, stackPanel); IGeneratorType uiRoot = new UIRootGeneratorType(); Generators.Add(uiRoot.XamlType, uiRoot); IGeneratorType border = new BorderGeneratorType(); Generators.Add(border.XamlType, border); IGeneratorType button = new ButtonGeneratorType(); Generators.Add(button.XamlType, button); IGeneratorType control = new ControlGeneratorType(); Generators.Add(control.XamlType, control); IGeneratorType contentControl = new ContentControlGeneratorType(); Generators.Add(contentControl.XamlType, contentControl); IGeneratorType presenter = new ContentPresenterGeneratorType(); Generators.Add(presenter.XamlType, presenter); IGeneratorType toggle = new ToggleButtonGeneratorType(); Generators.Add(toggle.XamlType, toggle); IGeneratorType checkBox = new CheckBoxGeneratorType(); Generators.Add(checkBox.XamlType, checkBox); IGeneratorType itemsControl = new ItemsControlGeneratorType(); Generators.Add(itemsControl.XamlType, itemsControl); IGeneratorType combo = new ComboBoxGeneratorType(); Generators.Add(combo.XamlType, combo); IGeneratorType dataGrid = new DataGridGeneratorType(); Generators.Add(dataGrid.XamlType, dataGrid); IGeneratorType dataGridColumn = new DataGridColumnGeneratorType(); Generators.Add(dataGridColumn.XamlType, dataGridColumn); IGeneratorType dataGridBoundColumn = new DataGridBoundColumnGeneratorType(); Generators.Add(dataGridBoundColumn.XamlType, dataGridBoundColumn); IGeneratorType dataGridTextColumn = new DataGridTextColumnGeneratorType(); Generators.Add(dataGridTextColumn.XamlType, dataGridTextColumn); IGeneratorType dataGridCheckBoxColumn = new DataGridCheckBoxColumnGeneratorType(); Generators.Add(dataGridCheckBoxColumn.XamlType, dataGridCheckBoxColumn); IGeneratorType dataGridTemplateColumn = new DataGridTemplateColumnGeneratorType(); Generators.Add(dataGridTemplateColumn.XamlType, dataGridTemplateColumn); IGeneratorType expander = new ExpanderGeneratorType(); Generators.Add(expander.XamlType, expander); IGeneratorType grid = new GridGeneratorType(); Generators.Add(grid.XamlType, grid); IGeneratorType header = new HeaderedContentControlGeneratorType(); Generators.Add(header.XamlType, header); IGeneratorType image = new ImageGeneratorType(); Generators.Add(image.XamlType, image); IGeneratorType listBox = new ListBoxGeneratorType(); Generators.Add(listBox.XamlType, listBox); IGeneratorType scrollViewer = new ScrollViewerGeneratorType(); Generators.Add(scrollViewer.XamlType, scrollViewer); IGeneratorType tabControl = new TabControlGeneratorType(); Generators.Add(tabControl.XamlType, tabControl); IGeneratorType textBox = new TextBoxGeneratorType(); Generators.Add(textBox.XamlType, textBox); IGeneratorType progressBar = new ProgressBarGeneratorType(); Generators.Add(progressBar.XamlType, progressBar); IGeneratorType scrollContentPresenter = new ScrollContentPresenterGeneratorType(); Generators.Add(scrollContentPresenter.XamlType, scrollContentPresenter); IGeneratorType repeatButton = new RepeatButtonGeneratorType(); Generators.Add(repeatButton.XamlType, repeatButton); IGeneratorType scrollBar = new ScrollBarGeneratorType(); Generators.Add(scrollBar.XamlType, scrollBar); IGeneratorType listBoxItem = new ListBoxItemGeneratorType(); Generators.Add(listBoxItem.XamlType, listBoxItem); IGeneratorType tabItem = new TabItemGeneratorType(); Generators.Add(tabItem.XamlType, tabItem); IGeneratorType comboBoxItem = new ComboBoxItemGeneratorType(); Generators.Add(comboBoxItem.XamlType, comboBoxItem); IGeneratorType userControl = new UserControlGeneratorType(); Generators.Add(userControl.XamlType, userControl); IGeneratorType customUserControl = new CustomUserControlGeneratorType(); Generators.Add(customUserControl.XamlType, customUserControl); IGeneratorType track = new TrackGeneratorType(); Generators.Add(track.XamlType, track); IGeneratorType thumb = new ThumbGeneratorType(); Generators.Add(thumb.XamlType, thumb); IGeneratorType slider = new SliderGeneratorType(); Generators.Add(slider.XamlType, slider); IGeneratorType numeric = new NumericTextBoxGeneratorType(); Generators.Add(numeric.XamlType, numeric); IGeneratorType pass = new PasswordBoxGeneratorType(); Generators.Add(pass.XamlType, pass); IGeneratorType customPassword = new CustomPasswordBoxGeneratorType(); Generators.Add(customPassword.XamlType, customPassword); IGeneratorType animImage = new AnimatedImageGeneratorType(); Generators.Add(animImage.XamlType, animImage); IGeneratorType shape = new ShapeGeneratorType(); Generators.Add(shape.XamlType, shape); IGeneratorType rectangle = new RectangleGeneratorType(); Generators.Add(rectangle.XamlType, rectangle); IGeneratorType ellipse = new EllipseGeneratorType(); Generators.Add(ellipse.XamlType, ellipse); IGeneratorType canvas = new CanvasGeneratorType(); Generators.Add(canvas.XamlType, canvas); IGeneratorType path = new PathGeneratorType(); Generators.Add(path.XamlType, path); IGeneratorType dockPanel = new DockPanelGeneratorType(); Generators.Add(dockPanel.XamlType, dockPanel); IGeneratorType line = new LineGeneratorType(); Generators.Add(line.XamlType, line); IGeneratorType treeView = new TreeViewGeneratorType(); Generators.Add(treeView.XamlType, treeView); IGeneratorType headerItems = new HeaderedItemsControlGeneratorType(); Generators.Add(headerItems.XamlType, headerItems); IGeneratorType treeViewItem = new TreeViewItemGeneratorType(); Generators.Add(treeViewItem.XamlType, treeViewItem); IGeneratorType wrapPanel = new WrapPanelGeneratorType(); Generators.Add(wrapPanel.XamlType, wrapPanel); IGeneratorType popup = new PopupGeneratorType(); Generators.Add(popup.XamlType, popup); IGeneratorType tabPanel = new TabPanelGeneratorType(); Generators.Add(tabPanel.XamlType, tabPanel); IGeneratorType radio = new RadioButtonGeneratorType(); Generators.Add(radio.XamlType, radio); IGeneratorType groupBox = new GroupBoxGeneratorType(); Generators.Add(groupBox.XamlType, groupBox); IGeneratorType chart = new ChartGeneratorType(); Generators.Add(chart.XamlType, chart); IGeneratorType series = new LineSeries2DGeneratorType(); Generators.Add(series.XamlType, series); IGeneratorType seriesPoint = new SeriesPointGeneratorType(); Generators.Add(seriesPoint.XamlType, seriesPoint); }
/// <summary> /// Вставляет изображения штампов электронной подписи на первую страницу указанного PDF-файла /// </summary> /// <param name="sessionContext">Контекст сессии</param> /// <param name="generatorType">Тип генератора изображений штампов электронной подписи</param> /// <param name="images">Массив изображений штампов электронной подписи</param> /// <param name="fileStream">Поток, содержащий PDF-файл, в который необходимо вставить указанные изображения</param> /// <returns>Модель файла со вставленными изображениями</returns> public GeneratedFileInfo Generate(SessionContext sessionContext, ImageGeneratorType generatorType, System.Drawing.Image[] images, Stream fileStream) { if (images is null) { throw new ArgumentNullException(nameof(images)); } if (fileStream is null) { throw new ArgumentNullException(nameof(fileStream)); } using (var pdfDocument = new Document(fileStream)) { var page = pdfDocument.Pages[1]; var pdfFileInfo = new PdfFileInfo(pdfDocument); double pageWidth = page.Rect.Width; double pageHeight = page.Rect.Height; // Вычисляем координаты первого изображения штампов электронной подписи var xIndent = pdfFileInfo.GetPageWidth(1) / pageWidth * PagePadding; var yIndent = pdfFileInfo.GetPageHeight(1) / pageHeight * PagePadding; // Максимальная высота изображения штампа в текущей строке (нужна для выравнивания изображений в строке) double maxImageHeight = 0; foreach (var imageHelper in images.Select(x => new ImageHelper(x))) { // Если верхняя левая координата текущего изображения больше высоты страницы PDF-документа, // то прекращаем вставку изображений if (yIndent + imageHelper.Height > pageHeight) { break; } // Если ширина строки вставленных изображений превышает ширину страницы, // то переходим на следующую строку if (xIndent + imageHelper.Width > pageWidth) { yIndent += maxImageHeight + ImageMargin; xIndent = PagePadding; maxImageHeight = imageHelper.Height; } // В противном случае вычисляем максимальную высоту изображения штампа в текущей строке else if (imageHelper.Height > maxImageHeight) { maxImageHeight = imageHelper.Height; } // Вставляем текущее изображение по указанным координатам InsertImage(page, imageHelper, xIndent, yIndent); // Вычисляем горизонтальную координату следующего изображения xIndent += imageHelper.Width + ImageMargin; } // Копируем в поток сформированный PDF-файл со вставленными изображениями штампов электронной подписи var outputStream = new MemoryStream(); pdfDocument.Save(outputStream); outputStream.Seek(0, SeekOrigin.Begin); return(new GeneratedFileInfo { Stream = outputStream }); } }
/// <summary> /// Определяет доступность генератора изображений штампов электронной подписи /// </summary> /// <param name="sessionContext">Контекст сессии</param> /// <param name="generatorType">Тип генератора изображений штампа электронной подписи</param> /// <param name="cardId">Идентификатор карточки</param> /// <param name="fileCardId">Идентификатор файла, для которого необходимо вставить изображения штампов электронной подписи</param> /// <param name="fileVersionId">Идентификатор версии файла, для которого необходимо вставить изображения штампов электронной подписи</param> /// <returns><see langword="true"/>, если генератор удовлетворяет необходимым условиям. В противном случае возвращает <see langword="false"/></returns> public bool IsAllowed(SessionContext sessionContext, ImageGeneratorType generatorType, Guid cardId, Guid fileCardId, Guid?fileVersionId = null) { return(generatorType == ImageGeneratorType.ElectronicSignature); }