Deklarativt layout-DOM
HPDFLayoutDOM bygger gjenbrukbare dokumentkomponenter over THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, eide overløpsfragmenter og ImmediateFlushLayout
Dokument- og seksjonskomposisjon
Document := THPDFDOMDocument.Create;
Renderer := THPDFDOMRenderer.Create;
try
Section := Document.AddSection;
Section.PageWidth := 595.28;
Section.PageHeight := 841.89;
Section.Header := THPDFDOMText.Create('Quarterly report');
Section.Footer := THPDFDOMText.Create('Confidential');
Section.Body.Style.Padding := 12;
Section.Body.Style.Spacing := 8;
Section.Body.AddText(BodyText, 'Narrative');
PDF.OutputStream := Output;
PDF.ImmediateFlushLayout := True;
Statistics := Renderer.Render(Document, PDF);
finally
Renderer.Free;
Document.Free;
end;
THPDFDOMDocument eier sine seksjoner, hver THPDFDOMSection eier sin kropp, topptekst, bunntekst og stil, og hver stakk eller beholder eier komponentene som er festet til den
THPDFDOMRenderer.Render starter og avslutter måldokumentet, oppretter en fersk side for hver nye seksjon, gjentar seksjonsmøbler på fortsettelsessider og returnerer statistikk for side, plassering, deling, møbler, struktur, merket innhold, artefakt og maksimum fortsettelse
Sett alle THotPDF-utdata-, komprimerings-, konformans-, lag- og umiddelbar-flush-alternativer før du kaller Render
GenerateStructure er som standard True, så rendereren bygger også et fortsettelsesikkert logisk strukturtre og bruker THPDFDOMDocument.Language når målet ikke har noe språk
Komponenter
THPDFDOMTextomslutter Unicode-tekst, hurtigbuffer linjegrenser etter bredde og nedarvet tekstmetrikk, og deler gjennom kilde-tegnområder uten å kopiere kildetekstenTHPDFDOMSpacerreserverer vertikalt rom og kan deles på tvers av siderTHPDFDOMStacklegger ut eide barn vertikalt med nedarvet utfylling og mellomromTHPDFDOMContainerlegger til en stilet boks rundt ett eid barn og videresender delings-fortsettelseerTHPDFDOMTableløser vektede kolonner, tegner stilte rader og celler, og gjentar ledende topptekst-rader på fortsettelsessiderTHPDFDOMListoppretter nummererte eller unummererte listeelementer med etikett- og kroppskomponenterTHPDFDOMImageeier en klonet grafikk, løser eksplisitte dimensjoner og gir figur-semantikk og komprimeringskontroll
Alle komponenter eksponerer stabile Name, Path, Style, Clone, Measure, Draw og Split-kontrakter samt semantisk rolle, språk, alternativ tekst, erstatningstekst, utvidelsestekst og artefakt-overstyringer
Kroppstraversering på toppnivå er lineær og kloner ikke komponenter; tekst- og tabellfortsettelseer beholder tegnområde- eller radskive-metadata i stedet for å kopiere hele innholdstreet
Stilarv
THPDFDOMStyle løser fontnavn, størrelse, stiler, tekstfarge, bakgrunn, kant, utfylling, mellomrom og linjehøyde gjennom sin overordnede kjede
En seksjonsstil er forelder til sin kropp og møbler, en stakk- eller beholderstil er forelder til sine barn, og tabellstil flyter gjennom rader til celler
Bare eksplisitt tildelte verdier overstyrer forelderen; Clear fjerner lokale tildelinger og foreldrekoblingen, mens Assign kopierer lokale tildelinger uten å kopiere eierskap eller slektskap
Foreldre-kjeder dypere enn 64 nivåer avvises som sykliske eller ubegrensede
Fabrikker for gjenbrukbare komponenter
THPDFDOMComponentFactory er en anonym funksjon som oppretter én kaller-eid THPDFDOMComponent-instans per påkalling
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Fabrikknavn er uten skille på store og små bokstaver og unike, hvert kall må returnere en ny komponentinstans, og den mottakende beholderen tar eierskap etter Add
Bruk SetHeaderClone, SetFooterClone eller Clone når én deklarert komponent må gjenbrukes på flere eierskapssteder
Tabeller med gjentatt topptekst
Table := THPDFDOMTable.Create('Orders');
Table.AddColumn(1);
Table.AddColumn(3);
Header := Table.AddRow(18, True);
Header[0].Text := 'ID';
Header[1].Text := 'Description';
Row := Table.AddRow(22);
Row[0].Text := '1001';
Row[1].Text := 'Bounded streaming layout';
Section.Body.Add(Table);
Topptekst-rader må være sammenhengende og gå foran kroppsrader, positive kolonnevekter deler tilgjengelig bredde, og radehøyder er eksplisitte positive verdier
Når RepeatHeaders er sann, krever en deling rom for alle ledende topptekst-rader og minst én kroppsrad, noe som forhindrer fortsettelsesside som bare er topptekst
Paginering og feilgrenser
Rendereren remåler først hver komponent mot gjenværende kroppsrektangel, flytter et udelbart minimumsfragment til en fersk side når mulig, og delegerer enhver gyldig deling til PlaceLayoutElement
Et element som ikke får plass på en tom kroppsside reiser et unntak med sin stabile elementbane i stedet for stille å forkaste innhold
MaximumContinuationDepth er som standard 100 000 og avgrenser feilformede komponenter som gjentatte ganger returnerer en ikke-bidragende fortsettelse
Seksjons-sideilimensjoner må være positive, marger og møbel-avstander kan ikke være negative, og topptekst pluss bunntekst-geometri må etterlate et positivt kroppsrektangel
C++Builder
std::unique_ptr<THPDFDOMDocument> document(new THPDFDOMDocument());
THPDFDOMSection* section = document->AddSection();
section->Header = new THPDFDOMText(L"Report", "Header");
section->Body->AddText(L"Declarative content", "BodyText");
std::unique_ptr<THPDFDOMRenderer> renderer(new THPDFDOMRenderer());
THPDFDOMRenderStatistics statistics =
renderer->Render(document.get(), pdf.get());
Den genererte HPDFLayoutDOM.hpp eksporterer de samme dokument-, stil-, komponent-, tabell-, seksjons-, renderer- og statistikk-overflatene