Изменение алгоритмов разбора 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.