PDF交叉参考流

时间:2010-12-29 17:30:26

标签: pdf pdf-generation pdf-parsing

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

当我使用正常的交叉参考&预告片,如this文件中所示。

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

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

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

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

非常感谢你的帮助!!!

更新

我现在已经彻底解决了这个问题。您可以找到新的PDF here

2 个答案:

答案 0 :(得分:6)

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

  1. 大小整数(必填)第一个大于本节或任何应更新的部分中使用的最高对象编号。它应相当于预告片词典中的大小输入。“

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

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

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

  3. 您的数据也不对(我刚刚学会了读取外部参照流。是的。)


  4. 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

没有流。