5

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

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

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

有没有人使用PDF的经验,可以帮助我搜索问题是什么?

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

如果有人需要解码后的参考流的内容,请下载文件并在 HEX 编辑器中打开它。我一遍又一遍地检查这个参考表,但我找不到任何错误。但是字典似乎也可以。

非常感谢你的帮助!!!

更新

我现在已经完全解决了这个问题。您可以在此处找到新的 PDF 。

4

2 回答 2

7

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

  1. "大小 整数(必需)比本节中使用的最高对象编号大一的数字,或者在应更新的任何部分中。它应等效于预告片字典中的大小条目。

    你的尺寸应该是... 14。

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

    您的索引可能应该跳过一点。您没有对象 2-4 或 7。索引数组需要反映这一点。

  3. 您的数据也不正确(我刚学会阅读外部参照流。哎呀我。)

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 is unused.  Fine.  
1 is at 0x0a.  Yep, sure is  
2 is at 0x47.  Nope.  That lands near the beginning of "1 0"'s stream. This probably isn't a coincidence.  
3 is at 0x101.  Nope.  0x101 is still within "1 0"'s stream.  
4 is at 0x170.  Ditto  
5 is at 0x2fd.  Ditto  
6 is at 0x76f1. Nope, and this time buried inside that image's stream.

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

你想要的可以在 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  

所以你的索引应该是(如果我没看错的话) \Index[0 2 5 2 8 5]:。和数据:

0 0 0  
1 0 a  
1 3460 (that's decimal)  
1 3514 (ditto)  
1 3688  
etc

有趣的是,PDF 规范规定大小必须既是此外部参照和所有先前外部参照中的条目数,又是比正在使用的最高对象编号高一的数字。

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


@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>>
stream  
...  
endstream  
endobj  
于 2010-12-30T00:58:06.810 回答
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

没有流。

于 2010-12-29T18:04:11.143 回答