Перейти к содержанию

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

Back to top