function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage fabrica un manejador reutilizable que permite que un TPdf reutilice una página de OTRO TPdf como sello, marca de agua o plantilla superpuesta. Internamente envuelve FPDF_NewXObjectFromPage de PDFium y produce un objeto Pascal TPdfXObject que cierra el manejador FPDF_XOBJECT subyacente automáticamente en su destructor, eliminando la ceremonia manual de FPDF_CloseXObject
Combínelo con InsertFormObjectFromXObject para colocar realmente 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 a través de FPDFPageObj_SetMatrix y los auxiliares de TPdfMatrix, de modo que el mismo XObject pueda colocarse en múltiples tamaños / rotaciones / posiciones en muchas páginas mientras comparte una sola caché de contenido de página
Devuelve nil en caso de fallo (Source no activo, SourcePageIndex no válido, falta de memoria). Genera EPdfError cuando Source es nil o no está Active
El llamador es propietario del TPdfXObject devuelto y DEBE liberarlo antes de que se cierre ESTE TPdf. El destructor llama a FPDF_CloseXObject, que desacopla el manejador de este TPdf limpiamente. Después de la inserción, el objeto de página insertado en la página es propiedad de la página, no del 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 de base 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;