【问题标题】:Why does the trailer of this pdf not conform PDF standard?为什么这个 pdf 的预告片不符合 PDF 标准?
【发布时间】:2017-07-28 19:36:05
【问题描述】:

pdf ISO 32000-1 的第 7.5.5 节说

PDF 文件的预告片使符合要求的读者能够快速找到交叉引用表和某些 特殊物品。符合要求的读者应该从头开始阅读 PDF 文件。文件的最后一行应包含 只有文件结束标记,%%EOF。前两行应包含,每行一个,按顺序, 关键字 startxref 和解码流中从文件开头到文件开头的字节偏移量 最后一个交叉引用部分中的外部参照关键字。 startxref 行之前应有预告片 字典,由关键字预告片和一系列以双角括起来的键值对组成 括号 (>)(使用小于号 (3Ch) 和大于号 (3Eh))。

但是我发现this pdf 文件不遵循这个规则,虽然它可以被 pdfviewer 打开没有任何问题。具体来说,这个文件的最后5行是

trailer
<</Size 352/ID[<9257C760F49955A23047D72C37914E79>       <82F1302E14912449A9BB43536F853CD6>]>>
startxref
116
%%EOF

显然这个预告片字典是不正确的,因为标准规定这个字典必须包含一个以Root 作为键的条目,而这个预告片没有。然后我发现偏移量 116 指向另一个外部参照表,它几乎位于文件的开头,然后是另一个确实包含 Root entry 的预告片。

xref
352 24
0000000016 00000 n
0000001914 00000 n
0000001980 00000 n
0000002147 00000 n
... ...
trailer
<</Size 376/Root 353 0 R/Info 351 0 R/ID[<9257C760F49955A23047D72C37914E79><82F1302E14912449A9BB43536F853CD6>]/Prev 4183097>>

【问题讨论】:

  • 您想要比“用于生成它的软件不能生成 100% 兼容的 PDF”更具体的东西吗?

标签: pdf


【解决方案1】:

您描述的内容看起来像线性化的 PDF。由于您已经参考了 PDF 规范,因此您还应该查看 Annex F(规范)线性化 PDF,特别是在 F.3.11 主要交叉引用和预告片部分(第 11 部分)

主预告片没有Prev条目,并且不得包含除Size之外的任何条目。

因此,至少对于线性化 PDF,预告片不需要包含您要查找的条目。严格来说,在您的示例文件的最终预告片中实际上存在一个不同的错误:它包含一个 ID 条目,尽管要求它不应包含除 Size 之外的任何条目.

在 F.3.1 中,您会找到一个线性化 PDF 结尾的示例:

trailer
<< /Size 43>>% Trailer need not contain other entries; in particular,
% it should not have a Prev entry
% Offset of first-page cross-reference table (part 3)
startxref
257
%%EOF

【讨论】:

  • 我在answer 中添加了更多注意事项。
【解决方案2】:

我认为@Richard 是正确的,因为 ISO 32000-1:20087.5.5 文件预告 部分似乎已经过时并且缺乏上下文集成具有线性化 PDF 和外部参照流的规范。这种缺乏整合的后果是:

  • 最后一个startxref 行之前是last增量更新的尾部字典,仅当文档是非线性化且没有交叉引用流时;
  • 如果文档有交叉引用流,则预告片是startxref 指令指向的对象的字典;
  • 如果文档是线性化的并且有交叉引用表,最后startxref 行前面是主交叉引用表的尾部(参见F.3.11 主要交叉引用和尾部) .

作为集成规范的隐含结果,只有具有交叉引用流的文档才能有效地提前确定文档中外部参照条目表的大小(参见 表 15 – 文件中的条目中的条目 /Size预告片字典)。

【讨论】:

  • 当心,您在这里混合了增量更新和线性化 PDF。虽然在线性化 PDF 中确实使用了增量更新机制,但在线性化 PDF 中没有增量更新。此外,我无法理解你的论点。线性化的效果在流和表的情况下基本相同。
  • 我理解滥用“增量更新”机制来实现线性化 PDF。我的观点是试图找到在考虑所有规范特征时普遍适用的不变规则。我使用这些不变量来修复我的 pdfmm 库(ex-PoDoFo)中的一个错误,即报告一个完全有效的线性化 PDF 的警告。这些不变量可能措辞不完美,但在实现 PDF 解析例程时应该指出这一点。
猜你喜欢
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多