Deklarativni razporejanjski DOM
HPDFLayoutDOM zgradi ponovno uporabne komponente dokumenta nad THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, lastnimi fragmenti presežka in ImmediateFlushLayout
Sestava dokumenta in razdelka
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 ima v lasti svoje razdelke, vsak THPDFDOMSection ima v lasti svoje telo, glavo, nogo in slog, in vsako skladišče ali polje ima v lasti komponente, pritrjene nanj
THPDFDOMRenderer.Render začne in konča ciljni dokument, ustvari novo stran za vsak nov razdelek, ponovi opremo razdelka na nadaljevalnih straneh in vrne statistike strani, postavitve, razdelitve, opreme, strukture, označene vsebine, artefaktov in največjega nadaljevanja
Nastavite vse možnosti izhoda, stiskanja, skladnosti, plasti in takojšnjega izpraznjevanja THotPDF pred klicem Render
GenerateStructure privzeto znaša True, zato upodabljalnik zgradi tudi logično strukturno drevo, varno za nadaljevanje, in uporabi THPDFDOMDocument.Language, kadar cilj nima jezika
Komponente
THPDFDOMTextovije besedilo Unicode, predpomni meje vrstic po širini in podedovanih metrikah besedila ter se razdeli prek razponov znakov vira brez kopiranja izvornega besedilaTHPDFDOMSpacerrezervira navpični prostor in se lahko razdeli čez straniTHPDFDOMStackrazporedi lastne otroke navpično s podedovanim poljem in razmikomTHPDFDOMContainerdoda oblikovano polje okoli enega lastnega otroka in posreduje nadaljevanja razdelitveTHPDFDOMTablerazreši utežene stolpce, nariše oblikovane vrstice in celice ter ponovi vodilne glavne vrstice na nadaljevalnih stranehTHPDFDOMListustvari oštevilčene ali neoštevilčene elemente seznama s komponentama oznake in telesaTHPDFDOMImageima v lasti klonirano grafiko, razreši eksplicitne dimenzije in zagotavlja semantiko slike ter nadzor stiskanja
Vse komponente izpostavijo stabilne pogodbe Name, Path, Style, Clone, Measure, Draw in Split plus preglase semantične vloge, jezika, nadomestnega besedila, nadomestnega besedila, razširitvenega besedila in artefakta
Prehod najvišje ravni telesa je linearen in ne klonira komponent; nadaljevanja besedila in tabel ohranjajo metapodatke razponov ali rezov vrstic namesto kopiranja celotnega drevesa vsebine
Podedovanje sloga
THPDFDOMStyle razreši ime pisave, velikost, sloge, barvo besedila, ozadje, rob, polje, razmik in višino vrstice skozi verigo svojih staršev
Slog razdelka je starš svojega telesa in opreme, slog skladišča ali polja je starš svojih otrok in slog tabele teče skozi vrstice do celic
Samo eksplicitno dodeljene vrednosti preglase starša; Clear odstrani lokalne dodelitve in povezavo s staršem, medtem ko Assign kopira lokalne dodelitve brez kopiranja lastništva ali prednikov
Verige staršev globlje od 64 nivojev se zavrnejo kot ciklične ali neomejene
Tovarne ponovno uporabnih komponent
THPDFDOMComponentFactory je anonimna funkcija, ki ustvari eno instanco THPDFDOMComponent v lasti klicatelja na klic
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Imena tovarn so neobčutljiva na velikost črk in edinstvena, vsak klic mora vrniti novo instanco komponente in sprejemajoče polje prevzame lastništvo po Add
Uporabite SetHeaderClone, SetFooterClone ali Clone, kadar se mora ena deklarirana komponenta ponovno uporabiti na več mestih lastništva
Tabele s ponavljajočimi se glavami
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);
Glavne vrstice morajo biti zaporedne in predhoditi vrsticam telesa, pozitivne uteži stolpcev delijo razpoložljivo širino in višine vrstic so eksplicitne pozitivne vrednosti
Kadar je RepeatHeaders resnično, razdelitev zahteva prostor za vse vodilne glavne vrstice in vsaj eno vrstico telesa, kar preprečuje nadaljevalne strani zgolj z glavami
Razporeditev strani in meje neuspeha
Upodabljalnik najprej znova izmeri vsako komponento glede na preostali pravokotnik telesa, premakne nesplittabilni najmanjši fragment na novo stran, kadar je mogoče, in delegira vsako veljavno razdelitev PlaceLayoutElement
Element, ki ne sodi v prazno polje strani, sproži izjemo z njegovo stabilno potjo elementa namesto da tiho zavrne vsebino
MaximumContinuationDepth privzeto znaša 100.000 in omejuje nepravilno oblikovane komponente, ki ponavljajo vrnejo nadaljevanje brez napredka
Dimenzije strani razdelka morajo biti pozitivne, robovi in prostori med opremo ne morejo biti negativni in geometrija glave in noge mora pustiti pozitivni pravokotnik telesa
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());
Generirani HPDFLayoutDOM.hpp izpostavi iste površine dokumenta, sloga, komponente, tabele, razdelka, upodabljalnika in statistike