Выбор преднастроенных способов размещения штампа в PDF
Выбор преднастроенных способов размещения штампа в PDF¶
Добавим в выпадающий список с типами документов (PDF без штампа, PDF со штампом, TIFF) дополнительный тип “PDF штамп справа”, который пользователь может выбрать, чтобы расположить штамп ближе к правой границе страницы.
Note
Для работы указанных расширений требуется версия платформы 2.7.2 или старше.
Напишем расширение, которое замещает стандартный список типов документов (выпадающий список в диалоге), добавляя в него помимо стандартных типов дополнительный тип “формат документа PDF (штамп справа)”. Этот тип выполняет формирование документа PDF со штампом, но добавляет параметр "RightAlignment": true
. Этот параметр ниже используется в расширении на формирование штампа.
using System.Collections.Generic;
using Tessa.Extensions.Platform.Client.Scanning;
using Tessa.Platform.Collections;
namespace Tessa.Extensions.Client.Scanning
{
public sealed class AbScanDialogExtension : ScanDialogExtension
{
public override void InitializeSettings(ScanFileDialogSettings settings)
{
if (settings.DocumentTypesOverride == null)
{
settings.DocumentTypesOverride = new List<ScanDocumentType>();
settings.DocumentTypesOverride.AddRange(ScanDocumentType.DefaultTypes);
}
int index = settings.DocumentTypesOverride.LastIndexOf(t => t.Name == "PDF");
settings.DocumentTypesOverride.Insert(
index + 1,
new ScanDocumentType(
"PDF",
c => new PdfScanDocumentGenerator(c, true,
new Dictionary<string, object> { { "RightAlignment", true } }),
ScanDocumentTag.WithStamp,
string.Format(
Localize("$UI_Controls_Scan_DocumentFormatCaption"),
"PDF") + " (штамп справа)"));
}
}
}
Теперь напишем расширение на формирование штампа, которое проверяет, что если оно выполняется для типа документа с параметром RightAlignment
, то разместим штамп со смещением ближе к правой границе страницы. Размер указывается в т.н. “точках PDF” (points), которые являются независимыми от DPI единицами измерения, используемые в PDF.
Tip
Для следующего расширения подключите к сборке Tessa.Extensions.Client
ссылку на библиотеку PdfSharp-WPF
или на соответствующий NuGet-пакет.
using Tessa.Extensions.Default.Client.Pdf;
using Tessa.Platform.Storage;
namespace Tessa.Extensions.Client.Scanning
{
public sealed class AbPdfStampExtension : PdfStampExtension
{
public override void GenerateForPage(IPdfStampExtensionContext context)
{
if (context.GeneratorInfo.TryGet<bool>("RightAlignment"))
{
context.StampWriter.Left = context.Page.Width.Point - 150;
}
}
}
}
Регистрация расширений выполняется в классе Registrator
. К моменту выполнения расширения AbPdfStampExtension
уже сработает типовое расширение DefaultPdfStampExtension
, которое добавит содержимое штампа в context.StampWriter.Lines
, которое можно проверить в расширении выше, чтобы, например, вычислить их размер.
using Tessa.Extensions.Default.Client.Pdf;
using Tessa.Extensions.Platform.Client.Scanning;
namespace Tessa.Extensions.Client.Scanning
{
[Registrator]
public sealed class Registrator : RegistratorBase
{
public override void RegisterExtensions(IExtensionContainer extensionContainer)
{
extensionContainer
.RegisterExtension<IScanDialogExtension, AbScanDialogExtension>(x => x
.WithOrder(ExtensionStage.AfterPlatform, 1)
.WithSingleton())
.RegisterExtension<IPdfStampExtension, AbPdfStampExtension>(x => x
.WithOrder(ExtensionStage.AfterPlatform, 1)
.WithSingleton())
;
}
}
}