PDF 文档中是否允许使用字节顺序标记?

Are byte order marks allowed in PDF document?

我写的过滤程序有问题。它通过读取文件的前 5 个字节并将其与固定缓冲区进行比较来检测文件是否为 PDF 文档:

25 50 44 46 2D

除了我看到一些以字节顺序标记开头的文件外,这工作正常:

EF BB BF 25 50 44 46 2D ^-------^

我想知道 PDF specs 是否真的允许这样做。如果我查看该文档的第 7.5 节,我将其读作 "no":

The first line of a PDF file shall be a header consisting of the 5 characters %PDF– followed by a version number of the form 1.N, where N is a digit between 0 and 7

然而,我在野外看到这些文档,用户感到困惑,因为 PDF reader 程序可以通过我的过滤器拒绝它们来打开这些文档。

那么:PDF 文档的开头是否允许使用 BOM 标记? (我在这里不是在谈论字符串对象,而是在谈论 PDF 文件本身)

不,BOMPDF 文件的前面 不是 有效。

PDF 是一种二进制文件格式,因此 BOM 实际上没有意义,就像在 ZIP 文件或 JPEG 文件的前面有 BOM 一样。

我猜您正在使用的 PDF 是来自错误配置的应用程序,这些应用程序要么已经在其输出缓冲区的前面有一些东西,要么更有可能是在错误地假设 PDF 是文本的情况下创建的基于格式。

So: are BOM markers allowed at the start of PDF documents ?

不,就像您在规范中读到的那样,“%PDF”字节之前不允许有任何内容。

但是 Adobe Reader 长期以来一直接受文件,尽管有一些前导或尾随垃圾字节。

比照。 Adobe pdf_reference_1-7:

附录 H 中的实现说明

3.4.1, “File Header”

  1. Acrobat viewers require only that the header appear somewhere within the first 1024 bytes of the file.

  2. Acrobat viewers also accept a header of the form

    %!PS−Adobe−N.n PDF−M.m
    

...

3.4.4, “File Trailer”

  1. Acrobat viewers require only that the %%EOF marker appear somewhere within the last 1024 bytes of the file.

而且人们倾向于认为 Adob​​e Reader 根据需要显示的 PDF 是有效的,有很多 PDF 确实在前面有垃圾字节。