Declarative Layout DOM
HPDFLayoutDOM vytvára opätovne použiteľné komponenty dokumentu nad THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, vlastnenými fragmentmi pretečenia a ImmediateFlushLayout
Kompozícia dokumentu a sekcie
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 vlastní svoje sekcie, každý THPDFDOMSection vlastní svoje telo, hlavičku, pätu a štýl a každý zásobník alebo kontajner vlastní komponenty, ktoré sú k nemu pripojené
THPDFDOMRenderer.Render spustí a ukončí cieľový dokument, vytvorí novú stránku pre každú novú sekciu, opakuje nábytok sekcie na pokračovacích stránkach a vracia štatistiky stránok, umiestnení, rozdelení, nábytku, štruktúry, označeného obsahu, artefaktov a maximálneho pokračovania
Nastavte všetky možnosti THotPDF pre výstup, kompresiu, zhodu, vrstvy a okamžité vyprázdnenie pred volaním Render
GenerateStructure je predvolene True, takže vykresľovač tiež vytvára logický strom štruktúry bezpečný pre pokračovanie a používa THPDFDOMDocument.Language, keď cieľ nemá žiadny jazyk
Komponenty
THPDFDOMTextobaľuje text Unicode, ukladá do vyrovnávacej pamäte hranice riadkov podľa šírky a zdedených metrík textu a rozdeľuje cez rozsahy znakov zdroja bez kopírovania zdrojového textuTHPDFDOMSpacerrezervuje vertikálny priestor a môže sa rozdeliť cez stránkyTHPDFDOMStackrozmiestňuje vlastnené deti vertikálne so zdedeným odsadením a rozostupomTHPDFDOMContainerpridáva štýlovaný rámček okolo jedného vlastneného dieťaťa a preposiela rozdelenia pokračovaniaTHPDFDOMTablerieši vážené stĺpce, kreslí štýlované riadky a bunky a opakuje vedúce riadky hlavičky na pokračovacích stránkachTHPDFDOMListvytvára číslované alebo nečíslované položky zoznamu s komponentmi štítka a telaTHPDFDOMImagevlastní klonovanú grafiku, rieši explicitné rozmery a poskytuje sémantiku obrázka a kontrolu kompresie
Všetky komponenty vystavujú stabilné zmluvy Name, Path, Style, Clone, Measure, Draw a Split plus sémantickú rolu, jazyk, alternatívny text, náhradný text, text rozšírenia a prepísania artefaktov
Prechádzanie tela na najvyššej úrovni je lineárne a neklonuje komponenty; pokračovania textu a tabuliek zachovávajú metadáta rozsahu alebo rezu riadkov namiesto kopírovania úplného stromu obsahu
Dedičnosť štýlu
THPDFDOMStyle rieši názov písma, veľkosť, štýly, farbu textu, pozadie, orámovanie, odsadenie, rozostup a výšku riadku cez svoj reťazec rodičov
Štýl sekcie je rodičom jej tela a nábytku, štýl zásobníka alebo kontajnera je rodičom jeho detí a štýl tabuľky preteká cez riadky do buniek
Iba explicitne priradené hodnoty prepisujú rodiča; Clear odstráni lokálne priradenia a odkaz na rodiča, zatiaľ čo Assign kopíruje lokálne priradenia bez kopírovania vlastníctva alebo predkov
Reťazce rodičov hlbšie ako 64 úrovní sa odmietajú ako cyklické alebo neohraničené
Opätovne použiteľné továrne komponentov
THPDFDOMComponentFactory je anonymná funkcia, ktorá vytvára jednu inštanciu THPDFDOMComponent vlastnenú volajúcim pri každom vyvolaní
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Názvy tovární sú nezávislé od veľkosti písmen a jedinečné, každé volanie musí vrátiť novú inštanciu komponentu a prijímajúci kontajner preberá vlastníctvo po Add
Použite SetHeaderClone, SetFooterClone alebo Clone, keď sa jeden deklarovaný komponent musí znova použiť na viacerých miestach vlastníctva
Tabuľky s opakovanou hlavičkou
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);
Riadky hlavičky musia byť súvislé a predchádzať riadkom tela, kladné váhy stĺpcov rozdeľujú dostupnú šírku a výšky riadkov sú explicitné kladné hodnoty
Keď je RepeatHeaders pravdivé, rozdelenie vyžaduje priestor pre všetky vedúce riadky hlavičky a aspoň jeden riadok tela, čím sa zabráni pokračovacím stránkam iba s hlavičkou
Stránkovanie a hranice zlyhania
Vykresľovač najprv znova zmeria každý komponent proti zostávajúcemu obdĺžniku tela, presunie nedeliteľný minimálny fragment na novú stránku, keď je to možné, a deleguje každé platné rozdelenie na PlaceLayoutElement
Prvok, ktorý sa nezmestí na prázdnu stránku tela, vyvolá výnimku so svojou stabilnou cestou prvku namiesto tichého zahodenia obsahu
MaximumContinuationDepth je predvolene 100 000 a obmedzuje chybné komponenty, ktoré opakovane vracajú nepokračujúce pokračovanie
Rozmery stránky sekcie musia byť kladné, okraje a medzery nábytku nemôžu byť záporné a geometria hlavičky plus päty musí ponechať kladný obdĺžnik 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());
Vygenerovaný HPDFLayoutDOM.hpp exportuje rovnaké povrchy dokumentu, štýlu, komponentu, tabuľky, sekcie, vykresľovača a štatistík