原生 rich text 外部樣式表
原生 XHTML 解碼器把 XHTML link 元素與 CSS @import 規則參照的呼叫端 CSS 資源,套用到真實的 rich text run、儲存的 rich 值與欄位外觀
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>
資源身分與串接
相對參照使用 RFC 3986 路徑合併與點段移除;query string 屬於資源身分而 fragment 不屬於,scheme 與 host 字母做大小寫正規化而 userinfo 保留原大小寫,百分比跳脫的十六進位字母比較時不區分大小寫
每張匯入的樣式表針對自身 URI 解析進一步的 import,並擁有獨立的 CSS 命名空間環境;匯入一張樣式表不會把它的 @namespace 宣告洩漏給父層
import 接受帶引號字串與 url token(含 CSS 跳脫),位置在一般規則或命名空間宣告之前;既有的 print/screen media query 求值器控制 link media 與 import 條件
匯入的宣告按真實來源位置進入串接,importance 與 specificity 照常;循環參照僅在該資源處於作用中狀態時被略過,因此稍後重複參照可以再次生效
缺失資源、非法撰寫參照與非 CSS 內容型別不提供宣告;呼叫端提供的非法資源集合拋出 EHPDFHeadlessRichTextCodecError
XHTML 參照與選取集合
stylesheet 關係 token 比較不區分 ASCII 大小寫;被停用的 link 被忽略,media 與 type 屬性決定被參照樣式表是否參與
內嵌 style 元素與連結樣式表共用同樣區分大小寫的 title 集合;無標題的持續樣式表保持啟用
沒有明確 StyleSheetTitle 時,第一個符合資格的帶標題內嵌 style 或非 alternate link 選出 preferred 集合;解碼器在收集宣告之前決定該標題,因此帶選中標題的較早 alternate 會在其原始串接位置參與
明確 StyleSheetTitle 選取相符標題的內嵌與連結樣式表,alternate 也包括;沒有相符樣式表的標題只保留持續樣式表啟用
preferred 標題掃描接受空 type 或 text/css,略過停用或 alternate 的 link;資源可用性與 media 條件不改變選中的標題,宣告仍服從各自的 media、type 與資源檢查
HTML 與 XML base 解析
XHTML head 內第一個帶 href 的 XHTML base 元素,把 href 對照 DocumentURI 解析後作為文件基準;base 元素或其祖先上的 xml:base 不影響這次查找
解碼器隨後從該文件基準出發,逐層套用每個祖先的 xml:base 來解析 link 參照與內嵌 import;連結或匯入的樣式表針對自己的資源 URI 解析自身的 import
例如 DocumentURI=https://example.test/docs/form.xhtml、根 xml:base="a/"、head base href="b/"、link href="main.css",解析為 https://example.test/docs/b/a/main.css
第一個 base href 為空時使用後備文件 URI;第一個 base href 非法時同樣保留後備並消耗第一 base 的位置,後續 base 元素無法替換
這個次序定義了原生解碼器的 HTML/XML 組合 profile;XML Base 本身並未定義該如何與獨立的 HTML base 機制結合
Form 資料與 JSON 操作
透過原生文件方法匯入 FDF RV 或 XFDF value-richtext 時,在 THPDFHeadlessFormDataOptions 上設定 RichTextDocumentURI、RichTextStyleSheetTitle 與 RichTextStyleSheets
Windows 檔案工作、Windows execute-json-v1 與版本化原生 Linux C ABI 都在 forms.import 上接受同樣的選用 richTextResources 物件
{
"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"}
]
}
}
每個 JSON 資源的 URI 必填且非空;css 與 contentType 是選用字串,documentURI 與 styleSheetTitle 同樣選用;提供的字串不得包含 NUL
資源是宿主提供的 Unicode CSS 文字;URI 識別碼不請求檔案系統存取、網路存取,也不更動 callback 記錄配置
外圍匯入交易在資源畸形、取消、預算失敗或發佈失敗時保留先前文件;語義等價的重複匯入保留既有的位元組一致 no-op 行為
可重複使用的非 GUI 驗收
Tests/Linux/ExternalStyleSheets/Run.py 檢查真實解碼 run、設有上限的失敗行為、儲存外觀以及獨立的 PDF 幾何與像素;其 Callbacks 目錄演練真實的 FDF/XFDF 匯入、no-op 位元組與發佈失敗交易
Tests/Linux/ExternalStyleSheets/Supplement/Run.py 檢查共用的內嵌/連結 title 集合、組合 HTML/XML base 解析、每個實測自動標題取消邊界,以及深度失敗後成功重試
supplement 接受明確來源目錄與編譯器設定,記錄真實來源與相依身分,並要求每次執行使用新的輸出目錄
邊界與剩餘工作
資源數至多 256,每個解析後 URI 至多 4096 個 UTF-16 code unit,每個標題或內容型別至多 256;樣式表文字同樣服從 MaxCodeUnits,彙總掃描與比對計入既有的節點、總 code unit、深度與取消限制
Form 資料綁定使用 MaxValueCodeUnits、MaxTotalCodeUnits、MaxObjects、MaxDepth 與操作的 cancellation token 作為對應解碼器限制
匯入層、更多 CSS 排版、表格、影像與更廣的 HTML 資源載入仍是獨立工作
選擇器與內部樣式表 · media profile · Form 資料選項
原生 supports 查詢用受支援的宣告與選擇器 profile 接納 @supports 群組與 supports() 匯入,共用邊界並支援取消後復原