function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage는 한 TPdf가 다른 TPdf의 page를 stamp, watermark, template overlay로 재사용할 수 있게 해 주는 재사용 가능한 handle을 만듭니다. 내부적으로 PDFium의 FPDF_NewXObjectFromPage를 감싸며, 하위 FPDF_XOBJECT handle을 destructor에서 자동으로 닫는 TPdfXObject Pascal object를 생성해 수동 FPDF_CloseXObject 처리를 없앱니다
InsertFormObjectFromXObject와 함께 사용하면 감싼 page의 인스턴스 하나를 이 문서의 현재 page에 실제로 넣을 수 있습니다. 호출할 때마다 새 FPDF_PAGEOBJECT가 삽입되며, FPDFPageObj_SetMatrix와 TPdfMatrix helper를 통해 위치, 크기, 회전을 바꿀 수 있습니다. 그래서 같은 XObject를 여러 page에 걸쳐 서로 다른 크기 / 회전 / 위치로 놓으면서 하나의 page-content cache를 공유할 수 있습니다
실패하면 nil을 반환합니다(Source가 Active가 아님, SourcePageIndex가 잘못됨, OOM). Source가 nil이거나 Active가 아니면 EPdfError를 발생시킵니다
호출자는 반환된 TPdfXObject를 소유하며, 이 TPdf가 닫히기 전에 반드시 해제해야 합니다. destructor는 FPDF_CloseXObject를 호출해 handle을 이
TPdf cleanly. After insertion the page object inserted into the
page is owned by the page, not by the XObject — closing the
XObject does not invalidate already-inserted page objects.
PageNumber — set it before calling InsertFormObjectFromXObject.PageNumber on the destination is one-based.
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;