使用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
相关产品推荐
相关产品推荐

