交叉参考流解码

时间:2019-10-06 16:48:48

标签: pdf

我用自己的Deflate解码器编写了一个pdf解析器。对于到目前为止我遇到的所有流内容,它都可以正常工作,但是无法解码外部参照流的二进制内容。以下是十六进制格式的在“ stream”之后和“ endstream”之前找到的字节:

68 DE 62 62 62 60 D8 CB F4 9F 79 F5 1F 20 83 A9 19 48 F0 AB 01 09 86 E9 00 01 06 00 46 3B 04 C4

删除前两个字节(zlib标头0x68 0xDE)后,我的Deflate解码器读取并停止26个字节,并在输出中产生了34个字节:

02 02 00 00 BD 02 FF 03 AB FC 02 00 00 02 83 02 00 00 02 83 02 FF 26 02 83 O2 0F 26 02 83 02 0F 00 97

这是文件:https://drive.google.com/open?id=1BHB0AAdAVA6EQuE-aPHrCXvdqU8uUWFP

流字典中的/ Filter条目设置为/ FlateDecode,据我所知,该文件未加密。还有一个/ DecodeParms条目设置为包含/ Columns 4 / Predictor 12的字典,但是,如果我是对的,则必须在对流二进制数据进行膨胀之后使用它。

Deflate解码器在输出时产生34个字节,但是即使应用了PNG Up过滤器,它们对我来说也没有意义。

谢谢。

1 个答案:

答案 0 :(得分:0)

对该流进行FLATE解码会导致

02 02 00 00 BD 02 FF 03 AB FC 02 00 00 02 83 02 00 00 0F 26 02 00 00 00 97

因此,您的声明 Deflate解码器产生34个字节,表明您使用Deflate解码器做错了事。

您是否认为PDF FLATE编码流不包含 naked FLATE压缩数据,而是包含ZLIB压缩数据格式 wrapping FLATE压缩数据?如果您的解码器需要裸露的数据,则首先必须删除ZLIB标头。有关详细信息和参考,请参见this answer

要完成解码,我们必须解决PNG Up预测变量的使用:

02 02 00 00 BD         02 00 00 BD
02 FF 03 AB FC         01 03 AB B9
02 00 00 02 83   -->   01 03 AD 3C
02 00 00 0F 26         01 03 BC 62
02 00 00 00 97         01 03 BC F9

因此考虑/Index[185 2 188 3]/W[1 3 0]

  • 对象185在对象流189中
  • 对象186从偏移量0x03ABB9开始
  • 对象188从偏移量0x03AD3C开始
  • 对象189从偏移量0x03BC62开始
  • 对象190从偏移量0x03BCF9开始