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
  • 跨平台一致性

請參閱