增强型 ZLib 压缩支持

概述

HotPDF 现在包含由捆绑 zlib-ng 支撑的完整 ZLib-compatible compression support,用于 PDF streams 和 content。zlib-compatible API 提供高效 deflate/inflate 压缩,广泛用于 PDF 文档的 FlateDecode filter operations 和通用数据压缩

关键特性

  • 由捆绑 zlib-ng 支撑的 ZLib 兼容 API
  • 支持 PDF FlateDecode 参数
  • 基于流的压缩和解压缩
  • 增强的错误处理和调试能力
  • 大型数据流的内存高效处理
  • 用于 zlib-ng 长度 ABI 安全性的 Win64 一次性图像压缩桥接
  • Win64x and diagnostic MSVC Win64 zlib-ng runtime SIMD dispatch with generic fallbacks
  • 32-byte aligned C allocation bridge for SIMD-friendly native buffers
  • 跨平台 C 库集成
  • 多种压缩级别(无压缩、最快、默认、最高)

技术实现

增强 ZLib 支持通过 HPDFZLib.pas 单元实现,该单元提供以下内容:

  • Complete ZLib API: 完整实现 ZLib 函数
  • Stream Classes: 用于流处理的 TCustomZStream 及派生类
  • PDF Integration: 用于 PDF 专用参数的 TPDFFlateParms
  • Enhanced Functions: 用于简化调用的 InflateStr 和 InflateStrParms

64-bit zlib-ng object sets 包含 runtime-selected SSE2、SSSE3、SSE4.1、SSE4.2、PCLMULQDQ 和 AVX2 路径。Win32 使用 generic zlib-ng object set 以保持 bcc32c OMF toolchain 兼容,而 Win32 JPEG/TIFF objects 仍使用 classic bcc32

回归覆盖

zlib-ng Flate backend 由自动化 Delphi 和 C++Builder regression suites 覆盖。当前验证集通过 Win32 20 个 Delphi DUnitX 测试、Win64 20 个 Delphi DUnitX 测试,以及 Win32 17 个 C++Builder GoogleTest 测试和 Win64x 17 个 C++Builder GoogleTest 测试。原生 object rebuilds 也从干净输出通过:206 个 Win32 objects、205 个 Win64x objects 和 206 个 MSVC Win64 objects。覆盖工作流包括 page-stream compression、embedded font 和 ToUnicode CMap compression、Flate image streams、standard JPEG image placement、TIFF import、barcode-heavy output、copy/merge/edit scenarios,以及 demo-generated PDFs

压缩级别

  • Z_NO_COMPRESSION (0): 无压缩
  • Z_BEST_SPEED (1): 最快压缩
  • Z_BEST_COMPRESSION (9): 最高压缩
  • Z_DEFAULT_COMPRESSION (-1): 速度和压缩率的默认平衡

使用示例

基础字符串压缩/解压缩


// Delphi example - Basic string inflation
function DecompressString(const CompressedData: AnsiString): AnsiString;
begin
  // Simple decompression
  Result := InflateStr(CompressedData);

  // With debug output enabled
  Result := InflateStr(CompressedData, True);
end;
        

基于流的压缩


// Delphi example - Stream-based decompression
procedure DecompressStream(InStream, OutStream: TStream);
begin
  // Decompress from input stream to output stream
  PLZDecompressStream(InStream, OutStream);

  // For raw deflate data (without ZLib headers)
  PLZDecompressStreamRaw(InStream, OutStream);
end;
        

带参数的 PDF FlateDecode


// Delphi example - PDF FlateDecode with parameters
function DecompressPDFStream(const CompressedData: AnsiString;
  Predictor, Colors, BitsPerComponent, Columns: Integer): AnsiString;
var
  Parms: TPDFFlateParms;
begin
  // Configure PDF parameters
  Parms.Predictor := Predictor;
  Parms.Colors := Colors;
  Parms.BitsPerComponent := BitsPerComponent;
  Parms.Columns := Columns;
  Parms.ExpandedTo8Bit := True;
  Parms.ColorSpace := 'DeviceRGB';

  // Decompress with PDF parameters
  Result := InflateStrParms(CompressedData, Parms);
end;
        

底层 ZLib 操作


// Delphi example - Low-level ZLib operations
procedure CompressData;
var
  strm: z_stream;
  ret: Integer;
  input: AnsiString;
  output: AnsiString;
begin
  input := 'Data to compress';
  SetLength(output, Length(input) * 2);

  // Initialize stream
  FillChar(strm, SizeOf(strm), 0);
  ret := deflateInit(strm, Z_DEFAULT_COMPRESSION);

  if ret = Z_OK then
  try
    // Set input
    strm.next_in := PByte(PAnsiChar(input));
    strm.avail_in := Length(input);

    // Set output
    strm.next_out := PByte(PAnsiChar(output));
    strm.avail_out := Length(output);

    // Compress
    ret := deflate(strm, Z_FINISH);

    if ret = Z_STREAM_END then
    begin
      // Compression successful
      SetLength(output, Length(output) - strm.avail_out);
    end;
  finally
    deflateEnd(strm);
  end;
end;
        

PDF FlateDecode 参数

TPDFFlateParms 结构

  • Predictor: 预测器函数(1=无预测,2=TIFF,10-15=PNG)
  • Colors: 颜色分量数量
  • BitsPerComponent: 每个颜色分量的位数
  • Columns: 每行样本数量
  • ExpandedTo8Bit: 是否扩展为 8 位分量
  • ColorSpace: 色彩空间标识符

共享 Predictor API

需要在 Flate / LZW 解码之外独立做 predictor 逆变换时,加入 HPDFPredictor 单元

function HPDFDecodePredictor(const Data: AnsiString; Predictor, Colors, BitsPerComponent, Columns: Integer; MaxOutputBytes: Int64 = 0): AnsiString; function HPDFTryDecodePredictor(const Data: AnsiString; Predictor, Colors, BitsPerComponent, Columns: Integer; MaxOutputBytes: Int64; out Output: AnsiString; out ErrorMessage: string): Boolean;
  • HPDFDecodePredictor 抛出 EHPDFPredictorError
  • HPDFTryDecodePredictor 返回同样的校验结果但不抛异常,并提供可用于日志的错误消息
  • TIFF 解码保留未使用的填充位,在打包与 16 位深度下按分量应用水平差分
  • PNG 解码在 Predictor 值为 10 到 15 时使用每行开头的显式过滤标签
  • InflateStrParms 在读取实际 Flate 输出后应用这一共享解码器,并把 predictor 失败报告为 EZDecompressionError

增强特性

  • Memory Management: 优化的内存分配和释放
  • Error Handling: 完整的错误检查和报告
  • Debug Support: 用于故障排查的可选调试输出
  • Performance Optimization: 高度优化的压缩算法
  • Stream Integration: 与 Delphi 流类无缝集成

性能优势

  • 快速压缩和解压缩
  • 对文本和简单图形具有优秀压缩率
  • 处理期间内存占用低
  • 针对 PDF 内容流优化
  • Minimal CPU overhead

标准符合性

  • RFC 1950 (ZLib format specification)
  • RFC 1951 (Deflate compression algorithm)
  • PDF FlateDecode filter specification
  • PNG predictor algorithm support
  • TIFF predictor algorithm support

错误代码和处理

  • Z_OK (0): Success
  • Z_STREAM_END (1): 已到达流末尾
  • Z_NEED_DICT (2): 需要字典
  • Z_ERRNO (-1): 文件错误
  • Z_STREAM_ERROR (-2): 流状态错误
  • Z_DATA_ERROR (-3): 数据完整性错误
  • Z_MEM_ERROR (-4): 内存分配错误
  • Z_BUF_ERROR (-5): 缓冲区大小错误

另请参阅