Deklarativni DOM rasporeda
HPDFLayoutDOM gradi komponente dokumenta koje se ponovo koriste preko THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, vlasničkih fragmenata prekoračenja i ImmediateFlushLayout
Kompozicija dokumenta i sekcije
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 poseduje svoje sekcije, svaki THPDFDOMSection poseduje svoje telo, zaglavlje, podnožje i stil, a svaki stek ili kontejner poseduje komponente prikačene na njega
THPDFDOMRenderer.Render počinje i završava ciljni dokument, formira svežu stranicu za svaku novu sekciju, ponavlja nameštaj sekcije na stranicama nastavka i vraća statistike stranica, pozicioniranja, podele, nameštaja, strukture, označenog sadržaja, artefakata i maksimalnog nastavka
Postavite sve THotPDF opcije izlaza, kompresije, usklađenosti, sloja i trenutnog ispiranja pre pozivanja Render
GenerateStructure podrazumevano je True, pa renderer takođe gradi stablo logičke strukture bezbedno po nastavak i koristi THPDFDOMDocument.Language kada cilj nema jezik
Komponente
THPDFDOMTextobmotava Unicode tekst, kešira granice redova po širini i nasleđenim metrikama teksta i deli kroz opsege izvornih znakova bez kopiranja izvornog tekstaTHPDFDOMSpacerrezerviše vertikalni prostor i može da se deli preko stranicaTHPDFDOMStackraspoređuje vlasničku decu vertikalno sa nasleđenim padding-om i spacingomTHPDFDOMContainerdodaje stilizovano polje oko jednog vlasničkog deteta i prosleđuje nastavke podeleTHPDFDOMTablerazrešava težinske kolone, iscrtava stilizovane redove i ćelije i ponavlja vodeće redove zaglavlja na stranicama nastavkaTHPDFDOMListformira numerisane ili nenumirisane stavke liste sa komponentama oznake i telaTHPDFDOMImageposeduje kloniranu grafiku, razrešava eksplicitne dimenzije i pruža semantiku slike i kontrolu kompresije
Sve komponente izlažu stabilne ugovore Name, Path, Style, Clone, Measure, Draw i Split plus pregaze semantičke uloge, jezika, alternativnog teksta, teksta zamene, teksta proširivanja i artefakta
Prolaz tela najvišeg nivoa je linearan i ne klonira komponente; nastavci teksta i tabele zadržavaju metapodatke opsega ili sečenja redova umesto kopiranja kompletnog stabla sadržaja
Nasleđivanje stila
THPDFDOMStyle razrešava ime fonta, veličinu, stilove, boju teksta, pozadinu, granicu, padding, spacing i visinu reda kroz svoj lanac roditelja
Stil sekcije je roditelj njenog tela i nameštaja, stil steka ili kontejnera je roditelj njegove dece, a stil tabele teče kroz redove do ćelija
Samo eksplicitno dodeljene vrednosti pregažuju roditelja; Clear uklanja lokalne dodele i vezu roditelja, dok Assign kopira lokalne dodele bez kopiranja vlasništva ili porekla
Lančići roditelja dublji od 64 nivoa odbijaju se kao ciklični ili neograničeni
Fabrike komponenata koje se ponovo koriste
THPDFDOMComponentFactory je anonimna funkcija koja formira jednu instancu THPDFDOMComponent u vlasništvu pozivaoca po pozivanju
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Imena fabrika ne razlikuju velika i mala slova i jedinstvena su, svaki poziv mora da vrati novu instancu komponente, a kontejner primaoc preuzima vlasništvo nakon Add
Koristite SetHeaderClone, SetFooterClone ili Clone kada se jedna deklarirana komponenta mora ponovo koristiti na više mesta vlasništva
Tabele sa ponovljenim zaglavljem
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);
Redovi zaglavlja moraju biti neprekidni i prethoditi redovima tela, pozitivne težine kolona dele dostupnu širinu, a visine redova su eksplicitne pozitivne vrednosti
Kada je RepeatHeaders tačno, podela zahteva prostor za sve vodeće redove zaglavlja i najmanje jedan red tela, sprečavajući stranice nastavka samo sa zaglavljem
Paginacija i granice neuspeha
Renderer prvo ponovo meri svaku komponentu prema preostalom pravougaoniku tela, pomeri nedeljiv minimalni fragment na svežu stranicu kada je moguće i delegira svaku važeću podelu na PlaceLayoutElement
Element koji ne može da stane u praznu stranicu tela podiže izuzetak sa svojom stabilnom putanjom elementa umesto tihog odbacivanja sadržaja
MaximumContinuationDepth podrazumevano je 100 000 i ograničava neispravne komponente koje opetovano vraćaju neprogresivni nastavak
Dimenzije stranice sekcije moraju biti pozitivne, margine i praznine nameštaja ne mogu biti negativne, a geometrija zaglavlja plus podnožja mora da ostavi pozitivan pravougaonik tela
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());
Generisani HPDFLayoutDOM.hpp izvozi iste površine dokumenta, stila, komponente, tabele, sekcije, renderera i statistika