PDF中的%% EOF是否必须出现在文件的最后1024个字节内?

Jes*_*ood 8 pdf

根据QPDF来源,我正在阅读它有关于pdfs的引用:

// PDF spec says %%EOF must be found within the last 1024 bytes of
// the file.  We add an extra 30 characters to leave room for the
// startxref stuff.
Run Code Online (Sandbox Code Playgroud)

但是,我在PDF 1.7规范中找不到任何相关信息.我发现互联网上有几个地方也提到过这个.

我的问题是:这是真的,如果是这样的话,这个指定的位置%%EOF将在最后的1024个字节中?

pax*_*blo 12

确实说源代码确实如此libqpdf/QPDF.cc,但ISO 32000-1:2008(PDF 1.7 one)对文件预告片有这样的说法:

7.5.5.档案预告片

PDF文件的预告片使符合本标准的阅读器能够快速找到交叉引用表和某些特殊对象.合规读者应从其末尾阅读PDF文件.文件的最后一行应仅包含文件结束标记%% EOF.

所以,如果你遵循标准,那就比你所说的更具限制性.


回到Adobe 1.3规范,在附录H(实施说明)中,您将找到关于Acrobat查看器属性的小片段(不是文件格式):

3.4.4,"文件预告片"

Acrobat查看器仅需要%% EOF标记出现在文件的最后1024个字节内的某处.

换句话说,它表示观众(Adobe的实现)在它接受的内容方面稍微放松一些.然而,规范本身仍然认为%%EOF必须在最后一行独立存在.

该说明仍然存在于Adobe的1.7版文件格式文档中.但是,它已从ISO版本中删除,因为正确如此,ISO不关心产品的特定实现,只要它们符合所写的标准.

Adobe的文件可以发现在这里,他们也有分发ISO 32000标准的(略有修改)版本的权利在这里.


Kur*_*fle 11

您还应该了解 PDF 文档可以使用的(标准)功能:称为增量更新

如果文档已被增量更新,则可以通过保留原始数据(包括最后%%EOF一行)并在其后附加任何更改或添加的对象来创建它的新修改版本,并在新文件末尾补​​充附加xreftrailer部分以及额外的最终%%EOF.

一个 PDF 可能有多个增量更新。

这样,第一个%%EOF可以出现在“文件的最后 1024 个字节”之前。

这种“增量更新”功能的优点(或缺点——取决于您的具体观点)是:您可以通过简单地删除第二个但最后一个%%EOF(您的可以继续该过程,直到您到达第一个文件版本)。

还有一个命令行工具叫做 pdfresurrect

  • 它可以报告已应用于 PDF 的增量更新数量,
  • 它可以提取以前的版本,以及
  • 它可以“展平”历史并创建一个仅包含最新版本的新 PDF。

这种“增量更新”功能在现实世界的 PDF 中是否经常使用?

第一:只要有应用于 PDF 的数字/电子签名,就会使用它。

第二:只要您单击Save按钮,这是 Adob​​e Acrobat 保存 PDF 文件的标准方式。(如果您想避免增量更新文档,请Save as...改用!)少数例外之一Save是,在您删除完整页面后,单击将不再使用最新版本的 Acrobat 增量更新文件,但会生成全新的 PDF (似乎有太多 Adob​​e 客户抱怨以前的版本,因为任何增量更新都会增加文件大小——太多人对删除页面给他们带来更大的 PDF 感到恼火,而且也没有真正删除页面)

因此请注意无意和意外发生的信息泄漏,因为您不知道上面第二点中概述的 Acrobat 行为。


更新

我最近创建了一个手工编码的PDF文件PDF车间(视频)TROOPERS15会议,它可以用来研究此功能的详细信息:

  • 114_incrementally-updated.pdf(GitHub 上的 8.3 kB)
    (我建议在下载后制作文件的备份副本。然后只需删除第一行之后的每一行%%EOF,保存文件并查看现在可见的内容... )