function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage 生成一个可重用句柄,允许一个
TPdf 将另一个 TPdf 中的页面作为图章、水印或
模板叠加层重用。内部它封装 PDFium 的
FPDF_NewXObjectFromPage,并生成一个
TPdfXObject Pascal 对象,该对象在其析构函数中自动关闭底层
FPDF_XOBJECT 句柄,
免去手动 FPDF_CloseXObject 的繁琐
将其与 InsertFormObjectFromXObject 配合使用,即可
将被包装页面的一个实例实际放入本文档的当前页面。
每次调用都会插入一个新的 FPDF_PAGEOBJECT,可以通过
FPDFPageObj_SetMatrix 和
TPdfMatrix 辅助工具对其进行定位、缩放和旋转 — 因此同一个 XObject 可以
在许多页面上以多种尺寸 / 旋转 / 位置放置,
同时共享单个页面内容缓存
失败时返回 nil(Source 未激活、无效的
SourcePageIndex、OOM)。当 Source 为 nil
或未 Active 时抛出
EPdfError
调用方拥有返回的 TPdfXObject,并且必须在关闭此 TPdf 之前
释放它。析构函数调用
FPDF_CloseXObject,它会干净地将句柄从此
TPdf 分离。插入后,插入到页面中的页面对象
由页面拥有,而非 XObject — 关闭
XObject 不会使已经插入的页面对象失效
PageNumber 标识 — 在调用 InsertFormObjectFromXObject 之前设置它PageNumber 基于 1
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;