可選文件處理器
THPDFDocumentHandlerRegistry 在弱式副檔名或 MIME 提示之前依檢查的內容選取可取代的處理器,然後把選定的來源轉換成一個由匯出與轉譯共享的不可變 PDF 快取
內建可選處理器
- XPS 與 OpenXPS 從
Glyphs元素保留固定頁面維度、順序順序與文字,同時回報不支援的固定頁面繪製功能LinearGradientBrush與橢圓形RadialGradientBrush著色模式填色,並透過套件中的 JPEG、PNG、TIFF 或 JPEG XRImageBrush資源,以TileMode=None填充路徑 - XPS 影像填色支援絕對或
RelativeToBoundingBox的Viewbox與Viewport對應、None、Tile、FlipX、FlipY、FlipXY平鋪模式、原生路徑與放置裁剪、有限的六參數Transform屬性或ImageBrush.TransformMatrixTransform元素、筆刷與路徑透明度、PNG 柔邊遮罩 alpha、影像 DPI,以及套件資源快取 - XPS
Path.OpacityMask支援純色、多站點線性或橢圓放射漸層,以及 PNGImageBrush遮罩,包含重複與反射的影像儲存格;均勻 alpha 會摺入既有的 graphics state,變動 alpha 則使用有界的原生 DeviceGray 透明群組,共用著色模式與影像柔邊串流 - XPS Canvas
Opacity與Canvas.OpacityMask透過隔離的 DeviceRGB Form XObject 對重疊的子系只合成一次,而不是各自衰減每個子系;均勻遮罩 alpha 摺入群組狀態,變動的漸層或 PNG 影像 alpha 重用原生柔邊資源,巢狀群組則在每群 4,096 個群組與 16 MiB 擷取內容的上限內,保留轉換後的裁剪、資源所有權與有界的連結註解 - XPS
VisualBrush遞迴轉換內嵌或資源後備的Canvas、Path與Glyphsvisual,解析巢狀與遠端的ResourceDictionary範圍,把絕對Viewbox對應到絕對或相對Viewport,並在直接、平鋪與反射放置之間重用單一有界的 PDF Form XObject - XPS
Canvas.Clip接受有界的縮寫幾何、本機或遠端StaticResource的PathGeometry值,以及帶有結構化直線、Bézier、二次曲線或弧線圖形的直接屬性元素、幾何轉換、空幾何,與EvenOdd或NonZero填充規則;巢狀裁剪會成為原生 PDFW*或W路徑,導覽矩形會與目前轉換後的裁剪邊界求交集,解析上限為 100,000 個數值,格式錯誤或奇異的裁剪會在子 visual 繪製前以失敗收場 - XPS
Glyphs最多接受 65,536 個嚴格的Indices對應,保留一對多與多對一的 cluster 推進、以 em 百分之一為單位的明確前進量、水平與垂直偏移、奇數BidiLevel的反向推進、純色屬性或屬性元素填充、透明度、Unicode 擷取,以及輸入格式錯誤時的 fail-closed 診斷;簡單 run 使用原生 PDFTJ陣列,大型對應緩衝區則以攤提的線性成本成長 - 套件
FontUri資源支援 TrueType 與 OpenType 程式、TTC 成員片段與 XPS GUID 混淆字型;確切的 glyph ID、cmap 衍生的 run、cluster、前進量、偏移、RTL 原點、字型資源重用、內嵌權限、選用的子集化與ToUnicode擷取對應,都保持為原生 PDF 字型資料,不經 GDI 替代 - 轉換後
Path與Glyphsvisual 上的 XPSFixedPage.NavigateUri會成為原生 PDF 連結註解,邊界由幾何或度量推導;HTTP、HTTPS 與 mail 連結維持 URI 動作,套件相對頁面與百分比解碼後的LinkTarget片段,則在所有頁面就緒後變成向前或向後的 GoTo 動作 - Canvas 的
FixedPage.NavigateUri會成為每個子代Path、Glyphs或巢狀 Canvas visual 的繼承目標,直到某個子代提供自己的 URI 為止;範圍化目標在巢狀覆寫結束後恢復,跟隨各 visual 的幾何與轉換,受目前 Canvas 裁剪約束,在隔離的透明度群組擷取後仍存活,並在可重用的VisualBrushForm 內保持抑制 - 導覽上限為 65,536 個連結、每個 URI 8,192 字元,發布期間檢查取消狀態,在可重用
VisualBrush擷取期間抑制,並拒絕控制字元、不安全的 scheme、遺失的目標,或路徑與片段不符 - 非標準的
RelativeTransform、未解析的矩陣資源、Repeat 或 Reflect 漸層擴散、非 sRGB 插值、變動 alpha 的繪圖筆刷、色彩轉換、影像筆畫、相對VisualBrush - EPUB 解析
container.xml、manifest 與 spine 順序,然後使用只帶回呼套件資源的有界 HTML5 分頁媒體匯入器 - CBZ 辨識支援的影像項目、套用確定的自然檔案名稱順序,並在設定的影像 DPI 下為每個影像建立一頁
預算與失敗隔離
單趟經過驗證的 ZIP 中央目錄掃描,會在轉換前強制執行項目數、壓縮位元組、展開位元組、單項、重複路徑、不安全路徑與壓縮比上限
經典 PKZIP ZipCrypto 項目可透過 ArchivePasswordCallback 請求憑證;callback 收到來源名稱、項目名稱與 1 起始的嘗試次數,而 MaxPasswordAttempts 把重試次數限制在 1 到 16
憑證與部分解碼的項目位元組只存在於記憶體,並在每次嘗試之間清除;每次 callback 前後都檢查取消狀態;缺少 callback、憑證被拒、重試耗盡或不支援的加密都以失敗收場
一次已驗證的 ZIP 中央目錄掃描在轉換之前強制項目、壓縮位元組、展開位元組、逐項目、加密、重複路徑、不安全路徑與壓縮比例限制
受密碼保護的項目要有 Delphi 12 或更新版本,其 System.Zip 才提供解密掛鉤;若以更早的 Delphi 版本建置,handler 仍能讀取未加密的項目,但會在呼叫 ArchivePasswordCallback 之前就把加密項目視為不支援而拒絕
大小或位移需要 ZIP64 欄位的項目,必須使用 Delphi 11 或更新版本;更早的 Delphi 版本會把它們視為不支援而拒絕
資源、重排、頁面、像素、DPI、輸出與取消限制在整個轉換與轉譯期間保持有效,而失敗的輸出發佈會還原可尋址的目標串流
註冊與使用
var
Registry: THPDFDocumentHandlerRegistry;
Options: THPDFDocumentHandlerOptions;
Handled: IHPDFHandledDocument;
Info: THPDFDocumentHandlerInfo;
begin
Registry:= THPDFDocumentHandlerRegistry.Create;
try
Registry.RegisterStandardHandlers;
Options:= THPDFDocumentHandlerOptions.Default;
if Registry.OpenFromFile('book.epub', '', Options, Handled, Info) then
Handled.WritePDF(OutputStream, Options, Info);
finally
Registry.Free;
end;
end;