增強 ZLib 壓縮支援

總覽

HotPDF 現在包含由隨附 zlib-ng 支援的完整 ZLib 相容壓縮,可用於 PDF 串流與內容。zlib 相容 API 提供高效率的 deflate/inflate 壓縮,廣泛用於 PDF 文件的 FlateDecode filter 操作與一般資料壓縮

主要特色

  • 以隨附 zlib-ng 為後盾的 ZLib 相容 API
  • 支援 PDF FlateDecode 參數
  • 串流式壓縮與解壓縮
  • 增強的錯誤處理與除錯能力
  • 大型資料串流的省記憶體處理
  • Win64 一次性影像壓縮橋接,確保 zlib-ng 長度 ABI 安全
  • Win64x 與診斷用 MSVC Win64 的 zlib-ng 執行期 SIMD 分派,附通用後備路徑
  • 32 位元組對齊的 C 配置橋接,提供 SIMD 友善的原生緩衝區
  • 跨平台 C library 整合
  • 多種壓縮層級(無、最快、預設、最大)

技術實作

增強的 ZLib 支援透過 HPDFZLib.pas 單元實作,提供:

  • 完整 ZLib API: 完整實作 ZLib 函式
  • 串流類別: TCustomZStream 與衍生類別負責串流處理
  • PDF 整合: TPDFFlateParms 承載 PDF 專屬參數
  • 增強函式: InflateStr、InflateStrParms 簡化日常使用

64-bit zlib-ng object sets 包含 runtime-selected SSE2、SSSE3、SSE4.1、SSE4.2、PCLMULQDQ 與 AVX2 paths。Win32 使用 generic zlib-ng object set 以維持與 bcc32c OMF toolchain 的相容性,而 Win32 JPEG/TIFF objects 仍使用 classic bcc32

Regression Coverage

zlib-ng Flate backend 已由自動化 Delphi 與 C++Builder regression suites 覆蓋。目前 validation set 通過 Win32 上 20 個與 Win64 上 20 個 Delphi DUnitX tests,以及 Win32 上 17 個與 Win64x 上 17 個 C++Builder GoogleTest tests。native object rebuilds 也可從 clean outputs 通過:206 個 Win32 objects、205 個 Win64x objects 與 206 個 MSVC Win64 objects。覆蓋的 workflows 包含 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: 顏色 component 數
  • BitsPerComponent: 每個顏色 component 的位元數
  • Columns: 每列樣本數
  • ExpandedTo8Bit: 是否擴展為 8 位元 component
  • ColorSpace: 色彩空間識別碼

增強功能

需要在 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 在資料列被截斷、PNG 列 tag 超出 0 到 4、幾何溢位,或超出輸出上限時拋出 EHPDFPredictorError
  • HPDFTryDecodePredictor 回傳相同的驗證結果但不拋出例外,並提供可供記錄的錯誤訊息
  • TIFF 解碼保留未使用的填充位元,並在緊密排列與 16-bit 深度下按分量套用水平差分
  • PNG 解碼在 Predictor 值 10 到 15 時,使用每列開頭的明確 filter tag
  • InflateStrParms 在讀取實際 Flate 輸出後套用這個共用解碼器,並把 predictor 失敗回報為 EZDecompressionError

增強功能

  • 記憶體管理: 最佳化的記憶體配置與釋放
  • 錯誤處理: 完整的錯誤檢查與回報
  • 除錯支援: 選用的除錯輸出,方便排解問題
  • 效能最佳化: 高度最佳化的壓縮演算法
  • 串流整合: 與 Delphi 串流類別無縫接軌

效能優勢

  • 快速的壓縮與解壓縮速度
  • 對文字與簡單圖形有極佳的壓縮率
  • 處理時記憶體佔用低
  • 針對 PDF 內容串流最佳化
  • CPU 開銷極小

標準符合性

  • RFC 1950(ZLib 格式規範)
  • RFC 1951(Deflate 壓縮演算法)
  • PDF FlateDecode filter 規範
  • 支援 PNG predictor 演算法
  • 支援 TIFF predictor 演算法

錯誤碼與處理

  • Z_OK (0): 成功
  • 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): 緩衝區大小錯誤

請參閱