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

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

Povezani API-ji