Deklarativt layout-DOM
HPDFLayoutDOM bygger genanvendelige dokumentkomponenter oven på THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, ejede overløbsfragmenter og ImmediateFlushLayout
Dokument- og sektionssammensætning
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 ejer sine sektioner, hver THPDFDOMSection ejer sin brødtekst, sit sidehoved, sin sidefod og sin stil, og hver stak eller container ejer de komponenter, der er knyttet til den
THPDFDOMRenderer.Render starter og afslutter måldokumentet, opretter en ny side for hver ny sektion, gentager sektionsinventar på fortsættelsessider og returnerer statistik for side, placering, opdeling, inventar, struktur, markeret indhold, artefakt og maksimal fortsættelse
Angiv alle THotPDF-indstillinger for output, komprimering, konformitet, lag og øjeblikkelig flush før kaldet til Render
GenerateStructure er som standard True, så rendereren også bygger et fortsættelsessikkert logisk strukturtræ og bruger THPDFDOMDocument.Language, når målet ikke har noget sprog
Komponenter
THPDFDOMTextombryder Unicode-tekst, cacher linjegrænser efter bredde og nedarvede tekstmetrikker og opdeler gennem kilde-tegnområder uden at kopiere kildetekstenTHPDFDOMSpacerreserverer lodret plads og kan opdeles på tværs af siderTHPDFDOMStackarrangerer ejede børn lodret med nedarvet indvendig margen og afstandTHPDFDOMContainertilføjer en formateret boks omkring ét ejet barn og videresender opdelt fortsættelseTHPDFDOMTableopløser vægtede kolonner, tegner formaterede rækker og celler og gentager førende overskriftsrækker på fortsættelsessiderTHPDFDOMListopretter nummererede eller unummererede listeelementer med etiket- og brødtekstkomponenterTHPDFDOMImageejer en klonet grafik, opløser eksplicitte dimensioner og leverer figursemanik og komprimeringsstyring
Alle komponenter eksponerer stabile kontrakter for Name, Path, Style, Clone, Measure, Draw og Split samt semantisk rolle, sprog, alternativ tekst, erstatningstekst, udvidelsestekst og artefaktoverrides
Gennemløb af brødtekst på øverste niveau er lineært og kloner ikke komponenter; tekst- og tabelfortsættelser bevarer område- eller rækkeskivemetadata i stedet for at kopiere hele indholdstræet
Stilarv
THPDFDOMStyle opløser skrifttypenavn, størrelse, typografier, tekstfarve, baggrund, kant, indvendig margen, afstand og linjehøjde gennem sin overordnede kæde
En sektionsstil er overordnet for dens brødtekst og inventar, en stak- eller containerstil er overordnet for dens børn, og tabelstil flyder gennem rækker til celler
Kun eksplicit tildelte værdier tilsidesætter den overordnede; Clear fjerner lokale tildelinger og den overordnede forbindelse, mens Assign kopierer lokale tildelinger uden at kopiere ejerskab eller afstamning
Overordnede kæder dybere end 64 niveauer afvises som cykliske eller ubegrænsede
Genanvendelige komponentfabrikker
THPDFDOMComponentFactory er en anonym funktion, som opretter én kalder-ejet THPDFDOMComponent-instans pr. kald
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));Fabriksnavne er unikke uden forskel på store og små bogstaver, hvert kald skal returnere en ny komponentinstans, og den modtagende container overtager ejerskabet efter Add
Brug SetHeaderClone, SetFooterClone eller Clone, når én deklareret komponent skal genbruges på flere ejerskabssteder
Tabeller med gentaget overskrift
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);Overskriftsrækker skal være sammenhængende og gå forud for brødtekstrækker, positive kolonnevægte fordeler den tilgængelige bredde, og rækkehøjder er eksplicitte positive værdier
Når RepeatHeaders er true, kræver en opdeling plads til alle førende overskriftsrækker og mindst én brødtekstrække, hvilket forhindrer fortsættelsessider med kun overskrift
Paginering og fejlgrænser
Rendereren måler først hver komponent igen mod det resterende brødtekst-rektangel, flytter et udeleligt minimumsfragment til en ny side, når det er muligt, og delegerer hver gyldig opdeling til PlaceLayoutElement
Et element, der ikke kan være på en tom brødtekstside, rejser en undtagelse med sin stabile elementsti i stedet for stiltiende at kassere indhold
MaximumContinuationDepth er som standard 100.000 og begrænser fejldannede komponenter, der gentagne gange returnerer en fortsættelse uden fremskridt
Sektionens sidedimensioner skal være positive, margener og afstande til inventar kan ikke være negative, og geometri for sidehoved plus sidefod skal efterlade et positivt brødtekst-rektangel
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 genererede HPDFLayoutDOM.hpp eksponerer de samme dokument-, stil-, komponent-, tabel-, sektions-, renderer- og statistikflader