阅读pdf版本> = 1.5,如何处理交叉引用流字典

tsc*_*007 7 pdf

我正在尝试阅读pdf版本> = 1.5的外部参照表.

xref表是一个对象:

58 0 obj
<</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<CB05990F613E2FCB6120F059A2BCA25B><E2ED9D17A60FB145B03010B70517FC30>]/Index[38 39]/Info 37 0 R/Length 96/Prev 67529/Root 39 0 R/Size 77/Type/XRef/W[1 2 1]>>stream
hÞbbd``b`:$AD`­Ì ‰Õ Vˆ8âXAÄ×HÈ$€t¨  – ÁwHp·‚ŒZ$ìÄb!&F†­ .#5‰ÿŒ>(more here but can't paste)
endstream
endobj

如你看到的

  • / FlatDecode
  • / Index [38 39],即流中的39个条目
  • / W [1 2 1]即每个条目是1 + 2 + 1 = 4个字节长
  • / Root 39 0作为根对象的R是数字39

但是:

解压缩的流长195个字节(39*5 = 195).所以条目的长度是4或5.

这是第一个膨胀的字节

02 01 00 10 00 02 00 02 cd 00 02 00 01 51 00 02 00 01 70 00 02 00 05 7a 00 02
            ^^

如果条目长度为4则根条目是一个自由对象(参见^^)!!

如果条目是5:如何解释一个条目的字段(隐含地参考PDF参考,章节3.4.7表3.16)?

对于对象38,第一个流:它似乎是类型2,它是流对象编号256的16个对象,但是我的pdf文件中没有对象256!

问题是:我该如何处理195个字节?

usr*_*301 12

压缩的外部参照表可能已使用其中一个PNG过滤器进行压缩.如果该/Predictor值设置为"10"或更大("预测值大于或等于10仅表示正在使用PNG预测值;使用的特定预测函数在输入数据中明确编码")1,PNG行过滤器在"压缩数据"中"照常"提供(即,在每个"行"的第一个字节中,其中"行"的宽度为/W).

宽度[1 2 1] 加上预测字节:

02 01 00 10 00
02 00 02 cd 00
02 00 01 51 00
02 00 01 70 00
02 00 05 7a 00
02 .. .. .. ..
Run Code Online (Sandbox Code Playgroud)

应用行筛选器('2'或'up',对于所有这些行),您得到:

01 00 10 00
01 02 ed 00
01 03 3e 00
01 04 ae 00
01 09 28 00
.. .. .. ..
Run Code Online (Sandbox Code Playgroud)

注:手工计算; 我可能在这里和那里犯了一个奇怪的错误.注意,PNG'up'滤波器是一个字节滤波器,并且"up"滤波器的结果在每次加法时被截断为8位.

这导致以下类型1 XRef引用("类型1条目定义正在使用但未压缩的对象(对应于交叉引用表中的n个条目)."):2

#38 type 1: offset 10h, generation 0
#39 type 1: offset 2EDh, generation 0
#40 type 1: offset 33Eh, generation 0
#41 type 1: offset 4AEh, generation 0
#42 type 1: offset 928h, generation 0
Run Code Online (Sandbox Code Playgroud)

1个LZW和Flate预测函数PDF参考1.7,第6版,第3.3节:过滤器.

2如PDF Ref 1.7中的表3.16所述.

  • 似乎行过滤器之后的第二行应该是01 02**dd**00(0xcd + 0x10 = 0xdd).我没有编辑答案,因为(1)我想确定它并且(2)它下面所有其他行的解码依赖于0xed(并且看起来是正确的),所以这将是一个主要的编辑可能最终会比原来的答案/*PS更糟糕和更混乱:也许改变10到20将是一个更容易的解决方案?*/ (2认同)