Deklaratives Layout-DOM

HPDFLayoutDOM erstellt wiederverwendbare Dokumentkomponenten auf Grundlage von THPDFLayoutElement, MeasureLayoutElement, PlaceLayoutElement, eigenen Überlauffragmenten und ImmediateFlushLayout

Zusammensetzen von Dokumenten und Abschnitten

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 besitzt seine Abschnitte, jeder THPDFDOMSection besitzt seinen Hauptbereich, Kopf- und Fußzeile sowie Stil, und jeder Stapel oder Container besitzt die ihm angehängten Komponenten

THPDFDOMRenderer.Render beginnt und beendet das Zieldokument, erstellt für jeden neuen Abschnitt eine frische Seite, wiederholt Abschnittselemente auf Fortsetzungsseiten und liefert Statistiken zu Seiten, Platzierungen, Aufteilungen, Abschnittselementen, Struktur, markiertem Inhalt, Artefakten und maximaler Fortsetzung

Setzen Sie alle Ausgabe-, Komprimierungs-, Konformitäts-, Ebenen- und Immediate-Flush-Optionen von THotPDF, bevor Sie Render aufrufen

GenerateStructure ist standardmäßig True, daher erstellt der Renderer auch einen fortsetzungssicheren logischen Strukturbaum und verwendet THPDFDOMDocument.Language, wenn das Ziel keine Sprache besitzt

Komponenten

Alle Komponenten bieten stabile Verträge für Name, Path, Style, Clone, Measure, Draw und Split sowie Überschreibungen für semantische Rolle, Sprache, Alternativtext, Ersatztext, Erweiterungstext und Artefakt

Die Traversierung des Hauptbereichs auf oberster Ebene ist linear und klont keine Komponenten; Text- und Tabellenfortsetzungen behalten Bereichs- oder Zeilensegmentmetadaten, statt den vollständigen Inhaltsbaum zu kopieren

Stilvererbung

THPDFDOMStyle löst Schriftname, Größe, Stile, Textfarbe, Hintergrund, Rahmen, Innenabstand, Zwischenraum und Zeilenhöhe über seine Elternkette auf

Der Stil eines Abschnitts ist das Elternobjekt seines Hauptbereichs und seiner Abschnittselemente, der Stil eines Stapels oder Containers ist das Elternobjekt seiner Kinder, und Tabellenstil fließt über Zeilen zu Zellen

Nur ausdrücklich zugewiesene Werte überschreiben den Elternwert; Clear entfernt lokale Zuweisungen und die Elternverknüpfung, während Assign lokale Zuweisungen kopiert, ohne Besitz oder Herkunft zu kopieren

Elternketten mit mehr als 64 Ebenen werden als zyklisch oder unbegrenzt zurückgewiesen

Factories für wiederverwendbare Komponenten

THPDFDOMComponentFactory ist eine anonyme Funktion, die bei jedem Aufruf eine vom Aufrufer besessene THPDFDOMComponent-Instanz erzeugt

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

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

Factory-Namen unterscheiden nicht zwischen Groß- und Kleinschreibung und sind eindeutig, jeder Aufruf muss eine neue Komponenteninstanz zurückgeben und der empfangende Container übernimmt nach Add deren Besitz

Verwenden Sie SetHeaderClone, SetFooterClone oder Clone, wenn eine deklarierte Komponente an mehreren Besitzstellen wiederverwendet werden muss

Tabellen mit wiederholten Kopfzeilen

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

Kopfzeilen müssen zusammenhängend sein und vor Datenzeilen stehen, positive Spaltengewichte teilen die verfügbare Breite auf und Zeilenhöhen sind explizite positive Werte

Wenn RepeatHeaders true ist, erfordert eine Aufteilung Platz für alle führenden Kopfzeilen und mindestens eine Datenzeile, wodurch reine Kopfzeilen auf Fortsetzungsseiten verhindert werden

Paginierung und Fehlergrenzen

Der Renderer misst jede Komponente zunächst gegen das verbleibende Rechteck des Hauptbereichs neu, verschiebt ein nicht teilbares Mindestfragment wenn möglich auf eine frische Seite und delegiert jede zulässige Aufteilung an PlaceLayoutElement

Ein Element, das nicht auf eine leere Hauptbereichsseite passt, löst mit seinem stabilen Elementpfad eine Ausnahme aus, statt Inhalt stillschweigend zu verwerfen

MaximumContinuationDepth hat standardmäßig den Wert 100.000 und begrenzt fehlerhafte Komponenten, die wiederholt eine nicht fortschreitende Fortsetzung zurückgeben

Seitendimensionen des Abschnitts müssen positiv sein, Ränder und Abstände zu Abschnittselementen dürfen nicht negativ sein und die Geometrie aus Kopf- und Fußzeile muss ein positives Rechteck für den Hauptbereich belassen

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

Die erzeugte Datei HPDFLayoutDOM.hpp exportiert dieselben Oberflächen für Dokument, Stil, Komponente, Tabelle, Abschnitt, Renderer und Statistiken

Verwandte APIs