Native Rich-Text-externe Style-Sheets
Der native XHTML-Decoder wendet vom Aufrufer gelieferte CSS-Ressourcen, auf die XHTML-link-Elemente und CSS-@import-Regeln verweisen, auf echte Rich-Text-Runs, gespeicherte Rich-Werte und Field-Appearances an
Options := THPDFHeadlessRichTextDecodeOptions.Default;
Options.DocumentURI := 'https://example.test/forms/order.xhtml';
SetLength(Options.StyleSheets, 2);
Options.StyleSheets[0].URI := 'css/main.css';
Options.StyleSheets[0].CSS := '@import "colors.css"; span.total { font-weight: bold }';
Options.StyleSheets[0].ContentType := 'text/css';
Options.StyleSheets[1].URI := 'css/colors.css';
Options.StyleSheets[1].CSS := 'span.total { color: #a02030 }';
Runs := HPDFDecodeHeadlessRichText(XHTML, Options);
<body xmlns="http://www.w3.org/1999/xhtml">
<link rel="stylesheet" href="css/main.css" />
<span class="total">Total</span>
</body>
Ressourcen-Identität und Kaskade
Relative Referenzen nutzen RFC-3986-Pfad-Merging und Dot-Segment-Entfernung; Query-Strings bleiben Teil der Ressourcen-Identität, Fragmente nicht, Scheme- und Host-Buchstaben werden normalisiert, während User-Informationen ihre Schreibweise behalten, und Prozent-Escape-Hex-Buchstaben vergleichen ohne Groß-/Kleinschreibung
Jedes importierte Sheet löst weitere Imports gegen seinen eigenen URI auf und hat eine unabhängige CSS-Namespace-Umgebung; das Importieren eines Sheets leakt die @namespace-Deklarationen dieses Sheets nicht in sein Parent
Imports akzeptieren quoted Strings und url-Tokens, einschließlich CSS-Escapes, vor gewöhnlichen Regeln oder Namespace-Deklarationen; der bestehende Print/Screen-Media-Query-Evaluator steuert Link-Media- und Import-Bedingungen
Importierte Deklarationen treten an ihrer tatsächlichen Quellposition mit normaler Importance und Specificity in die Kaskade ein; eine zyklische Referenz wird nur übersprungen, während diese Ressource aktiv ist, sodass spätere wiederholte Referenzen erneut beitragen können
Fehlende Ressourcen, ungültige authored Referenzen und Nicht-CSS-Content-Types tragen keine Deklarationen bei; ungültige vom Aufrufer gelieferte Ressourcen-Collections werfen EHPDFHeadlessRichTextCodecError
XHTML-Referenzen und Selected Sets
Stylesheet-Relation-Tokens vergleichen ohne ASCII-Groß-/Kleinschreibung; deaktivierte Links werden ignoriert, und Media- und Type-Attribute steuern, ob ein referenziertes Stylesheet teilnimmt
Inline-Style-Elemente und verlinkte Sheets teilen dieselben case-sensitiven Title-Sets; unbenannte persistente Sheets bleiben aktiviert
Ohne explizites StyleSheetTitle wählt das erste geeignete betitelte Inline-Style oder Nicht-Alternate-Link das bevorzugte Set; der Decoder bestimmt diesen Titel, bevor er Deklarationen sammelt, sodass ein früherer Alternate mit dem gewählten Titel an seiner ursprünglichen Kaskadenposition teilnimmt
Ein explizites StyleSheetTitle wählt passende betitelte Inline- und verlinkte Sheets, einschließlich Alternates; ein Titel ohne passendes Sheet lässt nur persistente Sheets aktiviert
Der Preferred-Title-Scan akzeptiert einen leeren Type oder text/css und überspringt deaktivierte oder Alternate-Links; Ressourcenverfügbarkeit und Media-Bedingungen ändern den gewählten Titel nicht, und Deklarationen gehorchen weiterhin ihren eigenen Media-, Type- und Ressourcenprüfungen
HTML- und XML-Base-Auflösung
Das erste XHTML-base-Element mit href innerhalb eines XHTML-head liefert die Dokumentbasis, indem sein href gegen DocumentURI aufgelöst wird; xml:base auf dem Base-Element oder dessen Vorfahren ändert diesen Lookup nicht
Der Decoder wendet dann jedes Ancestor-xml:base einmal an, beginnend an dieser Dokumentbasis, um Link-Referenzen und Inline-Imports aufzulösen; ein verlinktes oder importiertes Sheet löst seine eigenen Imports gegen seine Ressourcen-URI auf
Beispielsweise lösen DocumentURI=https://example.test/docs/form.xhtml, root xml:base="a/", head base href="b/" und link href="main.css" zu https://example.test/docs/b/a/main.css auf
Ein leerer erster base-href nutzt die Fallback-Dokument-URI; ein ungültiger erster base-href behält ebenfalls diesen Fallback und verbraucht die First-Base-Position, sodass spätere base-Elemente sie nicht ersetzen
Diese Ordnung definiert das kombinierte HTML/XML-Profil des nativen Decoders; XML Base definiert selbst nicht, wie ein separater HTML-Base-Mechanismus damit kombiniert werden soll
Form-Data- und JSON-Operationen
RichTextDocumentURI, RichTextStyleSheetTitle und RichTextStyleSheets an THPDFHeadlessFormDataOptions setzen, wenn FDF-RV oder XFDF-value-richtext über native Dokumentmethoden importiert wird
Windows-Dateijobs, Windows execute-json-v1 und die versionierte native Linux-C-ABI akzeptieren dasselbe optionale richTextResources-Objekt bei forms.import
{
"schemaVersion": 1,
"type": "forms.import",
"format": "xfdf",
"richTextResources": {
"documentURI": "https://example.test/forms/order.xhtml",
"styleSheetTitle": "Print",
"styleSheets": [
{"uri": "css/main.css", "css": "span.total { color: red }", "contentType": "text/css"}
]
}
}
URI ist für jede JSON-Ressource erforderlich und nichtleer; css und contentType sind optionale Strings, ebenso documentURI und styleSheetTitle; gelieferte Strings dürfen kein NUL enthalten
Ressourcen sind vom Host gelieferter Unicode-CSS-Text; URI-Identifier fordern keinen Dateisystemzugriff, keinen Netzwerkzugriff und keine Änderungen an Callback-Record-Layouts an
Die umgebende Import-Transaktion bewahrt ihr früheres Dokument bei fehlerhaften Ressourcen, Abbruch, Budget-Fehler oder Veröffentlichungs-Fehler; exakt äquivalente Importe behalten das bestehende byteidentische No-op-Verhalten
Wiederverwendbare Nicht-GUI-Abnahme
Tests/Linux/ExternalStyleSheets/Run.py prüft echte dekodierte Runs, begrenztes Fehlerverhalten, gespeicherte Appearances und unabhängige PDF-Geometrie und -Pixel; sein Callbacks-Verzeichnis übt echte FDF/XFDF-Importe, No-op-Bytes und Failed-Publication-Transaktionen
Tests/Linux/ExternalStyleSheets/Supplement/Run.py prüft geteilte Inline/Link-Title-Sets, kombinierte HTML/XML-Base-Auflösung, jede gemessene Automatic-Title-Abbruch-Grenze und Tiefen-Fehler gefolgt von erfolgreichem Retry
Das Supplement akzeptiert ein explizites Quellverzeichnis und eine Compiler-Konfiguration, hält die tatsächliche Quell- und Dependency-Identität fest und verlangt ein neues Output-Verzeichnis je Ausführung
Grenzen und verbleibende Arbeiten
Die Ressourcenanzahl beträgt höchstens 256, jede aufgelöste URI höchstens 4096 UTF-16-Code-Einheiten, und jeder Titel oder Content-Type höchstens 256; Stylesheet-Text gehorcht außerdem MaxCodeUnits, mit aggregierten Scans und Matching, belastet auf die bestehenden Node-, Total-Code-Unit-, Tiefen- und Abbruchlimits
Form-Data-Bindings nutzen MaxValueCodeUnits, MaxTotalCodeUnits, MaxObjects, MaxDepth und das Cancellation-Token der Operation für die entsprechenden Decoder-Limits
Import-Layer, zusätzliches CSS-Layout, Tabellen, Bilder und breiteres HTML-Ressourcen-Laden bleiben separate Arbeiten
Selektoren und interne Style-Sheets · Media-Profile · Form-Data-Optionen
Native Support-Queries nehmen @supports-Gruppen und supports()-Imports an, mit dem unterstützten Deklarations- und Selektor-Profil, gemeinsamen Grenzen und Abbruch-Recovery