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

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

Gerelateerde API's