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

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