Declaratieve lay-out-DOM
HPDFLayoutDOM bouwt herbruikbare documentcomponenten over THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, eigendom-overloopfragmenten en ImmediateFlushLayout
Document- en sectiecompositie
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 bezit zijn secties, elke THPDFDOMSection bezit zijn body, kop, voettekst en stijl, en elke stack of container bezit de eraan bevestigde componenten
THPDFDOMRenderer.Render start en beëindigt het doeldocument, maakt een verse pagina voor elke nieuwe sectie, herhaalt sectiemeubilair op voortzettingpagina's en retourneert pagina-, plaatsing-, splitsing-, meubilair-, structuur-, gemarkeerde-inhoud-, artefact- en maximum-voortzettingsstatistieken
Stel alle THotPDF-uitvoer-, compressie-, conformantie-, laag- en immediate-flush-opties in vóór het aanroepen van Render
GenerateStructure is standaard True, dus de renderer bouwt ook een voortzetting-veilige logische structuurbomen en gebruikt THPDFDOMDocument.Language wanneer het doel geen taal heeft
Componenten
THPDFDOMTextomhult Unicode-tekst, cacht regellimieten op basis van breedte en geërfde tekstmetrieken en splitst via bron-tekenreeksen zonder de brontekst te kopiërenTHPDFDOMSpacerreserveert verticale ruimte en kan over pagina's splitsenTHPDFDOMStacklegt eigendom-kinderen verticaal uit met geërfde padding en spacingTHPDFDOMContainervoegt een gestyled kader toe rond één eigendom-kind en stuurt splitsingscontinuaties doorTHPDFDOMTablelost gewogen kolommen op, tekent gestyle rijen en cellen en herhaalt leidende koprijen op voortzettingpagina'sTHPDFDOMListcreëert genummerde of ongenummerde lijstitems met label- en bodycomponentenTHPDFDOMImagebezit een gekloonde grafiek, lost expliciete dimensies op en biedt figuursemantiek en compressiecontrole
Alle componenten bieden stabiele Name-, Path-, Style-, Clone-, Measure-, Draw- en Split-contracten plus semantische rol, taal, alternatieve tekst, vervangtekst, expansietekst en artefact-overschrijvingen
Top-level body-doorloop is lineair en kloneert geen componenten; tekst- en tabelvoortzettingen behouden reeks- of rij-slice-metagegevens in plaats van de volledige contentboom te kopiëren
Stijl-overerving
THPDFDOMStyle lost lettertypenaam, -grootte, -stijlen, tekstkleur, achtergrond, rand, padding, spacing en regelhoogte op via zijn ouderketen
Een sectiestijl is de ouder van zijn body en meubilair, een stack- of containerstijl is de ouder van zijn kinderen, en tabelstijl vloeit via rijen naar cellen
Alleen expliciet toegewezen waarden overschrijven de ouder; Clear verwijdert lokale toewijzingen en de ouderlink, terwijl Assign lokale toewijzingen kopieert zonder eigendom of afstamming te kopiëren
Ouderketens dieper dan 64 niveaus worden afgewezen als cyclisch of onbegrensd
Herbruikbare componentfabrieken
THPDFDOMComponentFactory is een anonieme functie die per aanroep één door de aanroeper eigendommen THPDFDOMComponent-instantie creëert
Document.RegisterComponent('notice',
function: THPDFDOMComponent
begin
Result := THPDFDOMContainer.Create(
THPDFDOMText.Create('Reusable notice'));
end);
Section.Body.Add(Document.CreateComponent('notice'));
Fabrieksnamen zijn hoofdletterongevoelig en uniek, elke aanroep moet een nieuwe componentinstantie retourneren en de ontvangende container neemt eigendom over na Add
Gebruik SetHeaderClone, SetFooterClone of Clone wanneer één gedeclareerd component moet worden hergebruikt op meerdere eigendomssites
Tabellen met herhaalde koppen
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);
Koprijen moeten aaneengesloten zijn en bodyrijen voorafgaan, positieve kolomgewichten verdelen de beschikbare breedte en rijhoogtes zijn expliciete positieve waarden
Wanneer RepeatHeaders waar is, vereist een splitsing ruimte voor alle leidende koprijen en ten minste één bodyrij, waardoor kop-alleen-voortzettingpagina's worden voorkomen
Paginering en faalgrenzen
De renderer meet eerst elk component opnieuw tegen de resterende body-rechthoek, verplaatst een niet-splitsbaar minimumfragment naar een verse pagina wanneer mogelijk en delegeert elke geldige splitsing aan PlaceLayoutElement
Een element dat niet op een lege body-pagina past, genereert een uitzondering met zijn stabiele elementpad in plaats van inhoud stil te laten vallen
MaximumContinuationDepth is standaard 100.000 en begrenst verkeerd gevormde componenten die herhaaldelijk een niet-vorderende voortzetting retourneren
Sectiepagina-dimensies moeten positief zijn, marges en meubilairleemtes kunnen niet negatief zijn, en kop- plus voettekstgeometrie moet een positieve body-rechthoek overlaten
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());
Het gegenereerde HPDFLayoutDOM.hpp exporteert dezelfde document-, stijl-, component-, tabel-, sectie-, renderer- en statistiekvlakken