function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage fabrica um handle reutilizável que permite a um
TPdf reutilizar uma página de OUTRO TPdf como carimbo, marca d'água ou
sobreposição de modelo. Internamente, encapsula o
FPDF_NewXObjectFromPage do PDFium e produz um
objeto Pascal TPdfXObject que fecha o handle
FPDF_XOBJECT subjacente automaticamente em seu destrutor,
eliminando a cerimônia manual de FPDF_CloseXObject.
Combine-o com InsertFormObjectFromXObject para efetivamente
soltar uma instância da página encapsulada na página atual deste
documento. Cada chamada insere um novo FPDF_PAGEOBJECT que pode ser
posicionado, escalado e rotacionado por meio de
FPDFPageObj_SetMatrix e dos
auxiliares de TPdfMatrix — assim, o mesmo XObject pode ser
colocado em múltiplos tamanhos / rotações / posições ao longo de muitas páginas
enquanto compartilha um único cache de conteúdo de página.
Retorna nil em caso de falha (Source não ativo,
SourcePageIndex inválido, OOM). Gera
EPdfError quando Source é nil
ou não está Active.
O chamador é proprietário do TPdfXObject retornado e DEVE liberá-lo
antes que ESTE TPdf seja fechado. O destrutor chama
FPDF_CloseXObject, que desanexa o handle deste
TPdf de forma limpa. Após a inserção, o objeto de página inserido na
página pertence à página, não ao XObject — fechar o
XObject não invalida objetos de página já inseridos.
PageNumber DESTE TPdf — defina-o antes de chamar InsertFormObjectFromXObject.PageNumber no destino é baseado em um.
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;