function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage は再利用可能なハンドルを作り出し、1 つの TPdf が「別の」TPdf のページを stamp、watermark、テンプレート overlay として使い回せるようにします。内部では PDFium の FPDF_NewXObjectFromPage をラップし、デストラクターで基底の FPDF_XOBJECT ハンドルを自動的に閉じる TPdfXObject の Pascal オブジェクトを生成するため、FPDF_CloseXObject を手動で呼ぶ儀式から解放されます
実際にラップしたページのインスタンスをこのドキュメントの現在ページへ落とし込むには、InsertFormObjectFromXObject と組み合わせます。呼び出しごとに新しい FPDF_PAGEOBJECT が挿入され、FPDFPageObj_SetMatrix と TPdfMatrix ヘルパーで位置・拡大率・回転を制御できます。同じ XObject を単一のページコンテンツキャッシュを共有したまま、複数ページにわたっていろいろなサイズ / 回転 / 位置で置けるわけです
失敗時は nil を返します(Source が Active でない、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;