PDF中的%%EOF是否必须显示在文件的最后1024字节内?
据我读到的消息来源称,其中有一段关于PDF的引述: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 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
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进行差异化,只要它不断触发您了解更多关于“电子文档格式”这个奇怪世界的信息…:-)