Declarative Layout DOM
HPDFLayoutDOM sestavuje opakovaně použitelné dokumentové komponenty nad THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, vlastněnými fragmenty přetečení a ImmediateFlushLayout
Skladba dokumentu a oddílů
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í své oddíly, každý THPDFDOMSection vlastní své tělo, záhlaví, zápatí a styl a každý stack nebo kontejner vlastní komponenty, které jsou k němu připojené
THPDFDOMRenderer.Render spustí a ukončí cílový dokument, vytvoří novou stránku pro každý nový oddíl, opakuje prvky oddílu na pokračovacích stránkách a vrací statistiky stránek, umístění, dělení, prvků oddílu, struktury, marked-content, artefaktů a maximálního pokračování
Všechny volby THotPDF pro výstup, kompresi, shodu, vrstvy a immediate flush nastavte před voláním Render
GenerateStructure má defaultně True, takže renderer navíc staví logical structure tree bezpečný pro pokračování a když cíl nemá jazyk, použije THPDFDOMDocument.Language
Komponenty
THPDFDOMTextzabalí text Unicode, cacheuje hranice řádků podle šířky a děděných metrik textu a dělí se přes rozsahy zdrojových znaků bez kopírování zdrojového textuTHPDFDOMSpacerrezervuje vertikální prostor a umí se dělit napříč stránkamiTHPDFDOMStackrozvrždí vlastněné potomky vertikálně s děděným odsazením a rozestupyTHPDFDOMContainerpřidá stylizovaný box kolem jednoho vlastněného potomka a přeposílá pokračování děleníTHPDFDOMTableřeší vážené sloupce, kreslí stylizované řádky a buňky a na pokračovacích stránkách opakuje úvodní hlavičkové řádkyTHPDFDOMListvytváří číslované nebo nečíslované položky seznamu s komponentami popisku a tělaTHPDFDOMImagevlastní klonovanou grafiku, řeší explicitní rozměry a poskytuje sémantiku obrázku a kontrolu komprese
Všechny komponenty zpřístupňují stabilní kontrakty Name, Path, Style, Clone, Measure, Draw a Split plus sémantickou roli, jazyk, alternativní text, náhradní text, rozvíjející text a přepsání pro artefakty
Průchod tělem nejvyšší úrovně je lineární a neklonuje komponenty; pokračování textu a tabulek si místo kopírování kompletního stromu obsahu uchovávají metadata rozsahů nebo výřezů řádků
Dědění stylů
THPDFDOMStyle řeší název písma, velikost, styly, barvu textu, pozadí, ohraničení, odsazení, rozestupy a výšku řádku přes řetěz rodičů
Styl oddílu je rodičem svého těla a svých prvků, styl stacku nebo kontejneru je rodičem svých potomků a styl tabulky teče přes řádky ke buňkám
Rodiče přepíší jen explicitně přiřazené hodnoty; Clear odstraní lokální přiřazení i odkaz na rodiče a Assign kopíruje lokální přiřazení bez kopírování vlastnictví nebo předků
Řetězy rodičů hlubší než 64 úrovní se odmítnou jako cyklické nebo neomezené
Opakovaně použitelné továrny komponent
THPDFDOMComponentFactory je anonymní funkce, která při každém volání vytvoří jednu instanci THPDFDOMComponent vlastněnou volajícím
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Názvy továren nerozlišují velikost písmen a jsou unikátní, každé volání musí vrátit novou instanci komponenty a přijímající kontejner převezme vlastnictví po Add
Když musí být jedna deklarovaná komponenta znovu použita na několika místech vlastnictví, použijte SetHeaderClone, SetFooterClone nebo Clone
Tabulky s opakovanými hlavičkami
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);
Hlavičkové řádky musí být souvislé a předcházet řádkům těla, kladné váhy sloupců dělí dostupnou šířku a výšky řádků jsou explicitní kladné hodnoty
Když je RepeatHeaders zapnuté, dělení vyžaduje prostor pro všechny úvodní hlavičkové řádky a alespoň jeden řádek těla, takže pokračovací stránky jen s hlavičkou nemohou vzniknout
Stránkování a hranice selhání
Renderer nejprve přeměří každou komponentu vůči zbývajícímu obdélníku těla, přesune nesplitovatelný minimální fragment na novou stránku, když to jde, a každé platné dělení deleguje na PlaceLayoutElement
Prvek, který se nevejde na prázdnou stránku těla, vyvolá výjimku se svou stabilní cestou prvku místo tichého zahazení obsahu
MaximumContinuationDepth má defaultně 100 000 a ohraničuje poškozené komponenty, které opakovaně vrací pokračování bez pokroku
Rozměry stránek oddílu musí být kladné, okraje a mezery prvků nesmí být záporné a geometrie záhlaví a zápatí musí nechat kladný obdélník těla
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());
Generované HPDFLayoutDOM.hpp exportuje stejné plochy pro dokument, styl, komponenty, tabulky, oddíly, renderer a statistiky