JBIG2 Compression Support

当前支持边界

HotPDF 为扫描文本、表单和线条艺术使用的二值图像提供 JBIG2 压缩与解码

API 行为

  • 面向二值图像的高效压缩
  • 同时支持有损和无损压缩模式
  • 针对文本和线条艺术压缩优化
  • 与传统压缩方法相比显著减小文件体积
  • 多页编码,全部 image XObject 共享一个训练出的符号字典
  • 分类前的精确重复页检测,以及 PDF 组装期对已编码 XObject 的复用
  • 有界的页面与像素预算,可选的原生 Pascal 回退

压缩优势

  • 跨页复用:重复符号只分类一次,存入共享全局数据
  • 符号匹配:开启 UseSymbolDictionary 后,重复的黑色连通分量只作为符号存储一次,LossyLevel 让近乎相同的分量共用一个符号
  • 内存高效:为处理大型扫描文档优化

典型用例

  • 扫描文本文档
  • 技术图纸和蓝图
  • 表单和发票
  • 地图和图表
  • 文本与图形混合的文档

技术实现

JBIG2 实现通过这些 API 提供原生 Pascal 路径和可选的静态外部后端

  • THPDFJBIG2Decoder:JBIG2 压缩数据的核心解码器类
  • 原生编码覆盖:MMR generic region、MQ generic region、算术与标准 Huffman 符号字典及文本区域、refinement 符号、聚合符号、refinement 文本实例、保留的算术上下文,以及有界的长格式引用表
  • 有界上下文复用:generic 与 refinement 概率库按模板感知的大小保留,在 fan-out 依赖间隔离,源或模板不兼容时拒绝
  • 流处理:高效处理 JBIG2 数据流
  • 全局字典支持:共享及多级链式符号字典,支持 1、2 或 4 字节段标识符
  • 跨页批量编码器:THPDFJBIG2Encoder.EncodePagesToByteArrays 在整批上训练,每个输入返回一个页面流外加共享全局数据
  • 批量契约:TJBIG2BatchPage 描述一个打包页面,TJBIG2BatchEncodeBackend 标识选中的实现,TJBIG2BatchEncodeCallback 定义外部批量集成
  • 文档集成:THotPDF.AddJBIG2ImageBatch 与 THotPDF.AddJBIG2BitmapBatch 在改动 PDF 图之前编码,附加共享的 /JBIG2Globals 流,并按输入顺序返回图像索引
  • 批量遥测:TJBIG2BatchEncodeStatistics 报告选中的后端、输入与输出大小、原生符号数以及预算拒绝
  • 后端恢复:HPDFJBIG2EncRegisterBackends 在临时应用级覆盖被清除后恢复两个内建编码器回调
  • HPDFJBIG2SplitSymbolDictionaryGlobals:把顺序嵌入流拆分为全局字典与页面图像段,同时保留长格式依赖头
  • 可见区域解码:THPDFJBIG2Decoder.LoadRegionFromByteArray 只分配请求的窗口,解析其传递字典依赖,带裁剪地组合相交页面区域,并在熵解码前跳过独立的窗外区域
  • 区域解码遥测:LastRegionDecodeStats 报告已解码与已跳过的区域数以及解码的源像素,UsedIncrementalRegionDecode 区分原生窗口路径与完整解码回退
  • 扫描行访问:逐行数据访问,内存高效处理

Usage Example


// Encode: use the built-in high-performance backend by default
// Set UseNativeArithmeticFallback := True to try Pascal arithmetic before MMR fallback
PDF.JBIG2Options.UseExternalEncoder := True;
PDF.JBIG2Options.UseNativeArithmeticFallback := True;
PDF.JBIG2Options.UseSymbolDictionary := True;
PDF.JBIG2Options.LossyLevel := 1;
PDF.JBIG2Options.RemoveIsolatedBlackPixels := True;
PDF.JBIG2Options.BlackDotSize := 3;
ImageIndex := PDF.AddImage(Bitmap, icJBIG2);

// Decode: use the built-in high-performance backend by default
// Set UseExternalJBIG2Decoder := False to use the built-in decoder
procedure ExtractFirstJBIG2(const FileName: string);
var
  Doc: THotPDF;
  Bmp: TBitmap;
begin
  Doc := THotPDF.Create(nil);
  try
    Doc.UseExternalJBIG2Decoder := True;
    Doc.LoadFromFile(FileName);
    if Doc.GetLoadedImageCount > 0 then
    begin
      Bmp := Doc.ExtractLoadedImage(0);
      try
        // Use the extracted bitmap
      finally
        Bmp.Free;
      end;
    end;
  finally
    Doc.Free;
  end;
end;

// Optional: register application callbacks to override the default backends
procedure RegisterCustomBackends;
begin
  RegisterJBIG2EncoderBackend(MyJBIG2EncodeBackend);
  RegisterJBIG2DecoderBackend(MyJBIG2DecodeBackend);
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 generic region。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 页扫描语料:逐页独立 generic region 压缩为 158,300 字节,经跨页外部训练后为 33,600 字节,缩减 78.8%
  • 回归基准中,同一语料在 Win64 上从 53 ms 降到 11 ms,Win32 上从 77 ms 降到 16 ms
  • 页到符号的查找带索引,重复的已编码页面流会被缓存,批量提取为常数时间
  • 省内存的扫描行处理
  • 为大文档处理优化
  • 解压期间内存占用极小

标准合规

  • 符合 ITU-T T.88 标准
  • 支持 ISO/IEC 14492 标准
  • PDF 1.4 及更高版本的 image XObject,带 /JBIG2Decode 与 /JBIG2Globals
  • PDF/A 输出激活期间 HotPDF 不写 JBIG2:AddImage(..., icJBIG2) 会改为写 icCCITT42,批量插入返回 False
  • 跨平台行为一致

另请参阅