|
JBIG2 Compression Support
概要
HotPDF は、スキャンテキスト、フォーム、ラインアートで使われる 2 値画像向けの JBIG2 圧縮とデコードを提供します
主な特徴
- 2 値画像向けの高効率圧縮
- ロッシー / ロスレス両モードに対応
- テキストとラインアートの圧縮に最適化
- 従来の圧縮方式と比べて大幅なファイルサイズ削減
- すべての画像 XObject で 1 つの訓練済みシンボル辞書を共有するマルチページエンコード
- 分類前の完全重複ページ検出と、PDF 組み立て時のエンコード済み XObject 再利用
- 境界付きページ / ピクセル予算と、オプションのネイティブ Pascal フォールバック
圧縮の利点
- ページ横断の再利用: 繰り返されるシンボルは 1 回だけ分類され、共有グローバルデータに保存されます
- シンボルマッチング:
UseSymbolDictionary を使うと、繰り返される黒の連結成分はシンボルとして 1 回だけ保存され、LossyLevel で近似の成分どうしが 1 つのシンボルを共有できます
- メモリ効率: 大きなスキャンドキュメントの処理に最適化されています
典型的なユースケース
- スキャンしたテキスト文書
- 技術図面と青写真
- フォームと請求書
- 地図とダイアグラム
- テキストとグラフィックスが混在するドキュメント
技術的な実装
JBIG2 実装は、ネイティブ Pascal パスとオプションの静的外部バックエンドを次の API で提供します
- THPDFJBIG2Decoder: JBIG2 圧縮データ向けのコアデコーダークラス
- ネイティブ符号化カバレッジ: MMR 汎用リージョン、MQ 汎用リージョン、算術 / 標準 Huffman のシンボル辞書とテキストリージョン、リファインメントシンボル、集約シンボル、リファインドテキストインスタンス、保持された算術コンテキスト、境界付きロングフォーム参照テーブル
- 境界付きコンテキスト再利用: 汎用 / リファインメントの確率バンクはテンプレート認識サイズで保持され、ファンアウト依存ごとに分離され、ソースやテンプレートに互換性がない場合は拒否されます
- ストリーム処理: JBIG2 データストリームの効率的な処理
- グローバル辞書サポート: 1 / 2 / 4 バイトのセグメント識別子を持つ、共有および多段チェーンのシンボル辞書
- ページ横断バッチエンコーダー:
THPDFJBIG2Encoder.EncodePagesToByteArrays がバッチ全体で訓練し、入力ごとのページストリームと共有グローバルデータを返します
- バッチ契約:
TJBIG2BatchPage が 1 つの詰め込み済みページを記述し、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 は MMR の前に組み込み Pascal 算術コーダーを試し、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% 削減)
- 同じコーパスが回帰ベンチマークで、Win64 では 53 ms ではなく 11 ms、Win32 では 77 ms ではなく 16 ms で完了します
- ページからシンボルへのルックアップはインデックス化され、繰り返されるエンコード済みページストリームはキャッシュされ、バッチ抽出が定数時間で行われます
- メモリ効率の良いスキャンライン処理
- 大きなドキュメントの処理に最適化
- 展開中の最小メモリフットプリント
規格準拠
- ITU-T T.88 規格準拠
- ISO/IEC 14492 規格サポート
/JBIG2Decode と /JBIG2Globals を使用する、PDF 1.4 以降の画像 XObject
- HotPDF は PDF/A 出力が有効な間は JBIG2 を書きません。
AddImage(..., icJBIG2) は代わりに icCCITT42 を書き、バッチ挿入は False を返します
- クロスプラットフォームの一貫性
関連項目
|