PDF中的%%EOF是否必须显示在文件的最后1024字节内?

PDF中的%%EOF是否必须显示在文件的最后1024字节内?,pdf,Pdf,据我读到的消息来源称,其中有一段关于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规范中找不到任何与此相关的信息。我在网上找到了几个地方也提到了这一点 我的问题是:这是真的吗?如果是,在哪里指定%%

据我读到的消息来源称,其中有一段关于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字节?

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

7.5.5。文件预告片

PDF文件的尾部使合规读者能够快速找到交叉参考表和某些特殊对象。合格的读者应该从末尾阅读PDF文件。文件的最后一行应仅包含文件结束标记,%%EOF

所以,如果你遵循标准,它甚至比你说的更严格


回到Adobe 1.3规范,在附录H(实现说明)中,您会发现关于Acrobat viewer属性的一个小片段(不是文件格式):

3.4.4,“文件拖车”

Acrobat查看器仅要求%%EOF标记出现在文件最后1024字节的某个位置

换句话说,这意味着查看器(Adobe的实现)在接受什么方面更为宽松。然而,规范本身仍然坚持认为,
%%EOF
必须独立于最后一行

该注释在Adobe版本的文件格式文档1.7之前仍然存在。然而,它被从ISO版本中删除了,因为ISO完全不关心产品的具体实现,只要它们符合编写的标准


Adobe的文档可以找到,他们也有权发布ISO 32000标准的(稍加修改)版本。

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

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

PDF可能有多个增量更新

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

此“增量更新”功能的优点(或缺点——取决于您的具体观点)是:您只需删除第二个但最后一个
%%EOF
之后的所有行,即可恢复PDF文件的早期版本(您可以继续此过程,直到获得第一个文件版本)

还有一个名为
pdfrecurrect

  • 它可以报告已应用于PDF的增量更新的数量
  • 可以提取以前的版本,以及
  • 它可以“展平”历史并创建一个只包含最新版本的新PDF
这种“增量更新”功能在现实世界的PDF中是否经常使用? 首先:只要对PDF应用了数字/电子签名,就会使用它

Second:只要单击
save
按钮,Adobe Acrobat就会以标准方式保存PDF文件。(如果要避免以增量方式更新文档,请改用
另存为…
)当简单的
保存
单击将不再以最新版本的Acrobat增量更新文件,而是在删除完整页面后生成全新的PDF时,会出现少数例外情况之一(似乎有太多的Adobe客户抱怨以前的版本,因为任何增量更新都会增加文件大小——太多的客户对删除页面会给他们带来更大的PDF感到恼火,而且也没有真正删除页面)

因此,请注意意外发生的信息泄漏,因为您没有意识到上面第二点中概述的Acrobat行为


更新 我最近为在创建了一个手工编码的PDF文件,可用于研究此功能的详细信息:

  • (GitHub上为8.3KB)
    (我建议下载后备份文件。然后只需删除第一个
    %%EOF
    后的每一行,保存文件并查看现在可见的内容…)

可能注释将
%%EOF
与线性化参数字典混淆,后者必须位于文件的前1024字节。
%%EOF
必须是文件的最后一行(根据paxdiablo的回答),所以无论如何,这将始终在最后1024字节内。@omz:这不仅仅是注释,源代码会执行
seek(-1054,seek\u END)
然后从那里读。啊,我明白了,被接受的答案更有意义,我不知道。这些很有用,谢谢。我很好奇为什么我的新PDF有
预告片…startxref,,%%EOF..xref…预告片..startxref..%%EOF
而我的旧PDF只有
预告片..startxref..%EOF
。新的是通过Word 2013的酒吧生成的丽斯。我应该停止对生成的PDF进行差异化…@basher:没有必要停止对生成的PDF进行差异化,只要它不断触发您了解更多关于“电子文档格式”这个奇怪世界的信息…:-)