HTML5-Paged-Media-Import
THPDFHTMLImporter.RenderHTML5 wandelt tolerantes HTML5-Markup und Druck-CSS in paginierten PDF-Inhalt um und erhält den kompakten bisherigen RenderHTML-Pfad
CSS-Längen und die Margin-, BaseFontSize-, ListIndent- und BlockSpacing-Werte des Importers liegen in Punkt, sodass beide Renderer dieselbe Seite erzeugen, egal wie THotPDF.Resolution gesetzt ist; eigenes Zeichnen vor und nach dem Import nutzt weiterhin 1/Resolution Zoll
Deklaration
function RenderHTML5(
const HTML: WideString;
const AuthorStyleSheet: WideString = ''
): Boolean;
function HPDFRenderHTML5Document(
Doc: THotPDF;
const HTML: WideString;
const AuthorStyleSheet: WideString = '';
MarginPt: Single = 72;
const FontName: AnsiString = 'Arial';
FontSize: Single = 12
): Boolean;
Profilvertrag
HTML5ProfileVersion gibt 1 zurück und HTML5ProfileMilestones meldet Parser und Kaskade, Seitenlayout, Tabellen und Formulare sowie begrenzte Ressourcen
- Das tolerante DOM akzeptiert übliche ausgelassene Endtags, bewahrt die Textreihenfolge, überspringt inaktive Dokumentbereiche und erzwingt
MaxDOMNodes - Die Kaskade unterstützt Typ-, Klassen-, ID-, Gleichheits-Attribut-, Nachfahren- und Kindselektoren, Quellreihenfolge, Spezifität, Inline-Deklarationen,
!important,@media printund@page-Ränder - Das Seitenlayout unterstützt Blockfluss, Überschriften, Listen, Rahmen, Hintergründe, Boxabstände, explizite Seitenumbrüche, Tabellen, Bilder und automatische Paginierung bei Überlauf
- Texteingaben, Schaltflächen, Kontrollkästchen, Optionsfelder, Textbereiche und Auswahlelemente werden als statische Darstellung oder native AcroForm-Felder gerendert, wenn
CreateAcroFormsaktiviert ist
Gemessene Absätze und Textrichtung
Absätze brechen anhand der gemessenen Vorschübe der aktuellen Schrift um, einschließlich Schriftwechsel, Bold- und Italic-Runs, Laufweite, Wortabstand, expliziter Zeilenumbrüche und ostasiatischer Zeichengrenzen; Ausrichtung und Dekoration greifen separat je resultierender Zeile
direction: ltr, direction: rtl und das HTML-Attribut dir wählen die Absatzrichtung; dir="auto" verwendet die Unicode-Richtung des ersten starken Zeichens
Unter Windows werden bidirektionale Skript-Runs mit Uniscribe aufgelöst und über Stilgrenzen hinweg umgeordnet, während die vorhandene PDF-Text-Engine die Glyphenformung innerhalb jedes Runs übernimmt; die Dokumentrichtung, Viewer-Preferences und der gesicherte Seiten-Textzustand werden nach der Zeile wiederhergestellt
Inline-Richtungs-Overrides, bdi und bdo verwenden derzeit die Absatzreihenfolge und erzeugen eine hdkLayoutFallback-Diagnose; unicode-bidi liegt außerhalb dieses Profils, und die Skriptformung folgt weiterhin der Shaping-Konfiguration des Dokuments
Absatz-Fragmentierung
widows und orphans sind vererbbare positive Ganzzahlen, beide standardmäßig 2; die Paginierung arbeitet mit den gemessenen Zeilenboxen statt mit einer geschätzten Zeichenanzahl
Der Importer verschiebt einen Absatz oder passt seine Trennung so an, dass vor und nach einem Seitenumbruch die geforderte Mindestanzahl Zeilen verbleibt; break-inside: avoid hält einen Absatz zusammen, wenn er auf eine neue Seite passt
Wenn eine Seite die geforderte Bedingung nicht aufnehmen kann, macht das Rendering Fortschritt, indem es die Bedingung lockert und hdkPaginationConstraint aufzeichnet; jedes Seitenfragment erhält seinen eigenen Hintergrund und Rahmen
Optionale Silbentrennung
hyphens: none unterdrückt optionale Trennstellen, der Standard hyphens: manual verwendet U+00AD oder ­; ein sichtbarer Trennstrich wird nur ausgegeben, wenn die gewählte Trennstelle benutzt wird
hyphens: auto ruft zusätzlich OnHyphenate mit dem Wort und dem geerbten HTML-lang-Wert auf; ohne Callback bleibt es bei manuellen Trennstellen und meldet einen Layout-Fallback, weil kein Sprachwörterbuch mitgeliefert wird
Trennpositionen zählen UTF-16-Code-Einheiten ab Wortanfang; ungültige, außerhalb des Bereichs liegende, mitten im Surrogatpaar liegende und einfache Kombinationszeichen zerschneidende Positionen werden ignoriert
THPDFHTMLHyphenationEvent = procedure(
Sender: TObject;
const WordText, Language: WideString;
var BreakPositions: TArray<Integer>
) of object;
Begrenzte Flex- und Grid-Boxen
display: flex unterstützt row, row-reverse, column und column-reverse; Zeilenkinder nutzen explizite Breiten oder teilen sich die Restbreite, und positive flex-grow-Werte gewichten den zusätzlichen Platz
Zeilen unterstützen justify-content mit start, end, center, space-between, space-around und space-evenly sowie die Cross-Achsen-Ausrichtung start, end, center und stretch; der Spaltenfluss unterstützt natürliches vertikales Layout und erzeugt eine Diagnose für nicht unterstützte Verteilung bei fester Höhe oder Cross-Achsen-Ausrichtung
display: grid unterstützt positive Spaltentracks mit fester Länge und fr, einschließlich begrenztem repeat(n, tracks) mit bis zu 64 Spalten; Zellen werden in Quellreihenfolge platziert und füllen jeweils eine Zeile
grid-column: span N und grid-column-end: span N erlauben einem Kind, aufeinanderfolgende Tracks samt dazwischenliegenden Gaps zu belegen; ein Element, das nicht in die aktuelle Zeile passt, rückt in die nächste Zeile, und Spans größer als die Track-Anzahl erzeugen einen Layout-Fallback
flex-wrap: wrap beginnt eine neue Zeile, wenn die explizite Breite und das Gap des nächsten Elements nicht passen; jede Zeile wendet flex-grow und justify-content unabhängig an, während row-reverse und RTL die Positionen innerhalb jeder Zeile umkehren, ohne Elemente zwischen Zeilen zu verschieben
gap akzeptiert ein oder zwei Längen mit unabhängigen row-gap- und column-gap-Overrides; parallele Zeilen bleiben auf einer Seite und werden vor dem Zeichnen geprüft
Parallele Kinder unterstützen Textblöcke mit Inline-Styling, rekursiv verschachtelte gewöhnliche Blockcontainer mit Padding, Rahmen und Hintergründen, verschachtelte Flex- und Grid-Container, Bilder sowie statische oder native Formularsteuerelemente
Bilder verwenden Callback- oder Data-URI-Bytes, behalten ihr intrinsisches Seitenverhältnis bei, wenn keine Höhe angegeben ist, und werden je DOM-Knoten einmal dekodiert; Preflight und Fallback verwenden dasselbe zwischengespeicherte Bild, ohne eine weitere Ressourcenanfrage zu verbrauchen
Alle Kinderboxen werden gemessen, bevor eine parallele Zeile gezeichnet wird, sodass nicht unterstützter oder übermäßiger Inhalt in den vertikalen Seitenfluss zurückfällt, ohne bereits gezeichnete Zeilen zu wiederholen; verschachtelte Planung ist auf 64 Ebenen begrenzt und verbraucht das bestehende Layout-Operations-Budget
Umbruchende Kinder ohne explizite Breite belegen eine komplette Zeile; Tabellen und Listen innerhalb paralleler Kinder, Flex-Basis und Shrink, wrap-reverse, intrinsische Track-Bemessung, Grid-Zeilentracks und Row-Spans sowie explizite Grid-Platzierung bleiben außerhalb dieses Profils und erzeugen beobachtbare Diagnosen
Diagnosen für nicht unterstütztes CSS
Diagnostics legt Records mit Kind, Subject, Value und MessageText offen; OnDiagnostic erhält dieselben Informationen während des Renderings
Unbekannte Eigenschaften, nicht unterstützte Werte, Selektoren und At-Rules werden mit einer Diagnose ignoriert, einschließlich Deklarationen in sonst ungenutzten Stylesheet-Regeln; Pseudoselektoren werden übersprungen, statt als gewöhnliche Typselektoren behandelt zu werden
StrictCSS, standardmäßig deaktiviert, löst bei einer Diagnose EHPDFHTMLUnsupportedCSS aus; zuvor kann bereits Inhalt ausgegeben worden sein, daher sollten Aufrufer, die einen Alles-oder-Nichts-Import brauchen, ein separates Dokument verwenden
MaxDiagnostics steht standardmäßig auf 256 und begrenzt die vorgehaltenen Records; DiagnosticCount und die Callback-Auslieferung bleiben auch nach Erreichen der Speichergrenze beobachtbar, und ein nichtpositiver Grenzwert deaktiviert die Record-Speicherung
Begrenzte Ressourcen
Externe Stylesheets, Bilder und @font-face-Schriftarten sind deaktiviert, sofern OnResource ihre Bytes nicht bereitstellt, sodass der HTML-Import niemals implizit eine Datei oder Netzwerkverbindung öffnet
@font-face unterstützt eine url(...)-Quelle, optional format('truetype') oder format('opentype'), einen Familienalias, normalen oder kursiven Stil sowie die Gewichte normal, bold, 400 und 700; font-display akzeptiert die Standard-Policies, weil der Offline-Import Ressourcen synchron lädt
Schriftarten müssen einbettbare TrueType- oder OpenType-sfnt-Ressourcen mit einem ASCII-Windows-Familiennamen von höchstens 31 Zeichen sein; WOFF, Font-Sammlungen, local(...), variable Deskriptoren und Quelllisten erzeugen Diagnosen
Akzeptierte Schriftarten werden unter Windows privat im Prozessspeicher registriert und bleiben im Eigentum des Dokuments, bis es zerstört wird; das Freigeben des Importers vor EndDoc invalidiert die verzögerte Schrift-Einbettung daher nicht
data:-Ressourcen und Callback-Ergebnisse teilen die Grenzen MaxResources, MaxResourceBytes und MaxTotalResourceBytes
MaxDecodedImageBytes steht standardmäßig auf 128 MiB und begrenzt den dekodierten Bildcache unabhängig mit vier Bytes pro Pixel; BMP- und PNG-Abmessungen werden vor dem Dekodieren geprüft, und jedes akzeptierte Bild wird geprüft, bevor es vorgehalten wird
MaxDOMNodes, MaxCSSRules und MaxLayoutOperations begrenzen unabhängig Parsing, Aufbau der Kaskade und Layoutarbeit
THPDFHTMLResourceEvent = procedure(
Sender: TObject;
const URI: WideString;
ResourceKind: THPDFHTMLResourceKind;
var Data: TBytes;
var ContentType: string;
var Handled: Boolean
) of object;
Statistik
THPDFHTMLImportStatistics meldet Profilversion, analysierte Knoten, CSS-Regeln, Layoutoperationen, Seitenumbrüche, Tabellen, Formularsteuerelemente, Ressourcenanfragen, akzeptierte und abgewiesene Ladevorgänge, akzeptierte Ressourcenbytes, gemessene Textzeilen, Zeilen mit Trennstrich, Diagnosen, Flex-Container und Grid-Container
OnLineLayout erhält nach der tatsächlichen PDF-Textausgabe die nullbasierten Seiten- und Absatzzeilenindizes der Zeile, ihren Ursprung, die gemessene Breite und Höhe, den logischen Text, die Richtung und das Silbentrennungs-Flag
Jeder RenderHTML5-Aufruf setzt den Statistik-Record zurück, und Verstöße gegen das Budget lösen EHPDFHTMLImportBudget aus
Beispiel
Importer := THPDFHTMLImporter.Create(Doc);
try
Importer.CreateAcroForms := True;
Importer.MaxResources := 16;
Importer.RenderHTML5(
'<style>@page { margin: 36pt } ' +
'table { width: 100% }</style>' +
'<h1>Invoice</h1>' +
'<table><tr><td>Total</td><td>42</td></tr></table>' +
'<input name="approved" type="checkbox">'
);
finally
Importer.Free;
end;Siehe auch: THPDFPage.TextOutHTML, Deklaratives Layout-DOM, AcroForm-Unterstützung