You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用zlib解压PDF FlateDecode流时出现错误码-3的技术求助

PDF FlateDecode流解压失败问题排查与解决

问题描述

我尝试从美国联邦航空局(FAA)仪表程序航图的PDF文件中提取信息,该PDF在Adobe Acrobat中可正常打开,但其中一段12字节的FlateDecode压缩流用同一Python 3.9程序无法解压(文档中其他流解压正常)。用iText作者开发的PDF分析工具RUPS解码该流时也有困难,仅显示一个字符。

运行以下代码时出现zlib error code -3 while using zlib to decompress PDF Flatedecode stream错误:

import zlib

hexDigits = "78 9c e3 2a e4 e5 02 20 01 a3 20 93"
stripWhitespace = hexDigits.replace(" ", "")

myByteArray = bytearray.fromhex(stripWhitespace)
data = zlib.decompress(myByteArray) # 报错:Error -3 while decompressing data: incorrect data check
print(data)

可能的原因及解决方法

  • 未处理PDF预测器
    PDF的FlateDecode流常搭配预测器(如PNG预测器)使用,若直接用zlib解压而不先处理预测器,会触发校验错误。先查看该流的/Predictor属性,根据PDF规范中的对应算法处理原始解压数据。
  • zlib校验严格性问题
    Adobe Acrobat对PDF流有容错机制,会忽略部分校验错误继续解析,但zlib对数据完整性要求严格。可以尝试跳过zlib头校验,直接解压原始DEFLATE数据:
    修改代码中的解压语句为:
    data = zlib.decompress(myByteArray, wbits=-15)
    
    wbits=-15表示不使用zlib头和尾校验,仅解压DEFLATE压缩数据。
  • 非标准压缩参数
    部分PDF会使用非标准的FlateDecode压缩参数,可尝试调整zlib的窗口大小参数(wbits的其他取值,如wbits=15为标准zlib格式,wbits=8到wbits=14对应不同窗口大小)。

测试修改后的代码

import zlib

hexDigits = "78 9c e3 2a e4 e5 02 20 01 a3 20 93"
stripWhitespace = hexDigits.replace(" ", "")

myByteArray = bytearray.fromhex(stripWhitespace)
# 跳过zlib头校验,直接解压DEFLATE数据
data = zlib.decompress(myByteArray, wbits=-15)
print(data)

内容的提问来源于stack exchange,提问作者DarwinIcesurfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:50:15