Deklarativni layout DOM
HPDFLayoutDOM gradi višekratno upotrebljive komponente dokumenta preko THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, vlasničkih fragmenata preljeva i ImmediateFlushLayout
Sastavljanje dokumenta i sekcija
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 posjeduje svoje sekcije, svaki THPDFDOMSection posjeduje svoje tijelo, zaglavlje, podnožje i stil, a svaki stog ili spremnik posjeduje komponente pričvršćene na njega
THPDFDOMRenderer.Render pokreće i završava ciljni dokument, stvara svježu stranicu za svaku novu sekciju, ponavlja namještaj sekcije na stranicama nastavka te vraća statistiku stranica, postavljanja, dijeljenja, namještaja, strukture, označenog sadržaja, artefakata i maksimalnog nastavka
Postavite sve THotPDF opcije izlaza, kompresije, usklađenosti, sloja i neposrednog ispiranja prije pozivanja Render
GenerateStructure standardno vraća True, tako renderer također gradi stablo logičke strukture sigurno za nastavak i koristi THPDFDOMDocument.Language kada cilj nema jezik
Komponente
THPDFDOMTextomotava Unicode tekst, predmemorira granice redaka po širini i naslijeđenim metrikama teksta te se dijeli kroz izvorne opsege znakova bez kopiranja izvornog tekstaTHPDFDOMSpacerrezervira okomiti prostor i može se dijeliti preko stranicaTHPDFDOMStackraspoređuje vlasničku djecu okomito s naslijeđenim punjenjem i razmakomTHPDFDOMContainerdodaje stilizirani okvir oko jednog vlasničkog djeteta i preusmjerava nastavke dijeljenjaTHPDFDOMTablerazrješuje ponderirane stupce, crta stilizirane retke i ćelije te ponavlja vodeće retke zaglavlja na stranicama nastavkaTHPDFDOMListstvara numerirane ili nenumerirane stavke popisa s komponentama oznake i tijelaTHPDFDOMImageposjeduje kloniranu grafiku, razrješuje eksplicitne dimenzije i pruža semantiku figure i kontrolu kompresije
Sve komponente izlažu stabilne ugovore Name, Path, Style, Clone, Measure, Draw i Split te sem antičku ulogu, jezik, alternativni tekst, zamjenski tekst, tekst proširenja i nadjačavanja artefakata
Prolaz tijela najviše razine je linearan i ne klonira komponente; nastavci teksta i tablica zadržavaju metapodatke opsega ili rezanja redaka umjesto kopiranja cijelog stabla sadržaja
Nasljeđivanje stila
THPDFDOMStyle razrješuje naziv fonta, veličinu, stilove, boju teksta, pozadinu, okvir, punjenje, razmak i visinu retka kroz svoj lanac roditelja
Stil sekcije je roditelj njezinog tijela i namještaja, stil stoga ili spremnika je roditelj njihove djece, a stil tablice teče kroz retke do ćelija
Samo eksplicitno dodijeljene vrijednosti zaobilaze roditelja; Clear uklanja lokalne dodjele i vezu roditelja, dok Assign kopira lokalne dodjele bez kopiranja vlasništva ili podrijetla
Lanci roditelja dublji od 64 razine odbijaju se kao ciklički ili neograničeni
Fabrike višekratno upotrebljivih komponenti
THPDFDOMComponentFactory je anonimna funkcija koja stvara po jednu instancu THPDFDOMComponent u vlasništvu pozivatelja po pozivu
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Nazivi fabrika ne razlikuju velika i mala slova i jedinstveni su, svaki poziv mora vratiti novu instancu komponente, a primajući spremnik preuzima vlasništvo nakon Add
Koristite SetHeaderClone, SetFooterClone ili Clone kada se jedna deklarirana komponenta mora ponovno koristiti na više mjesta vlasništva
Tablice s 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 susjedni i prethoditi redovima tijela, pozitivni ponderi stupaca dijele dostupnu širinu, a visine redaka su eksplicitne pozitivne vrijednosti
Kada je RepeatHeaders istinito, dijeljenje zahtijeva prostor za sve vodeće retke zaglavlja i najmanje jedan redak tijela, sprječavajući stranice nastavka samo sa zaglavljem
Paginacija i granice kvara
Renderer najprije ponovno mjeri svaku komponentu prema preostalom pravokutniku tijela, premješta djelić koji se ne može dijeliti na svježu stranicu kada je moguće i prenosi svaki valjani dio na PlaceLayoutElement
Element koji ne može stati u praznu stranicu tijela podiže iznimku sa svojom stabilnom putanjom elementa umjesto da tiho odbacuje sadržaj
MaximumContinuationDepth standardno iznosi 100 000 i ograničava neispravne komponente koje opetovano vraćaju nastavak koji ne napreduje
Dimenzije stranice sekcije moraju biti pozitivne, margine i praznine namještaja ne mogu biti negativne, a geometrija zaglavlja i podnožja mora ostaviti pozitivan pravokutnik tijela
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 izvozi iste površine dokumenta, stila, komponente, tablice, sekcije, renderera i statistike