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

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

Související API