Изменение алгоритмов разбора PDF на страницы и генерации PDF из страниц, формирование штампов
Изменение алгоритмов разбора PDF на страницы и генерации PDF из страниц, формирование штампов¶
Для разбора PDF на отдельные страницы-изображения PNG используются две библиотеки: PdfSharp
и Pdfium
.
-
PdfSharp
извлекает изображения из файлов PDF, которые были сгенерированы в системе TESSA. У таких файлов в поле “Автор” пишется строка, задаваемая в константеPdfHelper.TessaGeneratedPdfAuthor
(обычно это строка"Syntellect TESSA"
). Если на страницы был наложен штамп, то изображения извлекаются без штампа. -
Pdfium
выполняет рендеринг каждой из страниц PDF в файл изображения. Таким способом любой файл PDF может быть разобран на страницы. Библиотека Pdfium используется для файлов, которые не были сгенерированы в системе Tessa.
При необходимости эту логику можно перегрузить, зарегистрировав реализацию интерфейса IPdfPageExtractor
, отличную от реализации по умолчанию. Реализация по умолчанию располагается в проекте Tessa.Extensions.Default.Client
в папке Pdf
:
-
PdfSharpPageExtractor
- извлекает страницы посредством библиотекиPdfSharp
. -
PdfiumPageExtractor
- извлекает страницы посредством библиотекиPdfium
. -
DefaultPdfPageExtractor
- выбирает, каким способом извлечь страницы, посредством поля “Автор” в файле PDF.
Для генерации файла PDF из изображений PNG всегда используется библиотека PdfSharp
. В той же папке Pdf
есть реализация интерфейса IPdfGenerator
:
DefaultPdfGenerator
- собирает страницы PNG в PDF. Предварительно выполняет их конвертацию в JPEG, совместимый сPdfSharp
.
Для генерации штампов, которые выводятся поверх каждой страницы в PDF, используют расширения IPdfStampExtension
. Пример расширения по умолчанию DefaultPdfStampExtension
, которое формирует штамп из дайджеста карточки и даты документа (или даты создания карточки, если в ней отсутствует поле DocumentCommonInfo.DocDate).
using System;
using Tessa.Cards;
using Tessa.Platform.Storage;
namespace Tessa.Extensions.Default.Client.Pdf
{
public sealed class DefaultPdfStampExtension : PdfStampExtension
{
public override void GenerateForPage(IPdfStampExtensionContext context)
{
if (!context.StampWriter.IsEmpty)
{
return;
}
DateTime? documentDate;
CardSection section;
if (!context.Card.Sections.TryGetValue("DocumentCommonInfo", out section)
|| !(documentDate = section.RawFields.TryGet<DateTime?>("DocDate")).HasValue)
{
documentDate = context.Card.Created;
}
context.StampWriter
.AppendLine(context.Model.Digest)
.AppendDate(documentDate)
;
}
}
}
Регистрация расширения выполняется обычным для расширений образом.
[Registrator]
public sealed class Registrator : RegistratorBase
{
public override void RegisterExtensions(IExtensionContainer extensionContainer)
{
extensionContainer
.RegisterExtension<IPdfStampExtension, DefaultPdfStampExtension>(x => x
.WithOrder(ExtensionStage.BeforePlatform, int.MaxValue)
.WithSingleton())
;
}
}
Переопределить логику формирования штампа можно, зарегистрировав своё расширение с указанием WithOrder(ExtensionStage.BeforePlatform)
, чтобы полностью переопределить штамп, или с указанием WithOrder(ExtensionStage.AfterPlatform)
, чтобы видоизменить штамп, сформированный расширением типового решения.
Important
Расширения на формирование штампа рассчитаны на использование совместно с библиотекой PdfSharp
для генерации файлов PDF. Расширения вызываются в упомянутом ранее классе DefaultPdfGenerator
. При написании собственной реализации интерфейса IPdfGenerator
может потребоваться также реализовать вызов цепочки расширений, или написать расширения на формирование штампа, совместимые с другой библиотекой генерации PDF.