我有一个.pdf文件的集合,当使用pdf-parser.py时,它给出:FlateDecode解压缩失败。 zlib.error解压缩时发生错误-3:不正确的标头检查。见下面。
PDF Comment %PDF-1.4
PDF Comment %âãÏÓ
obj 1 0
Type: /ExtGState
Referencing:
<<
/Type/ExtGState
/SA false
/SM 0.02
>>
<<
/Type /ExtGState
/SA false
/SM 0.02
>>
<<
/Type/ExtGState
/SA false
/SM 0.02
>>
obj 2 0
Type:
Referencing:
[/DeviceRGB]
[/DeviceRGB]
obj 3 0
Type:
Referencing:
Contains stream
<<
/Filter /FlateDecode
/Length 1136
>>
FlateDecode decompress failed. zlib.error Error -3 while decompressing: incorrect header check
...
...
<<
/Producer (tx_pdf 15.0.130.501)
/CreationDate (D:20100309081052Z)
>>
ZLIB标头(在RFC1950中定义)应为:
CMF | FLG
0x78 | 0x01 - No Compression/low
0x78 | 0x9C - Default Compression
0x78 | 0xDA - Best Compression
[在010编辑器中检查文件时,标头字节改为0x78和0xC3。查看图片:
有人知道字节可能代表哪种压缩吗?我试图用Google搜索生产者(/ Producer(tx_pdf 15.0.130.501)),但没有结果。
[显然,某些软件将您的PDF当作是纯文本格式的ANSI'ish编码,然后使用UTF-8写回该“文本”。当然,这会扰乱每个二进制部分,例如平面编码的压缩流。
在您的情况下,ZLIB标头已损坏:
78 C3 9A ...
如果您使用UTF-8解码就可以得到字符
xÚ...
如果使用某些匹配的Windows ANSI编码对这些字符进行编码,则会得到
78 DA ...
这是最佳压缩ZLIB标头。
因此,您应尝试撤消此“文本编码更改”。当然,问题仍然是哪种编码准确可以使用,因为该类型有许多非常相似的编码,有些仅在单个字符上有所不同。
另一个问题是,所讨论的软件是否不仅仅是“更改文本编码”?软件还会将字节流视为文本,有时也会进行其他更改,例如将“行尾”统一到本地平台标准,或者解释或删除控制字符。这样的额外更改很可能会损坏二进制文件,无法修复。
稍后对提供的文件进行反复试验,结果发现这里的ANSI编码是Microsoft的.Net Encoding
类称为windows-1252的编码,所幸程序出现了否则不会损坏数据。
因此,使用这几行
byte[] bytes = File.ReadAllBytes(@"rec1254.pdf");
byte[] converted = Encoding.Convert(UTF8Encoding.UTF8, Encoding.GetEncoding("windows-1252"), bytes);
File.WriteAllBytes(@"rec1254-utf8-to-windows-1252.pdf", converted);
我可以修复您的示例文件。用Python进行重新编码应该同样简单。
最有可能您的PDF已加密。如果Adobe Reader将其打开,则密码可能为空,但内容仍被加密。
根据PDF 1.7 spec #7.6 Encryption:
可以对文档进行加密,以防止其内容受到未经授权的保护访问。加密适用于文档中的所有字符串和流PDF文件,但以下情况除外:
预告片中ID输入的值
加密字典中的任何字符串
流中的任何字符串,例如内容流和压缩对象流,它们本身都已加密
这意味着您需要在放气之前解密流。