|
JBIG2 壓縮支援
總覽
HotPDF 為掃描文字、表單與線條圖使用的雙階影像提供 JBIG2 壓縮與解碼
主要特色
- 雙階影像的高效率壓縮
- 同時支援有損與無損壓縮模式
- 針對文字與線條圖壓縮最佳化
- 相較傳統壓縮方式可大幅縮小檔案
- 多頁編碼共用一個訓練出的符號字典,每個影像 XObject 都引用它
- 分類前偵測完全相同的頁面,PDF 組裝時重用已編碼的 XObject
- 有邊界的頁面與像素預算,並可選擇原生 Pascal 後備路徑
壓縮優勢
- 跨頁重用: 重複出現的符號只分類一次,儲存在共用的全域資料裡
- 符號比對: 搭配
UseSymbolDictionary,重複出現的黑色連通元件只儲存一次成為符號,而 LossyLevel 讓近乎相同的元件共用同一個符號
- 記憶體效率: 針對大型掃描文件處理最佳化
典型使用情境
- 掃描文字文件
- 技術圖紙與藍圖
- 表單與發票
- 地圖與圖表
- 文字與圖形混合的內容文件
技術實作
JBIG2 實作提供原生 Pascal 路徑,以及透過下列 API 存取的選用外部靜態後端
- THPDFJBIG2Decoder: 處理 JBIG2 壓縮資料的核心解碼類別
- 原生編碼涵蓋範圍: MMR 泛用區域、MQ 泛用區域、算術與標準 Huffman 符號字典及文字區域、refinement 符號、聚合符號、refined 文字實例、保留的算術上下文,以及有邊界的長格式參考表
- 有邊界的上下文重用: 泛用與 refinement 機率庫按模板感知的大小保留、在各 fan-out 依賴之間隔離,來源或模板不相容時予以拒絕
- 串流處理: 高效率處理 JBIG2 資料串流
- 全域字典支援: 共用與多層鏈接的符號字典,帶一、二或四位元組的區段識別碼
- 跨頁批次編碼器:
THPDFJBIG2Encoder.EncodePagesToByteArrays 以整個批次訓練,為每個輸入回傳一條頁面串流外加共用全域資料
- 批次契約:
TJBIG2BatchPage 描述一個打包頁面,TJBIG2BatchEncodeBackend 識別所選實作,TJBIG2BatchEncodeCallback 則定義外部批次整合
- 文件整合:
THotPDF.AddJBIG2ImageBatch 與 THotPDF.AddJBIG2BitmapBatch 在變更 PDF 圖之前編碼,附加共用的 /JBIG2Globals 串流,並按輸入順序回傳影像索引
- 批次遙測:
TJBIG2BatchEncodeStatistics 回報所選後端、輸入與輸出大小、原生符號數與預算拒絕
- 後端復原:
HPDFJBIG2EncRegisterBackends 在暫時性的應用程式覆寫被清除後,還原兩個內建編碼器回呼
- HPDFJBIG2SplitSymbolDictionaryGlobals: 把一條循序的內嵌串流切分為全域字典與頁面影像區段,同時保留長格式依賴標頭
- 可視區域解碼:
THPDFJBIG2Decoder.LoadRegionFromByteArray 只配置要求的視窗、解析其遞移字典依賴、以裁剪合成相交的頁面區域,並在熵解碼前略過獨立的視窗外區域
- 區域解碼遙測:
LastRegionDecodeStats 回報已解碼與已略過的區域數以及已解碼的來源像素,UsedIncrementalRegionDecode 則區分原生視窗路徑與完整解碼後備
- 掃描線存取: 逐列存取資料,節省記憶體
使用範例
// Delphi example - Processing JBIG2 compressed data
procedure ProcessJBIG2Data;
var
PDF: THotPDF;
Decoder: THPDFJBIG2Decoder;
ImageData: TBytesArray;
ScanlineData: TBytesArray;
Row: Integer;
begin
PDF := THotPDF.Create(nil);
Decoder := THPDFJBIG2Decoder.Create;
try
PDF.BeginDoc;
PDF.AddPage;
// Load JBIG2 compressed image data
if Decoder.LoadFromByteArray(ImageData) then
begin
// Process scanline by scanline for memory efficiency
for Row := 0 to Decoder.Height - 1 do
begin
if Decoder.GetScanline(Row, ScanlineData) then
begin
// Process scanline data as needed
// Add to PDF page
end;
end;
end;
PDF.EndDoc;
finally
Decoder.Free;
PDF.Free;
end;
end;
編碼器選項與後端
- THotPDF.JBIG2Options: 文件的
THPDFJBIG2Options,AddImage(..., icJBIG2) 會把它轉成 TJBIG2EncodeOptions。預設值適合掃描件:Lossless=True、LossyLevel=5、RemoveIsolatedBlackPixels=True 與 BlackDotSize=3
- 雜點移除:
RemoveIsolatedBlackPixels 為 True 時,寬和高都小於 BlackDotSize 的黑色連通元件會在編碼前被清除,所以預設值會移除 2 x 2 像素及更小的黑點。輸出必須與點陣圖逐像素一致時,請把它設為 False
- 編碼器選擇:
UseExternalEncoder(預設 True)使用註冊的高效能算術編碼器;關閉、缺少或失敗時,寫出內建的無損 MMR 泛用區域。UseNativeArithmeticFallback=True 會先嘗試內建 Pascal 算術編碼器再退回 MMR,而 UseSymbolDictionary=True 時會先嘗試帶文字區域的符號字典
- DefaultJBIG2EncodeOptions: 獨立
THPDFJBIG2Encoder 使用的選項:無損、LossyLevel=0、不做雜點移除
- 解碼器選擇:
THotPDF.UseExternalJBIG2Decoder(預設 True)在高效能後端可用時用它解碼已載入的 /JBIG2Decode 影像;False 則使用內建 Pascal 解碼器
- 自訂後端:
RegisterJBIG2EncoderBackend 與 RegisterJBIG2DecoderBackend 安裝應用程式回呼,IsJBIG2EncoderBackendAvailable 與 IsJBIG2DecoderBackendAvailable 回報它們,ClearJBIG2Backends 則移除它們
類別參考
THPDFJBIG2Decoder
- LoadFromByteArray: 從位元組陣列載入 JBIG2 資料;資料不完整或不支援時回傳 False
- GetScanline: 取得指定掃描線的資料
- Width/Height: 影像尺寸屬性
效能最佳化
- 固定 100 頁的掃描語料,從各自泛用區域的 158,300 位元組壓到外部跨頁訓練的 33,600 位元組,縮減 78.8%
- 同一語料在迴歸 benchmark 中於 Win64 上 11 ms 完成(原本 53 ms)、Win32 上 16 ms(原本 77 ms)
- 頁面到符號的查找有索引,重複的已編碼頁面串流會被快取,批次擷取為常數時間
- 省記憶體的掃描線處理
- 針對大型文件處理最佳化
- 解壓縮時記憶體佔用極低
標準相容性
- 符合 ITU-T T.88 標準
- 支援 ISO/IEC 14492 標準
- PDF 1.4 或更新版的影像 XObject,帶
/JBIG2Decode 與 /JBIG2Globals
- PDF/A 輸出作用期間 HotPDF 不會寫 JBIG2:
AddImage(..., icJBIG2) 會改寫 icCCITT42,批次插入則回傳 False
- 跨平台一致性
請參閱
|