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
THPDFDOMTextomsluter Unicode-text, cachar linjegränser efter bredd och ärvda textmetriker samt delar genom källteckenintervall utan att kopiera källtextenTHPDFDOMSpacerreserverar vertikalt utrymme och kan delas över sidorTHPDFDOMStacklägger ut ägda barn vertikalt med ärvd utfyllnad och mellanrumTHPDFDOMContainerlägger till en stylad ruta runt ett ägt barn och vidarebefordrar delade fortsättningarTHPDFDOMTablelöser upp viktade kolumner, ritar stylade rader och celler samt upprepar inledande huvudrader på fortsättningssidorTHPDFDOMListskapar numrerade eller onumrerade listelement med etikett- och kroppskomponenterTHPDFDOMImageäger en klonad grafik, löser upp explicita dimensioner och tillhandahåller figursemantik och komprimeringskontroll
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