12

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

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

但是,我在 PDF 1.7 规范中找不到任何相关信息。我在互联网上找到了几个地方也提到了这一点。

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

4

2 回答 2

14
于 2012-08-10T07:06:28.950 回答
11

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

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

PDF 可能有多个增量更新。

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

这种“增量更新”功能的优势(或劣势——取决于您的具体观点)是:您可以通过简单地删除倒数第二行之后的所有行来恢复 PDF 文件的先前版本%%EOF(您可以继续该过程,直到您到达第一个文件版本)。

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

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

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

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

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

因此,请注意不经意间和意外发生的信息泄露,因为您不了解上述第二点中概述的 Acrobat 行为。


更新

我最近为 TROOPERS15 会议上的 PDF 研讨会(视频)创建了一个手工编码的 PDF 文件,用于研究此功能的详细信息:

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