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
CloneComponentvrne klicatelju neodvisno kopijo celotnega spremenljivega stanja paginacijeComposeriše skoziContext.LibraryInstancev krajevnih koordinatah Form, katerih razpoložljiva velikost jeAvailableWidthkratAvailableHeightPageNumberprepozna ciljno stran, tudi če knjižnica med izvajanjem povratnega klica izbere izolirano začasno stran- Povratni klic sme uporabiti API-je risanja in vsebine, ne sme pa spreminjati dokumentov, strani ali ugnezdjenih risalnih vsebnikov
- Vsebinski rezultati zahtevajo končne pozitivne vrednosti
UsedWidthinUsedHeightznotraj vsebinskega platna - Uporabljen pravokotnik se začne v krajevni koordinati nič in naj meji vso vidno vsebino komponente
- Rezultat brez vsebine je veljaven le, kadar je
HasMoreContentFalsein sta obe uporabljeni dimenziji nič - Vrnjena ničla zavrne poskus; sprožene izjeme se razširijo, potem ko je bilo začasno stanje počiščeno
Metode
| Create | Pripne knjižnico v lasti klicatelja in klonira podano komponento v neodvisna začetna in trenutna posnetka |
|---|---|
| AttachComponent | Atomsko zamenja oba posnetka s kloni komponente v lasti klicatelja in počisti stanje zaključenosti |
| Reset | Obnovi nov trenutni klon iz začetnega posnetka in ponastavi števec uspešnih kompozicij |
| CloneCurrentComponent | Vrne klon v lasti klicatelja za pregled trenutnega potrjenega stanja komponente |
| CreateLayoutOptions | Zgradi tipizirane nastavitve naravnega platna, prelivanja, poravnave, paginacije in prostora toka za razširjeno postavitev |
| ComposeNext | Sestavi eno režo strani, validira in postavi njen Form XObject, sprosti ročaj zajema in potrdi delovno stanje |
| ComposeNextLayout | Sestavlja na nastavljenem naravnem platnu, uveljavi politiko prelivanja in poravnave ter vrne podatke vira, reže in končne preobrazbe |
Prelivanje in postavitev
dopReject | Zavrne vsebino, širšo ali višjo od reže, brez spreminjanja ciljne vsebine ali potrjenega stanja komponente |
|---|---|
dopClip | Obdrži merilo 1 in preka odrezovalno pot strani s ciljno režo, preden se pokliče Form XObject |
dopScaleDown | Uporabi 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
dppAllowSplit | Ohrani privzeto obnašanje in potrdi vsak veljaven fragment, katerega povratni klic poroča še dodatno vsebino |
|---|---|
dppKeepTogether | Vrne 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 |
dppRequireComplete | Vrne 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
MinimumSlotHeight | Vrne PDF_DYNAMIC_COMPONENT_RETRY, preden klonira ali pokliče komponento, kadar je ciljna reža krajša od nastavljene višine |
|---|---|
MinimumFollowingHeight | Uveljavi 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_ERROR | Zahteva, povratni klic komponente, geometrija rezultata ali postavitev Form ni uspela in nobeno stanje ni bilo potrjeno |
|---|---|
PDF_DYNAMIC_COMPONENT_MORE | Vsebina je bila potrjena in komponenta je zahtevala še eno režo strani |
PDF_DYNAMIC_COMPONENT_COMPLETE | Komponenta je zaključila ali je bila seja že prej dokončana in povratni klic ni bil opravljen |
PDF_DYNAMIC_COMPONENT_RETRY | Izbrana 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