SVG Form XObject 匯入
THotPDF.ImportSVGFormXObject 只解析一次 SVG 並註冊一個可重用的 PDF Form XObject,THPDFPage.DrawSVGFormXObject 則以任意大小放置它,並可選擇建立頁面連結註解
宣告
function ImportSVGFormXObject(const Input: TBytes): AnsiString; overload;
function ImportSVGFormXObject(
const Input: TBytes;
out Statistics: THPDFSVGImportStatistics
): AnsiString; overload;
procedure DrawSVGFormXObject(
const FormName: AnsiString;
X, Y, W, H: Single;
AddLinks: Boolean = True
);
向量設定檔
- 幾何包含帶橢圓弧的路徑、矩形、圓角矩形、圓形、橢圓、線、折線、多邊形、變換、群組、symbol,以及僅限片段的
use參照 - 著色包含純 RGB 顏色、填色與描邊不透明度、填色規則、線端與轉角樣式、繼承的虛線陣列與偏移、斜接限制、線性與放射狀漸層向量帶、以彩色平鋪圖樣支援的漸層描邊,以及裁切路徑
- 物件與群組不透明度使用隔離的向量透明度 Form,重疊的後代會先合成,才套用外圍的不透明度
- 遮罩變成帶 PDF Alpha 或 Luminosity 軟遮罩的透明群組 Form 資源,包括遮罩區域裁切、
maskUnits、maskContentUnits與有界的巢狀遮罩參照 - CSS 包含內嵌 type、class、ID 與複合選擇器、呈現屬性、行內樣式、優先權計算、來源順序與
!important - 文件匯入透過原生撰寫引擎內嵌 Unicode 字型子集與
ToUnicode對應,使用已組態的字型後援鏈,把後援段對齊到共同的字母基線,並以實際字形前進量計算文字錨定 - 內嵌的 PNG 與 JPEG 影像變成可重用的 Image XObject,PNG alpha 保留為軟遮罩,並支援
preserveAspectRatio="none"、置中meet與置中slice - HTTP、HTTPS 與 mail 連結保留為放置感知的 PDF 連結註解,不會成為可重用 Form 串流的一部分
文字與著色邊界
文字支援實心填色、粗體與斜體變體、字型大小、變換、錨定、不透明度與幾何裁切;漸層文字著色一律失敗關閉,每個 text 或 tspan 節點仍是獨立定位的執行段,而不是完整的 SVG 文字流排版引擎
文件文字匯入透過樣式感知的字形檢查與後援版面保留選定的粗體與斜體字面,保留實測的墨跡邊界,並拒絕真正無法解析的字形
UTF-8 文字與十六進位或十進位 XML 字元參照在 Delphi 與 FPC 上保留相同的 Unicode 純量,包括由 UTF-16 surrogate 配對表示的補充純量
沒有文字建構器的獨立 HPDFBuildSVGFormData 多載使用實測的 Helvetica、Times 與 Courier Base 14 前進量,遇到 WinAnsi 以外的字元會直接拒絕而不是替代成問號;帶 THPDFSVGTextRunBuilder 的多載則接受呼叫端提供的內嵌文字 Form 與度量
漸層保留有界的向量帶近似;透明資源需要 PDF 1.4,會被 PDF/A-1 嚴格設定檔拒絕
描邊樣式
stroke-dasharray、stroke-dashoffset 與 stroke-miterlimit 可透過呈現屬性、內嵌 CSS、行內樣式與繼承生效,包括群組與僅限片段的 use 執行個體
虛線陣列接受逗號或空白分隔的數字與支援的長度;百分比採用正規化的 viewport 對角線,計算方式為 sqrt((viewWidth * viewWidth + viewHeight * viewHeight) / 2)
奇數長度陣列會重複以形成偶數長度圖樣,每個子路徑重新開始圖樣,正負偏移都會對完整圖樣取模繞行;none 與全零陣列產生實心描邊
零長度的繪製虛段保留圓頭或方頭記號;普通實心描邊、漸層描邊圖樣、剪裁、遮罩與隔離的不透明度群組共用所選的描邊設定
預設斜接限制為 4;接受 SVG 2 介於 0 與 1 之間的值,斜接超過限制時改用斜切接合,漸層與透明度資源邊界則在所選限制內保留尖角接合
原生轉譯使用有界的虛線幾何來保留偏移、小數長度與超過 GDI 筆極限的陣列,採用自適應曲線扁平化,並在區段邊界之間保持連續的繪製接合
以 pathLength 校準虛線仍不在此設定檔內;結合非實心虛線陣列與 pathLength 的形狀會失敗關閉,不會默默使用未校準的長度
描邊語意遵循SVG 2 描邊模型,受後述解析器與轉譯器預算約束
文字塑形組態
內嵌 SVG 文字使用匯入文件的 ShapingFeatures、AutoShapeArabic、AutoShapeSyriac、AutoShapeNko、AutoShapeAdlam 與 AutoShapeHanifiRohingya 設定,連同其 GSUB 腳本與語言選擇及字型後援鏈
這些設定同時作用於實測前進量與產生的文字外觀,且不會改動呼叫端的組態;塑形仍需主動啟用,並要求字型提供要求的字形與 OpenType 表
每個產生的文字外觀最多接受 256 個不同的塑形字型選擇與 64 MiB 的累計原始字型資料;不支援的字型資料或超限會讓匯入原子失敗
物件與群組不透明度
opacity 對其節點的完整繪製結果一次性生效,不會被後代繼承;fill-opacity 與 stroke-opacity 保留各自可繼承的著色值
<g opacity="0.5"> 內兩個重疊的不透明紅色矩形,在其重疊處維持同樣的半透明;兩個各自半透明的矩形則會在重疊處變得更深
巢狀群組按順序合成:兩層 0.5 的外圍不透明度對不透明後代的等效值是 0.25,而後代明確的 opacity 1 不會覆寫外圍群組
根 SVG 節點、容器、連結、片段參照、文字、影像與形狀走同一條物件不透明度路徑;僅限片段的 use 參照同時保留執行個體與被參照節點的樣式
填色與描邊 alpha 保持獨立,包括在半透明物件內兩者重疊之處;漸層站點 alpha 會在物件合成前與相關著色 alpha 結合
剪裁與遮罩效果屬於其節點本身,不會當成後代著色設定繼承;連結幾何保持放置感知,隔離 Form 邊界則保守地保留變換後的描邊與端點
匯入器在隔離群組內保留向量運算子、內嵌文字 Form、影像資源、圖樣與遮罩;不會把整個 SVG 扁平化成點陣圖
受支援的行為遵循SVG 物件與群組不透明度模型;本頁其他有界的文字、漸層與幾何限制依然適用
安全性與預算
匯入器接受最大 8 MiB 的純文字或 gzip 壓縮 SVG,展開輸入上限 32 MiB,主運算子與 pattern、遮罩、群組運算子合計上限 16 MiB,節點 4,096 個、巢狀 64 層、CSS 規則 256 條、路徑值 100,000 個
內嵌影像只接受嚴格的 Base64 data:image/png;base64, 與 data:image/jpeg;base64, 酬載,最多 128 張影像、單邊 16,384 像素、全部影像合計 16,777,216 個已解碼像素;尺寸會在原生解碼前檢查
文字以 128 個執行段、每段 65,536 個 UTF-16 單元為界;漸層描邊圖樣、遮罩與隔離的不透明度群組則各有 128 個資源的上限;遞迴遮罩參照一律失敗關閉
虛線陣列在奇數陣列展開前最多 64 個來源條目;正值條目至少 0.000001 使用者單位,單一長度與正規化週期不得超過 1,000,000,000,絕對偏移不得超過 1,000,000,000,斜接限制必須介於 0 與 1,000,000 之間
實際巢狀的透明效果限制在八層以對齊原生轉譯器,與 SVG 樹深限制無關;沒有透明效果的普通巢狀容器不消耗這個額度
透明效果的邊界必須是有限值,每個座標的絕對值不得超過 1,000,000,000;超出這個有界座標設定檔的匯入會在群組或遮罩註冊前失敗
失敗的匯入會回復產生的物件、內嵌文字 Form、註冊表條目與版本及裝置色彩狀態,呼叫端因此能重用同一份文件並保留外圍的圖形交易
腳本、事件處理器、DTD、foreignObject、不支援的 data 媒體類型、JavaScript URL 與外部著色或影像資源 URL 一律失敗關閉
url(#gradient)、url(#clip)、href="#symbol" 之類的片段參照只留在已解析文件內,絕不觸發檔案或網路存取
統計
THPDFSVGImportStatistics 回報節點數、CSS 規則數、漸層數、漸層描邊數、遮罩數、影像數、連結數、文字執行段、透過 GroupCount 回報的隔離不透明度群組數,以及主運算子與 pattern、遮罩、群組運算子的合計產生位元組
HPDFBuildSVGFormData 透過 THPDFSVGFormData 與 THPDFSVGLinkInfo 單獨公開有界解析器,給需要在註冊前取得 Form 內容、固有尺寸、不透明度資源、影像酬載、pattern 與遮罩串流、文字資源名稱或連結中繼資料的呼叫端;Groups 提供隔離的群組運算子串流與保守的 Form 邊界
範例
Document.BeginDoc;
FormName := Document.ImportSVGFormXObject(SVGBytes, Statistics);
if FormName = '' then
raise Exception.Create('SVG import failed');
Document.CurrentPage.DrawSVGFormXObject(
FormName,
36,
72,
240,
120,
True
);
Document.CurrentPage.DrawSVGFormXObject(
FormName,
320,
72,
120,
60,
False
);
另請參閱: THotPDF.ImportSVGFormXObject, THPDFPage.DrawSVGFormXObject, HTML5 分頁媒體匯入