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
THPDFDOMTextenveloppe le texte Unicode, met en cache les limites de ligne par largeur et métriques de texte héritées, et se répartit via des plages de caractères sources sans copier le texte sourceTHPDFDOMSpacerréserve l'espace vertical et peut se répartir sur plusieurs pagesTHPDFDOMStackdispose verticalement les enfants possédés avec le remplissage et l'espacement héritésTHPDFDOMContainerajoute une boîte stylée autour d'un enfant possédé et transmet les continuations de répartitionTHPDFDOMTablerésout les colonnes pondérées, dessine les lignes et cellules stylées, et répète les lignes d'en-tête principales sur les pages de continuationTHPDFDOMListcrée des éléments numérotés ou non avec composants d'étiquette et de corpsTHPDFDOMImagepossède un graphisme cloné, résout les dimensions explicites, et fournit la sémantique de figure et le contrôle de compression
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