function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage tworzy wielokrotnego użytku uchwyt, który pozwala jednemu TPdf użyć strony z INNEGO TPdf jako stempla, znaku wodnego albo nakładki szablonu Wewnątrz opakowuje FPDF_NewXObjectFromPage z PDFium i tworzy obiekt Pascal TPdfXObject, który automatycznie zamyka bazowy uchwyt FPDF_XOBJECT w destruktorze, eliminując ręczną obsługę FPDF_CloseXObject
Połącz go z InsertFormObjectFromXObject, aby rzeczywiście wstawić jedną instancję opakowanej strony na bieżącą stronę tego dokumentu Każde wywołanie dodaje świeży FPDF_PAGEOBJECT, który można pozycjonować, skalować i obracać przez FPDFPageObj_SetMatrix oraz pomocniki TPdfMatrix — dzięki temu ten sam XObject może być umieszczany w wielu rozmiarach, obrotach i pozycjach na wielu stronach przy współdzieleniu jednej pamięci podręcznej zawartości strony
Zwraca nil w razie niepowodzenia (Source nie jest Active, nieprawidłowy SourcePageIndex, OOM) Zgłasza EPdfError, gdy Source jest nil albo nie ma wartości Active
Wywołujący jest właścicielem zwróconego TPdfXObject i MUSI zwolnić go przed zamknięciem TEGO TPdf Destruktor wywołuje FPDF_CloseXObject, co czysto odłącza uchwyt od tego TPdf Po wstawieniu obiekt strony dodany do strony jest własnością strony, a nie XObjectu — zamknięcie XObjectu nie unieważnia już wstawionych obiektów strony
PageNumber TEGO TPdf — ustaw go przed wywołaniem InsertFormObjectFromXObjectSourcePageIndex jest liczony od zera (0 = pierwsza strona); PageNumber po stronie docelowej jest liczony od jedynki
uses FPdfMatrix;
var
Watermark: TPdf;
XObj: TPdfXObject;
PageObj: FPDF_PAGEOBJECT;
M: TPdfMatrix;
I: Integer;
begin
Watermark := TPdf.Create(nil);
try
Watermark.FileName := 'C:\Confidential.pdf';
Watermark.Active := True;
XObj := Pdf1.CreateXObjectFromPage(Watermark, 0);
try
for I := 1 to Pdf1.PageCount do
begin
Pdf1.PageNumber := I;
PageObj := Pdf1.InsertFormObjectFromXObject(XObj);
if PageObj = nil then Continue;
M := TPdfMatrix.Create;
try
M.Translate(100, 200);
M.Scale(0.5, 0.5);
FPDFPageObj_SetMatrix(PageObj, M.AsMatrix);
finally
M.Free;
end;
Pdf1.UpdatePage;
end;
finally
XObj.Free;
end;
finally
Watermark.Free;
end;
end;