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

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

Súvisiace API