|
增強 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): 緩衝區大小錯誤
請參閱
|