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
THPDFDOMTextkapselt Unicode-Text, speichert Zeilengrenzen nach Breite und geerbten Textmetriken zwischen und teilt über Quellzeichenbereiche, ohne den Quelltext zu kopierenTHPDFDOMSpacerreserviert vertikalen Platz und kann über Seiten aufgeteilt werdenTHPDFDOMStacklegt eigene Kinder vertikal mit geerbtem Innenabstand und Zwischenraum ausTHPDFDOMContainerfügt einen gestalteten Rahmen um ein eigenes Kind hinzu und leitet Fortsetzungen der Aufteilung weiterTHPDFDOMTablelöst gewichtete Spalten auf, zeichnet gestaltete Zeilen und Zellen und wiederholt führende Kopfzeilen auf FortsetzungsseitenTHPDFDOMListerstellt nummerierte oder unnummerierte Listenelemente mit Beschriftungs- und HauptkomponentenTHPDFDOMImagebesitzt eine geklonte Grafik, löst explizite Abmessungen auf und stellt Abbildungssemantik sowie Komprimierungssteuerung bereit
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