function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage wytwarza uchwyt wielokrotnego użytku, który pozwala jednemu
TPdf ponownie użyć strony z INNEGO TPdf jako stempel, znak wodny lub
nakładkę szablonu. Wewnętrznie opakowuje
FPDF_NewXObjectFromPage z PDFium i tworzy
obiekt Pascala TPdfXObject, który zamyka bazowy
uchwyt FPDF_XOBJECT automatycznie w swoim destruktorze,
eliminując ręczne wywoływanie FPDF_CloseXObject
Połącz go z InsertFormObjectFromXObject, aby faktycznie
umieścić jedną instancję opakowanej strony na bieżącej stronie tego
dokumentu. Każde wywołanie wstawia nowy FPDF_PAGEOBJECT, który można
pozycjonować, skalować i obracać przez
FPDFPageObj_SetMatrix i pomocników
TPdfMatrix — dzięki temu ten sam XObject może być
umieszczany w wielu rozmiarach / rotacjach / położeniach na wielu stronach,
współdzielając jedną pamięć podręczną zawartości strony
Zwraca nil w przypadku niepowodzenia (Source nieaktywne, nieprawidłowy
SourcePageIndex, OOM). Zgłasza
EPdfError, gdy Source ma wartość nil
lub nie jest Active
Wywołujący jest właścicielem zwróconego TPdfXObject i MUSI go
zwolnić przed zamknięciem TEGO TPdf. Destruktor wywołuje
FPDF_CloseXObject, co czysto odłącza uchwyt od tego
TPdf. Po wstawieniu obiekt strony umieszczony na
stronie należy do strony, a nie do XObject — zamknięcie
XObject nie unieważnia już wstawionych obiektów strony
PageNumber TEGO TPdf — ustaw go przed wywołaniem InsertFormObjectFromXObjectPageNumber po stronie docelowej jest liczone 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;