【问题标题】:XREF table in a pdf filepdf 文件中的外部参照表
【发布时间】:2019-03-29 15:36:25
【问题描述】:

我为 pdf 文件编写了以下 Hello 代码。

%PDF-1.4
1 0 obj
<< /Type /Catalog /Pages 2 0 R >>
endobj
2 0 obj
<< /Kids [3 0 R] /Count 1 >>
endobj
3 0 obj
<< /Parent 2 0 R /Contents 4 0 R >>
endobj
4 0 obj
<< /Length 20 >>
stream
BT
/F1 40 Tf
100 600 Td
(Hello!) Tj
ET
endstream
endobj
trailer
<<  /Root 1 0 R
    /Size 3
>>
%%EOF

我想知道xref这个表是怎么计算出来的?\

第三次评论后更新:

我可以写一个如下表吗?

xref
0 3
0000000000 65536 f
0000000001 00000 n
0000000002 00000 n
0000000003 00000 n

这有什么问题(如果有的话)?

page 中的示例表明外部参照中的对象之间存在差异(大于 1)。但是,尚不清楚为什么第一个对象的偏移量为 15,而第二个对象的偏移量为 87。这些数字是如何计算出来的?

【问题讨论】:

  • 您提到了 ISO 32000。如何简单地创建那里描述的交叉引用表?与 PDF 的一些细节相比,其中的交叉引用表规范非常简单易懂。话虽如此,即使有交叉引用表,您的文件也会缺少页面媒体框和页面资源(包括您引用的字体 F1)。
  • 第 7.5.4 节解释了外部参照。但我想知道如何计算列值。我无法理解!
  • 你到底有什么不明白的?对于 n 类型的条目,您首先有一个“10 位数字,必要时用前导零填充,给出从文件开头到对象开头的字节数”,然后是空格,然后是“5 位代号”(在您的 PDF 文本中,所有代值都是 0),然后是空格,然后是“n”,然后是“2 个字符的行尾序列”。
  • 问题不在于外部参照中有多少列?!!我想知道偏移量(第一列)是计算出来的。查看更新后的帖子。
  • 引用我之前的评论:“从文件开头到对象开头的字节数”

标签: pdf iso-32000


【解决方案1】:

编辑问题后问题变得清晰,您不知道测量偏移量的单位。

外部参照表中的 n 条目描述为

使用中条目的格式应为:

nnnnnnnnnn ggggg n eol

地点:

nnnnnnnnnn 应为解码流中的 10 位字节偏移量

ggggg 应为 5 位代号

n 应是一个关键字,将其标识为正在使用的条目

eol 应为 2 个字符的行尾序列

“解码流中的 10 位字节偏移”可能有点不清楚。幸运的是,上面的文字紧接着是一个解释:

解码流中的字节偏移量应为 10 位数字,必要时用前导零填充,给出从文件开头到对象开头的字节数。

(ISO 32000-1,第 7.5.4 节“交叉引用表”)

因此,这里的偏移量实际上就是PDF中对象开始的字节位置,它的对象和世代号。


顺便说一句,您还必须严格遵守的一项是此类条目的长度:

条目的总长度应始终为 20 个字节。

【讨论】:

  • 如果你看我粘贴的教程,15-0 与 20 字节无关,无论你使用什么基数。
  • 我说第一行是%PDF-1.4\n whixh 10 个字符,这意味着 10 个字节。所以第一个对象以 0000000010 开头。对吧?
  • 可能是 9 或 10 个字节,具体取决于您选择的行尾。因此,您的第一个对象从偏移量 9 或 10 开始。但是,通常在第二行有一些非 ASCII 字符的注释,而第一个对象从第三行开始。因此,您的教程的第一个对象位于偏移 15 处。
  • “如果你看一下我粘贴的教程,15-0 与 20 字节无关,无论你使用什么基数” - 没有人谈论 '15-0 '。输入行是“0000000015 00000 n”,包括选择的行结尾必须是 20 字节长。
  • @mahmood 鉴于此处澄清的 cmets,我的回答是否恰当地回答了您的问题?还是还有未解决的问题?
猜你喜欢
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多