TPDFlibDynamicComponentSession

Postavitev strani, paginacija, tipi podatkov

Opis

Sestavi stanjsko komponento eno ciljno stran naenkrat, brez vnaprejšnje izgradnje vsebine za kasnejše strani Vsak poskus teče na klonu znotraj izoliranega Form XObject in potrdi klon šele, ko je validirana vsebina uspešno postavljena Razširjena postavitev lahko zavre prelivanje, odreže vsebino naravne velikosti ali jo sorazmerno pomanjša, hkrati pa jo poravna znotraj ciljne reže Politika paginacije lahko dovoli običajno razdeljevanje, prvi delni fragment preloži na sveže območje ali zahteva, da ostane celotna komponenta vidna, preden se karkoli potrdi Omejitve prostora toka lahko zavrnejo kratko območje, preden se komponenta pokliče, ali si po njenem zadnjem fragmentu prihranijo dovolj višine za naslednjo komponento Zavrnjen rezultat, spodletel risalni klic ali izjema povratnega klica odstranijo začasno stran, obnovijo klicateljem izbrano stran in pustijo tako ciljno vsebino kot trenutno stanje komponente nespremenjena Pripet primerek

TPDFlib ostane v lasti klicatelja in mora preživeti sejo

Deklaracija

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;

Pogodba komponente

Metode

CreatePripne knjižnico v lasti klicatelja in klonira podano komponento v neodvisna začetna in trenutna posnetka
AttachComponentAtomsko zamenja oba posnetka s kloni komponente v lasti klicatelja in počisti stanje zaključenosti
ResetObnovi nov trenutni klon iz začetnega posnetka in ponastavi števec uspešnih kompozicij
CloneCurrentComponentVrne klon v lasti klicatelja za pregled trenutnega potrjenega stanja komponente
CreateLayoutOptionsZgradi tipizirane nastavitve naravnega platna, prelivanja, poravnave, paginacije in prostora toka za razširjeno postavitev
ComposeNextSestavi eno režo strani, validira in postavi njen Form XObject, sprosti ročaj zajema in potrdi delovno stanje
ComposeNextLayoutSestavlja na nastavljenem naravnem platnu, uveljavi politiko prelivanja in poravnave ter vrne podatke vira, reže in končne preobrazbe

Prelivanje in postavitev

dopRejectZavrne vsebino, širšo ali višjo od reže, brez spreminjanja ciljne vsebine ali potrjenega stanja komponente
dopClipObdrži merilo 1 in preka odrezovalno pot strani s ciljno režo, preden se pokliče Form XObject
dopScaleDownUporabi manjše razmerje širine ali višine le, kadar je to potrebno, in vsebine nikoli ne poveča

Poravnava se razreši iz preoblikovanega uporabljenega pravokotnika, tako da sredinsko ali zaključno odrezana vsebina izbere ustrezni vidni del

Transform[M11 M12 M21 M22 MDX MDY]

SlotLeft poroča logično matriko razporeditve SlotTop iz krajevnih koordinat komponente v končne koordinate dokumenta od zgoraj navzdol SlotWidth, SlotHeight,

Pravila paginacije

dppAllowSplitOhrani privzeto obnašanje in potrdi vsak veljaven fragment, katerega povratni klic poroča še dodatno vsebino
dppKeepTogetherVrne PDF_DYNAMIC_COMPONENT_RETRY za prvi delni ali neviden poskus, nato pa dovoli razdeljevanje ali izbrano odrezovalno rezervno pot ob naslednjem veljavnem poskusu za isti nepotrjeni fragment
dppRequireCompleteVrne PDF_DYNAMIC_COMPONENT_RETRY, dokler povratni klic ne poroča brez preostale vsebine in celoten uporabljen pravokotnik bodisi prilega reži bodisi ostane viden skozi sorazmerno pomanjšanje

Placement

KeepTogetherRetryPending Reset prepozna enkratno rezervno stanje in se počisti po uspešni potrditvi, AttachComponent ali

Omejitve prostora pretoka

MinimumSlotHeightVrne PDF_DYNAMIC_COMPONENT_RETRY, preden klonira ali pokliče komponento, kadar je ciljna reža krajša od nastavljene višine
MinimumFollowingHeightUveljavi se le na zadnji vsebinski fragment in zahteva, da se njegova razrešena višina skupaj s prihranjeno višino sledenja prilega reži

Ponovni poskus za višino sledenja opusti izoliran poskus, hkrati pa ohrani prej potrjene fragmente, tako da se lahko naslov, oznaka ali kratek uvod premakne s prvo uporabno regijo naslednje komponente

LastRetryReason razlikuje ponovne poskuse cele komponente, stroge zaključenosti, najmanjše reže in prostora sledenja, LastRequiredSlotHeight pa poroča znano zahtevano višino za omejitve prostora toka Preverjanje najmanjše reže teče pred kloniranjem komponente in zajemom Form, tako da večkrat zavrnjena kratka območja ne povzročijo stroškov povratnega klica komponente ali začasne strani

Vrnjene vrednosti

PDF_DYNAMIC_COMPONENT_ERRORZahteva, povratni klic komponente, geometrija rezultata ali postavitev Form ni uspela in nobeno stanje ni bilo potrjeno
PDF_DYNAMIC_COMPONENT_MOREVsebina je bila potrjena in komponenta je zahtevala še eno režo strani
PDF_DYNAMIC_COMPONENT_COMPLETEKomponenta je zaključila ali je bila seja že prej dokončana in povratni klic ni bil opravljen
PDF_DYNAMIC_COMPONENT_RETRYIzbrana politika paginacije ali prostora toka je preložila postavitev, brez potrjevanja vsebine ali stanja

Primer

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;

Glejte tudi

BeginFormXObject, ReleaseCapturedPage, ApplyRepeatedPageFragment