TPDFlibDynamicComponentSession

چیدمان صفحه، صفحه‌بندی، انواع داده

توضیحات

یک مؤلفه حالت‌مند را هر بار روی یک صفحه مقصد ترکیب می‌کند بدون آنکه محتوای صفحه‌های بعدی را از پیش بسازد هر تلاش روی یک کلون درون یک Form XObject مجزا اجرا می‌شود و کلون تنها پس از جای‌گذاری موفق محتوای اعتبارسنجی‌شده ثبت می‌گردد جای‌گذاری گسترش‌یافته می‌تواند سرریز را رد کند، محتوای با اندازه طبیعی را برش دهد یا آن را متناسب کوچک کند، هم‌زمان با ترازکردنش در جایگاه مقصد سیاست صفحه‌بندی می‌تواند شکافتن عادی را مجاز کند، نخستین قطعه ناقص را به ناحیه‌ای تازه مؤخر کند یا الزام کند کل مؤلفه پیش از ثبت هر چیزی مرئی بماند قیدهای فضای جریان می‌توانند ناحیه کوتاه را پیش از فراخوانی مؤلفه رد کنند یا پس از آخرین قطعه‌اش ارتفاع کافی برای مؤلفه بعدی رزرو کنند نتیجه ردشده، فراخوانی رسم ناموفق یا استثنای callback، صفحه موقت را حذف، صفحه برگزیده فراخوان را بازمی‌گرداند و محتوای مقصد و حالت جاری مؤلفه را بدون تغییر می‌گذارد نمونه

TPDFlib متصل‌شده مالکش فراخوان است و باید از نشست طولانی‌تر زندگی کند

اعلان

const
  PDF_DYNAMIC_COMPONENT_ERROR = 0;
  PDF_DYNAMIC_COMPONENT_MORE = 1;
  PDF_DYNAMIC_COMPONENT_COMPLETE = 2;
  PDF_DYNAMIC_COMPONENT_RETRY = 3;

type
  TPDFlibDynamicPageContext = record
    LibraryInstance: TPDFlib;
    PageNumber: Integer;
    CompositionIndex: Integer;
    DestinationLeft: Double;
    DestinationTop: Double;
    AvailableWidth: Double;
    AvailableHeight: Double;
  end;

  TPDFlibDynamicPageResult = record
    HasContent: Boolean;
    HasMoreContent: Boolean;
    UsedWidth: Double;
    UsedHeight: Double;
  end;

  TPDFlibDynamicOverflowPolicy = (dopReject, dopClip, dopScaleDown);
  TPDFlibDynamicHorizontalAlignment = (dhaLeft, dhaCenter, dhaRight);
  TPDFlibDynamicVerticalAlignment = (dvaTop, dvaCenter, dvaBottom);
  TPDFlibDynamicPaginationPolicy = (dppAllowSplit, dppKeepTogether,
    dppRequireComplete);
  TPDFlibDynamicRetryReason = (drrNone, drrKeepTogether,
    drrRequireComplete, drrMinimumSlotHeight, drrMinimumFollowingHeight);

  TPDFlibDynamicLayoutOptions = record
    ContentWidth: Double;
    ContentHeight: Double;
    OverflowPolicy: TPDFlibDynamicOverflowPolicy;
    HorizontalAlignment: TPDFlibDynamicHorizontalAlignment;
    VerticalAlignment: TPDFlibDynamicVerticalAlignment;
    PaginationPolicy: TPDFlibDynamicPaginationPolicy;
    MinimumSlotHeight: Double;
    MinimumFollowingHeight: Double;
  end;

  TPDFlibDynamicPlacementTransform = record
    M11, M12, M21, M22, MDX, MDY: Double;
  end;

  TPDFlibDynamicPagePlacement = record
    PageNumber: Integer;
    CompositionIndex: Integer;
    Left: Double;
    Top: Double;
    Width: Double;
    Height: Double;
    HasContent: Boolean;
    HasMoreContent: Boolean;
    SourceWidth: Double;
    SourceHeight: Double;
    SlotLeft: Double;
    SlotTop: Double;
    SlotWidth: Double;
    SlotHeight: Double;
    Transform: TPDFlibDynamicPlacementTransform;
    WasClipped: Boolean;
    WasScaled: Boolean;
  end;

  TPDFlibDynamicComponent = class
  public
    function CloneComponent: TPDFlibDynamicComponent; virtual; abstract;
    function Compose(const Context: TPDFlibDynamicPageContext;
      out ComposeResult: TPDFlibDynamicPageResult): Integer; virtual; abstract;
  end;

  TPDFlibDynamicComponentSession = class
  private
    FLibrary: TPDFlib;
    FCompositionCount: Integer;
    FCompleted: Boolean;
    FKeepTogetherRetryPending: Boolean;
    FLastRetryReason: TPDFlibDynamicRetryReason;
    FLastRequiredSlotHeight: Double;
  public
    constructor Create(ALibrary: TPDFlib;
      AComponent: TPDFlibDynamicComponent);
    function AttachComponent(AComponent: TPDFlibDynamicComponent): Integer;
    function Reset: Integer;
    function CloneCurrentComponent: TPDFlibDynamicComponent;
    class function CreateLayoutOptions(ContentWidth, ContentHeight: Double;
      OverflowPolicy: TPDFlibDynamicOverflowPolicy = dopReject;
      HorizontalAlignment: TPDFlibDynamicHorizontalAlignment = dhaLeft;
      VerticalAlignment: TPDFlibDynamicVerticalAlignment = dvaTop;
      PaginationPolicy: TPDFlibDynamicPaginationPolicy = dppAllowSplit;
      MinimumSlotHeight: Double = 0;
      MinimumFollowingHeight: Double = 0):
      TPDFlibDynamicLayoutOptions; static;
    function ComposeNext(Page: Integer; Left, Top, Width, Height: Double;
      out Placement: TPDFlibDynamicPagePlacement): Integer;
    function ComposeNextLayout(Page: Integer; SlotLeft, SlotTop, SlotWidth,
      SlotHeight: Double; const Options: TPDFlibDynamicLayoutOptions;
      out Placement: TPDFlibDynamicPagePlacement): Integer;
    property LibraryInstance: TPDFlib read FLibrary;
    property CompositionCount: Integer read FCompositionCount;
    property Completed: Boolean read FCompleted;
    property KeepTogetherRetryPending: Boolean
      read FKeepTogetherRetryPending;
    property LastRetryReason: TPDFlibDynamicRetryReason read FLastRetryReason;
    property LastRequiredSlotHeight: Double read FLastRequiredSlotHeight;
  end;

قرارداد مؤلفه

متدها

Createکتابخانه‌ای مال فراخوان متصل می‌کند و مؤلفه داده‌شده را به تصاویر لحظه‌ای آغازین و جاری مستقل کلون می‌کند
AttachComponentهر دو تصویر لحظه‌ای را به‌صورت اتمی با کلون‌های مؤلفه‌ای مال فراخوان جایگزین و حالت تکمیل را پاک می‌کند
Resetیک کلون جاری جدید را از تصویر لحظه‌ای آغازین بازمی‌گرداند و شمارش ترکیب‌های موفق را بازنشانی می‌کند
CloneCurrentComponentکلونی مال فراخوان برای بررسی حالت مؤلفه ثبت‌شده جاری برمی‌گرداند
CreateLayoutOptionsتنظیمات نوع‌دار بوم طبیعی، سرریز، تراز، صفحه‌بندی و فضای جریان را برای جای‌گذاری گسترش‌یافته می‌سازد
ComposeNextیک جایگاه صفحه را ترکیب، Form XObject آن را اعتبارسنجی و جای‌گذاری، دستگیره گرفته‌شده را آزاد و حالت کاری را ثبت می‌کند
ComposeNextLayoutروی بوم طبیعی پیکربندی‌شده ترکیب می‌کند، سیاست سرریز و تراز را اعمال و داده‌های مبدأ، جایگاه و تبدیل نهایی را برمی‌گرداند

سرریز و جای‌گذاری

dopRejectمحتوایی پهن‌تر یا بلندتر از جایگاه را بدون تغییر محتوای مقصد یا حالت ثبت‌شده مؤلفه رد می‌کند
dopClipمقیاس 1 را نگه می‌دارد و پیش از فراخوانی Form XObject، مسیر برش صفحه را با جایگاه مقصد اشتراک می‌گیرد
dopScaleDownنسبت کوچک‌تر عرض یا ارتفاع را تنها در صورت نیاز به کار می‌برد و هرگز محتوا را بزرگ نمی‌کند

تراز از مستطیل استفاده‌شده تبدیل‌شده حل می‌شود، بنابراین محتوای برش‌خورده وسط‌چین یا انتهایی، بخش مرئی متناظر را برمی‌گزیند

Transform[M11 M12 M21 M22 MDX MDY]

SlotLeft ماتریس چیدمان منطقی SlotTop را از مختصات محلی مؤلفه به مختصات نهایی بالا‌به‌پایین سند گزارش می‌کند SlotWidth، SlotHeight،

سیاست‌های صفحه‌بندی

dppAllowSplitرفتار پیش‌فرض را حفظ و هر قطعه معتبری را که callback آن محتوای بیشتری را گزارش کند ثبت می‌کند
dppKeepTogetherبرای نخستین آزمایش ناقص یا نامرئی PDF_DYNAMIC_COMPONENT_RETRY برمی‌گرداند، سپس در تلاش معتبر بعدی برای همان قطعه ثبت‌نشده، شکافتن یا fallback برش انتخاب‌شده را مجاز می‌کند
dppRequireCompleteتا زمانی که callback محتوای باقی‌مانده‌ای را گزارش کند و مستطیل استفاده‌شده کامل یا در جایگاه جا شود یا از طریق کوچک‌سازی متناسب مرئی بماند، PDF_DYNAMIC_COMPONENT_RETRY برمی‌گرداند

Placement

KeepTogetherRetryPending را برمی‌گرداند Reset حالت fallback یک‌باره را شناسایی می‌کند و پس از یک ثبت موفق، AttachComponent یا

محدودیت‌های فضای جریان

MinimumSlotHeightپیش از کلون‌کردن یا فراخوانی مؤلفه، وقتی جایگاه مقصد کوتاه‌تر از ارتفاع پیکربندی‌شده است PDF_DYNAMIC_COMPONENT_RETRY برمی‌گرداند
MinimumFollowingHeightتنها بر قطعه محتوای نهایی اعمال می‌شود و می‌خواهد ارتفاع حل‌شده‌اش به‌علاوه ارتفاع رزروشده بعدی در جایگاه جا شود

یک تلاش مجدد ارتفاع بعدی، آزمایش مجزا را دور می‌ریزد در حالی که قطعه‌های ثبت‌شده پیشین را حفظ می‌کند و امکان می‌دهد یک عنوان، برچسب یا مقدمه کوتاه با نخستین ناحیه قابل‌استفاده مؤلفه بعدی حرکت کند

LastRetryReason تلاش‌های مجدد کل‌مؤلفه، تکمیل سخت‌گیرانه، حداقل‌جایگاه و فضای بعدی را متمایز می‌کند، در حالی که LastRequiredSlotHeight ارتفاع لازم شناخته‌شده برای قیدهای فضای جریان را گزارش می‌کند بررسی حداقل‌جایگاه پیش از کلون‌گیری مؤلفه و گرفتن Form اجرا می‌شود، بنابراین نواحی کوتاه مکرراً ردشده هیچ هزینه callback مؤلفه یا صفحه موقتی ندارند

مقادیر بازگشتی

PDF_DYNAMIC_COMPONENT_ERRORدرخواست، callback مؤلفه، هندسه نتیجه یا جای‌گذاری Form شکست خورد و هیچ حالتی ثبت نشد
PDF_DYNAMIC_COMPONENT_MOREمحتوا ثبت شد و مؤلفه جایگاه صفحه دیگری را درخواست کرد
PDF_DYNAMIC_COMPONENT_COMPLETEمؤلفه کامل شد، یا نشست از قبل کامل بود و callbackی انجام نشد
PDF_DYNAMIC_COMPONENT_RETRYسیاست صفحه‌بندی یا فضای جریان انتخاب‌شده جای‌گذاری را بدون ثبت محتوا یا حالت به تعویق انداخت

مثال

type
  TNumberedPagesComponent = class(TPDFlibDynamicComponent)
  private
    FNextPage: Integer;
    FPageCount: Integer;
  public
    constructor Create(ANextPage, APageCount: Integer);
    function CloneComponent: TPDFlibDynamicComponent; override;
    function Compose(const Context: TPDFlibDynamicPageContext;
      out ComposeResult: TPDFlibDynamicPageResult): Integer; override;
  end;

constructor TNumberedPagesComponent.Create(ANextPage, APageCount: Integer);
begin
  inherited Create;
  FNextPage := ANextPage;
  FPageCount := APageCount;
end;

function TNumberedPagesComponent.CloneComponent: TPDFlibDynamicComponent;
begin
  Result := TNumberedPagesComponent.Create(FNextPage, FPageCount);
end;

function TNumberedPagesComponent.Compose(
  const Context: TPDFlibDynamicPageContext;
  out ComposeResult: TPDFlibDynamicPageResult): Integer;
begin
  Context.LibraryInstance.DrawText(0, 0, IntToStr(FNextPage));
  Inc(FNextPage);
  ComposeResult.HasContent := True;
  ComposeResult.HasMoreContent := FNextPage <= FPageCount;
  ComposeResult.UsedWidth := Context.AvailableWidth;
  ComposeResult.UsedHeight := 24;
  Result := 1;
end;

Template := TNumberedPagesComponent.Create(1, 10);
try
  Session := TPDFlibDynamicComponentSession.Create(PDF, Template);
  try
    repeat
      Status := Session.ComposeNext(PageNumber, 36, 36, 540, 720,
        Placement);
      if Status = PDF_DYNAMIC_COMPONENT_MORE then
        PageNumber := PDF.NewPage;
    until Status <> PDF_DYNAMIC_COMPONENT_MORE;
  finally
    Session.Free;
  end;
finally
  Template.Free;
end;

همچنین ببینید

BeginFormXObject, ReleaseCapturedPage, ApplyRepeatedPageFragment