Deklarativni razporejanjski DOM

HPDFLayoutDOM zgradi ponovno uporabne komponente dokumenta nad THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, lastnimi fragmenti presežka in ImmediateFlushLayout

Sestava dokumenta in razdelka

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 ima v lasti svoje razdelke, vsak THPDFDOMSection ima v lasti svoje telo, glavo, nogo in slog, in vsako skladišče ali polje ima v lasti komponente, pritrjene nanj

THPDFDOMRenderer.Render začne in konča ciljni dokument, ustvari novo stran za vsak nov razdelek, ponovi opremo razdelka na nadaljevalnih straneh in vrne statistike strani, postavitve, razdelitve, opreme, strukture, označene vsebine, artefaktov in največjega nadaljevanja

Nastavite vse možnosti izhoda, stiskanja, skladnosti, plasti in takojšnjega izpraznjevanja THotPDF pred klicem Render

GenerateStructure privzeto znaša True, zato upodabljalnik zgradi tudi logično strukturno drevo, varno za nadaljevanje, in uporabi THPDFDOMDocument.Language, kadar cilj nima jezika

Komponente

Vse komponente izpostavijo stabilne pogodbe Name, Path, Style, Clone, Measure, Draw in Split plus preglase semantične vloge, jezika, nadomestnega besedila, nadomestnega besedila, razširitvenega besedila in artefakta

Prehod najvišje ravni telesa je linearen in ne klonira komponent; nadaljevanja besedila in tabel ohranjajo metapodatke razponov ali rezov vrstic namesto kopiranja celotnega drevesa vsebine

Podedovanje sloga

THPDFDOMStyle razreši ime pisave, velikost, sloge, barvo besedila, ozadje, rob, polje, razmik in višino vrstice skozi verigo svojih staršev

Slog razdelka je starš svojega telesa in opreme, slog skladišča ali polja je starš svojih otrok in slog tabele teče skozi vrstice do celic

Samo eksplicitno dodeljene vrednosti preglase starša; Clear odstrani lokalne dodelitve in povezavo s staršem, medtem ko Assign kopira lokalne dodelitve brez kopiranja lastništva ali prednikov

Verige staršev globlje od 64 nivojev se zavrnejo kot ciklične ali neomejene

Tovarne ponovno uporabnih komponent

THPDFDOMComponentFactory je anonimna funkcija, ki ustvari eno instanco THPDFDOMComponent v lasti klicatelja na klic

Document.RegisterComponent('notice',
  function: THPDFDOMComponent
  begin
    Result := THPDFDOMContainer.Create(
      THPDFDOMText.Create('Reusable notice'));
  end);

Section.Body.Add(Document.CreateComponent('notice'));

Imena tovarn so neobčutljiva na velikost črk in edinstvena, vsak klic mora vrniti novo instanco komponente in sprejemajoče polje prevzame lastništvo po Add

Uporabite SetHeaderClone, SetFooterClone ali Clone, kadar se mora ena deklarirana komponenta ponovno uporabiti na več mestih lastništva

Tabele s ponavljajočimi se glavami

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);

Glavne vrstice morajo biti zaporedne in predhoditi vrsticam telesa, pozitivne uteži stolpcev delijo razpoložljivo širino in višine vrstic so eksplicitne pozitivne vrednosti

Kadar je RepeatHeaders resnično, razdelitev zahteva prostor za vse vodilne glavne vrstice in vsaj eno vrstico telesa, kar preprečuje nadaljevalne strani zgolj z glavami

Razporeditev strani in meje neuspeha

Upodabljalnik najprej znova izmeri vsako komponento glede na preostali pravokotnik telesa, premakne nesplittabilni najmanjši fragment na novo stran, kadar je mogoče, in delegira vsako veljavno razdelitev PlaceLayoutElement

Element, ki ne sodi v prazno polje strani, sproži izjemo z njegovo stabilno potjo elementa namesto da tiho zavrne vsebino

MaximumContinuationDepth privzeto znaša 100.000 in omejuje nepravilno oblikovane komponente, ki ponavljajo vrnejo nadaljevanje brez napredka

Dimenzije strani razdelka morajo biti pozitivne, robovi in prostori med opremo ne morejo biti negativni in geometrija glave in noge mora pustiti pozitivni pravokotnik telesa

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 izpostavi iste površine dokumenta, sloga, komponente, tabele, razdelka, upodabljalnika in statistike

Povezani API-ji