PDF交叉参考流

Van*_*ing 5 pdf pdf-generation pdf-parsing

我正在开发一个PDF解析器/编写器,但我坚持生成交叉引用流.我的程序读取文件,然后删除其线性化,并解压缩对象流中的所有对象.最后,它构建PDF文件并保存.

当我使用正常的交叉引用和预告片时,这非常有效,正如您在文件中看到的那样.

当我尝试生成交叉引用流对象时(导致文件,Adobe Reader无法查看它).

有没有人使用PDF,可以帮助我搜索问题所在?

请注意,交叉引用是文件2和文件3之间的唯一区别.前34127个字节是相同的.

如果有人需要解码参考流的内容,请下载文件并在HEX编辑器中打开它.我一次又一次检查了这个参考表,但我找不到任何错误.但字典似乎也没问题.

非常感谢你的帮助!!!

更新

我现在已经彻底解决了这个问题.您可以在此处找到新PDF .

Mar*_*rer 7

我看到的两个问题(没有查看流数据本身.

  1. " 大小 整数(必需)第一个大于本节或任何应更新的部分中使用的最高对象数.它应等于预告词典中的大小条目."

    你的身材应该是...... 14.

  2. " 索引数组(可选)本节中每个子部分包含一对整数的数组.第一个整数应该是子部分中的第一个对象编号;第二个整数应该是子部分中的条目数.数组应该被排序按对象编号按升序排列.子节不能重叠;对象编号最多可以在一个节中有一个条目.默认值:[0大小]."

    您的索引应该可以略微跳过一下.您没有对象2-4或7.索引数组需要反映这一点.

  3. 你的数据也不正确(我刚刚学会了读取外部参照流.是的.)

\Index[0 2 5 2 8 5]

根据此数据,由于您的"无索引"被解释为对象编号0到9,因此具有以下偏移量:

0未使用.精细.
1是0x0a.是的,肯定是
2是在0x47.不.它落在"1 0"流的开头附近.这可能不是巧合.
3是0x101.不.0x101仍然在"1 0"的流中.
4是0x170.Ditto
5位于0x2fd.Ditto
6位于0x76f1.不,这次埋在那个图像的流中.

我想你应该已经明白了.所以,即使你有一个正确的\索引,你的偏移都是错误的(并且与resultNormal.pdf中的内容完全不同,甚至允许dec-hex混淆).

您可以在resultNormal的外部参照中找到您想要的内容:

\Index[0 2 5 2 8 5]

所以你的索引应该是(如果我正好读这个):\索引[0 2 5 2 8 5].数据:
0 0 0
1 0 a
1 3460(十进制)
1 3514(同上)
1 3688

有趣的是,PDF规范说明大小必须是这个和所有以前的XRef中的条目数,并且比使用中的最高对象数高一个.

我不认为后面的部分是强制执行的,但我不会惊讶地发现xref流比普通的交叉引用表更具保持性.可能是处理两者的相同代码,可能不是.


@mtraut:

这是我看到的:

13 0 obj
\Index[0 2 5 2 8 5]
stream
...
endstream
endobj