自動 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 RGB8 與 16 位元彩色取樣
PNG 索引色1、2、4 與 8 位元索引,經調色盤展開為 RGB 取樣
PNG 透明灰階與 RGB 透明取樣、調色盤 alpha,以及 8 或 16 位元的灰階-alpha 與 RGBA;實際的 /SMask 串流保留 alpha 精度
PNG 濾波與交錯全部五種 PNG 列濾波器與 Adam7 掃描,透過共用的原生 zlib 與 predictor 實作驗證
JPEG8 位元 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