自動 XFA 原生圖形與影像
單元:HPDFXFAHeadless
HPDFXFAWriteHeadlessPDF 直接從 XDP 消耗 rectangle、line、arc 與行內影像的 draw callback,與既有的文字和 widget 消費端並行
每個 draw 都會產生一個放到實際版面頁面上的原生 Form XObject;影像 draw 包含真實的 Image XObject,必要時還有 alpha 軟遮罩
向量路徑
矩形使用原生 PDF 矩形路徑,線保留斜線或反斜線斜率,橢圓弧使用最大 90 度的三次曲線段
第一個生效的 edge 提供 RGB 筆畫顏色與粗細,包括次點寬度;筆畫外觀邊界包含一半粗細,因此 Form 不會裁掉自己的框線
arc 消耗 startAngle 與帶正負號的 sweepAngle,預設整圈,絕對掃角最大 360 度
draw 的旋轉、縮放與平移提示,會在 draw 中心周圍以一次有限的仿射放置套用,旋轉以逆時針為正;XFA 的左上角座標一次性轉換成原生 PDF 原點
PNG 與 JPEG
| 格式 | 實際的原生消耗 |
|---|---|
| PNG 灰階 | 1、2、4、8 與 16 位元取樣,緊密打包的取樣會展開為 8 位元,16 位元精度保留 |
| PNG RGB | 8 與 16 位元彩色取樣 |
| PNG 索引色 | 1、2、4 與 8 位元索引,經調色盤展開為 RGB 取樣 |
| PNG 透明 | 灰階與 RGB 透明取樣、調色盤 alpha,以及 8 或 16 位元的灰階-alpha 與 RGBA;實際的 /SMask 串流保留 alpha 精度 |
| PNG 濾波與交錯 | 全部五種 PNG 列濾波器與 Adam7 掃描,透過共用的原生 zlib 與 predictor 實作驗證 |
| JPEG | 8 位元 baseline 與 progressive 的灰階、RGB 與 CMYK 幀,先以共用的原生 JPEG 解碼器驗證,再保留原始的 /DCTDecode 串流 |
PNG chunk 總和檢查碼、順序、尺寸、調色盤索引、透明取樣範圍與精確的解壓縮長度,都會在提交候選前檢查;截斷或多餘的壓縮資料會讓準備失敗
JPEG 幀尺寸必須與真實的原生解碼一致,Adobe CMYK 反轉會在影像字典中明確宣告
JPEG 需要既有的原生 TurboJPEG 執行階段;HOTPDF_TURBOJPEG_LIBRARY 可以指定絕對程式庫路徑,相依程式庫交由作業系統搜尋
影像 aspect 支援 fit、none、width、height 與 actual;PNG pHYs 與 JPEG JFIF 密度決定實體像素尺寸,沒有可用密度時使用 96 dpi
縮放後的影像置中並裁切到 XFA draw 矩形;alpha 合成仍是原生 PDF 閱讀器的職責
邊界與交易
編碼影像位元組、解碼工作緩衝與原始影像或 alpha 串流,都在配置前設限;原生物件限制與彙總的影像及字型串流限制持續生效
解析 chunk、解壓資料、解碼列與放置原生物件時都會檢查取消;既有的原生 JPEG 解碼器會收到呼叫端權杖
準備失敗會保留目的地的位置、長度與位元組;最後的 WriteBuffer 遵循呼叫端串流自己的 I/O 語意
目前邊界
填色形狀、corner 樣式、edge 專屬框線、虛線樣式、條碼、外部影像傳輸、imageEdit widget、其他影像格式、內嵌色彩設定檔與 Exif 方向,仍需要更多消費端整合
動畫 PNG 按其預設靜態影像消耗;外部 XML exData 仍是另一項功能,而且這個 draw adapter 不會執行任意內嵌物件
驗收
Tests/Linux/Build-XFAHeadlessGraphicFixtures.py 產生確定性的列濾波、Adam7、取樣精度、透明、實體 aspect、JPEG 與格式錯誤協定的測試素材
Tests/Linux/XFAHeadlessGraphicsTests.pas 寫入並重新開啟實際的原生 PDF,並驗證失敗時呼叫端資料的保留;Verify-XFAHeadlessGraphics.py 以 pypdf 與 MuPDF 獨立檢查解碼影像取樣、/SMask 精度、向量運算子、放置與 render 像素
自動 XFA 原生 PDF 建立描述既有的欄位與文字消費端,以及公開的選項與結果 API