Declarative Layout DOM

HPDFLayoutDOM construit des composants de document réutilisables sur THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, les fragments de débordement possédés et ImmediateFlushLayout

Composition de documents et de sections

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 possède ses sections, chaque THPDFDOMSection possède son corps, son en-tête, son pied de page et son style, et chaque pile ou conteneur possède les composants qui lui sont attachés

THPDFDOMRenderer.Render démarre et termine le document cible, crée une nouvelle page pour chaque nouvelle section, répète les éléments de section sur les pages de continuation, et renvoie les statistiques de pages, placements, répartitions, éléments, structure, contenu balisé, artefacts et continuation maximale

Définissez toutes les options de sortie, de compression, de conformité, de calques et de flush immédiat de THotPDF avant d’appeler Render

GenerateStructure est défini par défaut sur True, de sorte que le rendu construit également un arbre de structure logique sûr pour la continuation et utilise THPDFDOMDocument.Language lorsque la cible n'a pas de langue

Composants

Tous les composants exposent des contrats stables Name, Path, Style, Clone, Measure, Draw et Split ainsi que le rôle sémantique, la langue, le texte alternatif, le texte de remplacement, le texte d'expansion et les remplacements d'artefacts

La traversée du corps de niveau supérieur est linéaire et ne clone pas les composants ; les continuations de texte et de tableau conservent des métadonnées de plage ou de tranche de lignes au lieu de copier l'arbre de contenu complet

Héritage de style

THPDFDOMStyle résout le nom de police, la taille, les styles, la couleur du texte, le fond, la bordure, le remplissage, l'espacement et la hauteur de ligne à travers sa chaîne parente

Un style de section est le parent de son corps et de ses éléments, un style de pile ou de conteneur est le parent de ses enfants, et le style de tableau se transmet des lignes aux cellules

Seules les valeurs explicitement assignées remplacent le parent ; Clear supprime les assignations locales et le lien parent, tandis que Assign copie les assignations locales sans copier la propriété ni l'ascendance

Les chaînes parentes de plus de 64 niveaux sont rejetées comme cycliques ou illimitées

Fabriques de composants réutilisables

THPDFDOMComponentFactory est une fonction anonyme qui crée une instance THPDFDOMComponent possédée par l'appelant à chaque invocation

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

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

Les noms de fabrique sont insensibles à la casse et uniques, chaque appel doit renvoyer une nouvelle instance de composant, et le conteneur récepteur prend la propriété après Add

Utilisez SetHeaderClone, SetFooterClone ou Clone lorsqu'un composant déclaré doit être réutilisé sur plusieurs sites de propriété

Tableaux à en-têtes répétés

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

Les lignes d'en-tête doivent être contiguës et précéder les lignes de corps, les pondérations de colonnes positives divisent la largeur disponible, et les hauteurs de lignes sont des valeurs positives explicites

Lorsque RepeatHeaders est vrai, une répartition exige de la place pour toutes les lignes d'en-tête principales et au moins une ligne de corps, empêchant les pages de continuation sans contenu que l'en-tête

Pagination et limites d'échec

Le rendu remesure d'abord chaque composant sur le rectangle de corps restant, déplace un fragment minimal insécable vers une nouvelle page lorsque c'est possible, et délègue chaque répartition valide à PlaceLayoutElement

Un élément qui ne peut pas tenir sur une page de corps vide lève une exception avec son chemin d'élément stable au lieu d'écarter silencieusement le contenu

MaximumContinuationDepth est défini par défaut à 100 000 et borne les composants malformés qui renvoient à plusieurs reprises une continuation sans progression

Les dimensions de page de section doivent être positives, les marges et les écarts d'éléments ne peuvent pas être négatifs, et la géométrie de l'en-tête plus du pied de page doit laisser un rectangle de corps positif

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

Le HPDFLayoutDOM.hpp généré exporte les mêmes surfaces de documents, styles, composants, tableaux, sections, rendus et statistiques

API associées