function CreateXObjectFromPage(
Source : TPdf;
SourcePageIndex: Integer): TPdfXObject;
CreateXObjectFromPage создаёт повторно используемый дескриптор,
который позволяет одному TPdf повторно использовать страницу из
ДРУГОГО TPdf как штамп, водяной знак или шаблонное наложение
Внутри он оборачивает FPDF_NewXObjectFromPage
из PDFium и создаёт объект Pascal
TPdfXObject, который автоматически закрывает лежащий в основе
дескриптор FPDF_XOBJECT в своём деструкторе,
устраняя ручную церемонию FPDF_CloseXObject
Используйте его вместе с InsertFormObjectFromXObject, чтобы реально
поместить один экземпляр обёрнутой страницы на текущую страницу этого
документа. Каждый вызов вставляет новый FPDF_PAGEOBJECT, который можно
позиционировать, масштабировать и вращать через
FPDFPageObj_SetMatrix и вспомогательные средства
TPdfMatrix — так один и тот же XObject можно
размещать с разными размерами / поворотами / позициями на многих
страницах, разделяя единый кэш содержимого страницы
Возвращает nil при неудаче (Source не Active, недопустимый
SourcePageIndex, OOM). Вызывает
EPdfError, когда Source равен nil
или не Active
Вызывающий владеет возвращённым TPdfXObject и ОБЯЗАН освободить
его до закрытия ЭТОГО TPdf. Деструктор вызывает
FPDF_CloseXObject, который корректно отсоединяет
дескриптор от этого TPdf. После вставки объект страницы,
вставленный в страницу, принадлежит странице, а не XObject —
закрытие XObject не делает недействительными уже вставленные
объекты страницы
PageNumber ЭТОГО TPdf — установите его перед вызовом InsertFormObjectFromXObjectPageNumber у приёмника ведёт отсчёт от единицы
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;