function StampPagesFromPdf(
Source : TPdf;
SourcePageIndex : Integer;
const TargetPages : array of Integer;
const Options : TPdfOverlayOptions;
out Report : TPdfOverlayReport): Boolean;
StampPagesFromPdf е композаторът от високо ниво за overlay, underlay и
водни знаци. Той създава Form XObject от изходна страница чрез
FPDF_NewXObjectFromPage, след което поставя по едно
позиционирано, мащабирано и по желание ротарирано копие на този XObject
във всяка заявена целева страница. Позиционирането, мащабирането,
ротацията, blend режимът и z-редът се управляват чрез записа
TPdfOverlayOptions (Placement,
X, Y, Scale,
Rotation, Margin, UseCropBox,
ZUnderlay и BlendMode); out параметърът
TPdfOverlayReport записва
StampedPageCount, FailedPageCount,
SkippedPageCount, SourcePageWidth,
SourcePageHeight, Succeeded и
ErrorMessage
Вътрешно всяко щампане комбинира
FPDF_NewFormObjectFromXObject,
FPDFPageObj_SetMatrix,
FPDFPageObj_SetBlendMode и или
FPDFPage_InsertObject (overlay), или
FPDFPage_InsertObjectAtIndex със stack index 0
(underlay). Матрицата за позициониране се изгражда от
PageWidth/PageHeight плюс полетата с опции,
така че всички котви, полета, мащабиране и ротация се свеждат до една
трансформация, която PDFium прилага върху вмъкнатия form object
Източникът и целта трябва и двете да са Active. Източникът
може да е отделна инстанция на TPdf или дори самият този
документ (self-stamp): текущият PageNumber на извикващия и за
двата документа се запазва и възстановява около извикването
Source — друг активен TPdf, притежаващ страницата за преизползване. Може да е същата инстанция като целтаSourcePageIndex — индекс на страницата в Source, започващ от нулаTargetPages — целеви индекси на страници в този документ, започващи от нула. Подайте празен масив, за да щампате всяка страницаOptions — запис TPdfOverlayOptions. Използвайте TPdfOverlayOptions.Default за центриран, автоматично напасващ се overlay отгореReport — получава броя щампани, неуспешни и пропуснати страници плюс широчината/височината на изходната страница, използвани за изчисляване на матрицата за позициониранеopTopLeft, opTopCenter, opTopRight, opMiddleLeft, opCenter, opMiddleRight, opBottomLeft, opBottomCenter, opBottomRight, opStretch (независимо мащабиране по двете оси) и opCustom (използва изрични X/Y)Scale=0 означава автоматично напасване вътре в полето на страницата минус заявеното поле, докато се запазва съотношението на страните, освен при Placement=opStretch, когато изображението се разтегля, за да запълни полетоRotation е в градуси обратно на часовниковата стрелка и върти поставеното изображение около собствения му център, така че воден знак от 45° остава визуално центриранZUnderlay=True вмъква щампата на stack index 0, така че тя стои зад всеки съществуващ страничен обект. Нативният PDFium API няма публично извикване за преместване на обект на даден индекс, затова underlay пътят използва свеж Form XObject, вмъкнат директно най-долу, вместо да репозиционира добавено копиеBlendMode се прилага върху вмъкнатия form object чрез FPDFPageObj_SetBlendMode. Чистата алфа прозрачност върху Form XObject не е достъпна през публичния PDFium API; използвайте blend режими като bmMultiply или bmScreen, или визуализирайте източника предварително с желаната алфа преди щампанетоReport.SkippedPageCount и не прекъсват изпълнението
var
Watermark: TPdf;
Options: TPdfOverlayOptions;
Report: TPdfOverlayReport;
begin
Watermark := TPdf.Create(nil);
try
Watermark.FileName := 'C:\Confidential.pdf';
Watermark.Active := True;
Options := TPdfOverlayOptions.Default;
Options.Placement := opCenter;
Options.Rotation := 45;
Options.BlendMode := bmMultiply;
Pdf1.StampPagesFromPdf(Watermark, 0, [], Options, Report);
finally
Watermark.Free;
end;
end;