PDFium Delphi Component Docs

CreateXObjectFromPage Метод

Компонент: TPdf  ·  Модуль: PDFium
Оборачивает страницу из другого TPdf как повторно используемый дескриптор Form XObject, который можно вставлять в этот документ сколько угодно раз

Syntax

function CreateXObjectFromPage(
  Source : TPdf;
  SourcePageIndex: Integer): TPdfXObject;

Description

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 не делает недействительными уже вставленные объекты страницы

Remarks

Example

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;

See Also

InsertFormObjectFromXObject, ImportPagesByIndex, AddPicture