我正在开发一个PDF解析器/编写器,但我一直在生成交叉引用流。 我的程序读取this文件,然后删除其线性化,并解压缩对象流中的所有对象。最后,它构建PDF文件并保存。
当我使用正常的交叉参考&预告片,如this文件中所示。
当我尝试生成交叉引用流对象(导致this文件时,Adobe Reader无法查看它。
有没有人使用PDF,可以帮助我搜索问题所在?
请注意,交叉引用是文件2和文件3之间的唯一区别。前34127个字节是相同的。
如果有人需要解码参考流的内容,请下载this文件并在HEX编辑器中打开它。我一次又一次检查了这个参考表,但我找不到任何错误。但字典似乎也没问题。
非常感谢你的帮助!!!
更新
我现在已经彻底解决了这个问题。您可以找到新的PDF here。
答案 0 :(得分:6)
我看到的两个问题(没有查看流数据本身。
“大小整数(必填)第一个大于本节或任何应更新的部分中使用的最高对象编号。它应相当于预告片词典中的大小输入。“
你的身材应该是...... 14.
“索引数组(可选)本节中每个子部分包含一对整数的数组。第一个整数应为子部分中的第一个对象编号;第二个整数应为是该小节中的条目数 数组应按对象编号按升序排序。小节不能重叠;对象编号在一个部分中最多只能有一个条目。 默认值:[0大小]。“
你的索引应该可以略微跳过一下。您没有对象2-4或7.索引数组需要反映出来。
您的数据也不对(我刚刚学会了读取外部参照流。是的。)
00 00 00
01 00 0a
01 00 47
01 01 01
01 01 70
01 02 fd
01 76 f1
01 84 6b
01 84 a1
01 85 4f
根据此数据,由于您的“无索引”被解释为对象编号0到9,因此具有以下偏移量:
0未使用。精细。
1是0x0a。是的,肯定是
2是0x47。不。它落在“1 0”流的开头附近。这可能不是巧合
3是0x101。不。 0x101仍在“1 0”的流中
4是0x170。同上
5是0x2fd。同上
6是0x76f1。不,这次埋在那个图像的流中。
我想你明白了。因此,即使你有一个正确的\索引,你的偏移都是错误的(并且与resultNormal.pdf中的内容完全不同,甚至允许十六进制混淆)。
您可以在resultNormal的外部参照:
中找到您想要的内容
xref
0 2
0000000000 65535 f
0000000010 00000 n
5 2
0000003460 00000 n
0000003514 00000 n
8 5
0000003688 00000 n
0000003749 00000 n
0000003935 00000 n
0000004046 00000 n
0000004443 00000 n
所以你的索引应该是(如果我正在读这个权利):\索引[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
<</Size 10/Length 44/Filter /FlateDecode/DecodeParms <</Columns 3/Predictor 12>>/W [1 2 0]/Type /XRef/Root 8 0 R>>
流
...
endstream
endobj
答案 1 :(得分:0)
“resultstream.pdf”没有有效的交叉引用流。
如果我在我的查看器中打开它,他会尝试将对象“13 0”作为交叉引用流读取,但它是一个简单的字典(流标记和数据丢失)。
有点偏离主题:你在用什么语言开发?至少在Java中知道三个有价值的选择(PDFBox,iText和jPod,我个人作为开发人员之一选择jPod,非常干净的实现:-)。如果这不适合您的平台,也许您至少可以查看算法和数据结构。
修改
好吧 - 如果“resultstream.pdf”是有问题的文档,那么这就是我的编辑(SCITE)所看到的
...
13 0 obj
<</Size 0/W [1 2 0]/Type /XRef/Root 8 0 R>>
endobj
startxref
34127
%%EOF
没有流。