zlib.error解压缩时错误-3:标头检查不正确

问题描述 投票:0回答:2

我有一个.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。查看图片:

010_editor

有人知道字节可能代表哪种压缩吗?我试图用Google搜索生产者(/ Producer(tx_pdf 15.0.130.501)),但没有结果。

pdf zlib
2个回答
1
投票

[显然,某些软件将您的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进行重新编码应该同样简单。


0
投票

最有可能您的PDF已加密。如果Adobe Reader将其打开,则密码可能为空,但内容仍被加密。

根据PDF 1.7 spec #7.6 Encryption

可以对文档进行加密,以防止其内容受到未经授权的保护访问。加密适用于文档中的所有字符串和流PDF文件,但以下情况除外:

  • 预告片中ID输入的值

  • 加密字典中的任何字符串

  • 流中的任何字符串,例如内容流和压缩对象流,它们本身都已加密

这意味着您需要在放气之前解密流。

© www.soinside.com 2019 - 2024. All rights reserved.