function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage fabrica un identificador reutilizable que permite a un
TPdf reutilizar una página de OTRO TPdf como sello, marca de agua o
superposición de plantilla. Internamente envuelve
FPDF_NewXObjectFromPage de PDFium y produce un
objeto Pascal TPdfXObject que cierra el identificador
FPDF_XOBJECT subyacente automáticamente en su destructor,
eliminando la ceremonia manual de FPDF_CloseXObject
Combínelo con InsertFormObjectFromXObject para realmente
depositar una instancia de la página envuelta en la página actual de este
documento. Cada llamada inserta un FPDF_PAGEOBJECT nuevo que puede
posicionarse, escalarse y rotarse mediante
FPDFPageObj_SetMatrix y los
auxiliares de TPdfMatrix — de modo que el mismo XObject pueda
colocarse en múltiples tamaños / rotaciones / posiciones a lo largo de muchas páginas
compartiendo una sola caché de contenido de página
Devuelve nil en caso de falla (Source no está Active,
SourcePageIndex no válido, OOM). Genera
EPdfError cuando Source es nil
o no está Active
El llamador es propietario del TPdfXObject devuelto y DEBE liberarlo
antes de que ESTE TPdf se cierre. El destructor llama a
FPDF_CloseXObject, lo que desvincula limpiamente el identificador de este
TPdf. Después de la inserción, el objeto de página insertado en la
página pertenece a la página, no al XObject — cerrar el
XObject no invalida los objetos de página ya insertados
PageNumber de ESTE TPdf — establézcalo antes de llamar a InsertFormObjectFromXObjectPageNumber en el destino es basado en uno
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;