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 غير نشطة أو
SourcePageIndex غير صالح أو OOM). وترفع
EPdfError عندما تكون Source تساوي nil
أو غير Active.
المستدعي يملك TPdfXObject المُرجَع وعليه واجب تحريره
قبل إغلاق TPdf هذه. ويستدعي المدمّر
FPDF_CloseXObject الذي يفصل المقبض عن
TPdf هذه بأمان. وبعد الإدراج يصبح كائن الصفحة المدرج في
الصفحة مملوكًا للصفحة لا للـ XObject — فإغلاق
XObject لا يبطل كائنات الصفحة المدرجة سابقًا.
PageNumber الخاصة بـ TPdf هذه — فاضبطها قبل استدعاء InsertFormObjectFromXObject.PageNumber على الهدف فيبدأ من الواحد.
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;