Deklarativ layout-DOM

HPDFLayoutDOM bygger återanvändbara dokumentkomponenter över THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, ägda överflödesfragment och ImmediateFlushLayout

Dokument- och sektionskomposition

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 äger sina sektioner, varje THPDFDOMSection äger sin kropp, sitt sidhuvud, sin sidfot och sin stil, och varje stack eller behållare äger de komponenter som fästs till den

THPDFDOMRenderer.Render startar och avslutar måldokumentet, skapar en färsk sida för varje ny sektion, upprepar sektionsinredning på fortsättningssidor och returnerar statistik för sidor, placeringar, delningar, inredning, struktur, markerat innehåll, artefakter och maximal fortsättning

Sätt alla THotPDF-utgångs-, komprimerings-, överensstämmelse-, lager- och immediate-flush-alternativ före anrop av Render

GenerateStructure är True som standard, så renderaren bygger även ett fortsättningssäkert logiskt strukturträd och använder THPDFDOMDocument.Language när målfilen saknar språk

Komponenter

Alla komponenter exponerar stabila Name-, Path-, Style-, Clone-, Measure-, Draw- och Split-kontrakt plus semantisk roll, språk, alternativtext, ersättningstext, expansionstext och artefakt-överskridanden

Genomgång av toppnivåkropp är linjär och klonar inte komponenter; text- och tabellfortsättningar behåller intervall- eller radslice-metadata i stället för att kopiera hela innehållsträdet

Stillärvning

THPDFDOMStyle löser upp teckensnittsnamn, storlek, stilar, textfärg, bakgrund, ram, utfyllnad, mellanrum och radhöjd genom sin föräldrakedja

En sektionsstil är förälder till sin kropp och inredning, en stack- eller behållarstil är förälder till sina barn och tabellstil flödar genom rader till celler

Endast explicit tilldelade värden åsidosätter föräldern; Clear tar bort lokala tilldelningar och föräldralänken, medan Assign kopierar lokala tilldelningar utan att kopiera ägande eller härkomst

Föräldrakedjor djupare än 64 nivåer avvisas som cykliska eller obegränsade

Återanvändbara komponentfabriker

THPDFDOMComponentFactory är en anonym funktion som skapar en anropare-ägd THPDFDOMComponent-instans per anrop

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

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

Fabriksnamn är skiftlägesokänsliga och unika, varje anrop måste returnera en ny komponentinstans och den mottagande behållaren tar ägandet efter Add

Använd SetHeaderClone, SetFooterClone eller Clone när en deklarerad komponent måste återanvändas på flera ägarplatser

Tabeller med upprepande huvud

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

Huvudrader måste vara sammanhängande och före kroppsraderna, positiva kolumnvikter delar den tillgängliga bredden och radhöjder är explicita positiva värden

När RepeatHeaders är sant kräver en delning utrymme för alla inledande huvudrader och minst en kroppsrad, vilket förhindrar huvud-enbart-fortsättningssidor

Pagering och felgränser

Renderaren omäter först varje komponent mot det återstående kroppsrektangeln, flyttar ett odealbart minimifragment till en färsk sida när det är möjligt och delegerar varje giltig delning till PlaceLayoutElement

Ett element som inte får plats på en tom kroppssida utlöser ett undantag med sin stabila element-sökväg i stället för att tyst slänga innehåll

MaximumContinuationDepth är som standard 100,000 och begränsar felformaterade komponenter som upprepade gånger returnerar en icke-framskridande fortsättning

Sektionssiddimensioner måste vara positiva, marginaler och inredningsgap kan inte vara negativa och sidhuvud plus sidfotsgeometri måste lämna en positiv kroppsrektangel

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

Den genererade HPDFLayoutDOM.hpp exporterar samma dokument-, stil-, komponent-, tabell-, sektions-, renderar- och statistikytor

Relaterade API:er