【问题标题】:Are byte order marks allowed in PDF document?PDF 文档中是否允许使用字节顺序标记?
【发布时间】:2015-10-15 15:30:31
【问题描述】:

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

25 50 44 46 2D

这很好用,只是我看到一些以字节顺序标记开头的文件:

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

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

PDF 文件的第一行应是由 5 个字符 %PDF– 后跟 1.N 形式的版本号组成的标题,其中 N 是 0 到 7 之间的数字

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

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

【问题讨论】:

    标签: pdf byte-order-mark


    【解决方案1】:

    那么:在 PDF 文档的开头是否允许使用 BOM 标记?

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

    Adobe Reader 在接受文件方面有着悠久的历史,尽管有一些前导或尾随的垃圾字节。

    参照。 Adobe的pdf_reference_1-7附录H中的实现说明:

    3.4.1,“文件头”

    1. Acrobat 查看器只要求标题出现在 文件的前 1024 个字节。

    2. Acrobat 查看器也接受表单的标题

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

    ...

    3.4.4,“文件尾”

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 您的最后一段实际上是不正确的。许多应用程序专门在 PDF 文件的前面添加了二进制数据,以强制文件传输协议将文件作为二进制文件处理,而不是通过错误处理平台之间的行尾来破坏 PDF 文件。由于 Adob​​e Acrobat 一直都能正确处理这个问题(因此其他 PDF 阅读器也没有必要),这没什么大不了的。
      • 我们可能会分道扬镳,但我仍然坚持这一说法。该规范实际上建议之后,ASCII 版本标题作者应该包含一个带有四个二进制字符的注释部分,以在他们的 PDF 包含二进制数据时强制进行二进制传输(现在大多数都是这样做的)。然而,正如 OP 所要求的那样,这不是文件开头的 BOM。 (实际上,它并不是真正的 BOM。)此外,在我 15 年以上的 Web 开发中,我从未将垃圾数据放在任何二进制文件的前面来强制它下载,为此有一个专用的 HTTP 标头。
      • 我不是说你做到了 :) 但它很常见。我编写了 PDF 预检软件,而且前面有一堆垃圾(当然不是 BOM)的 PDF 文件很常见。这不是由有缺陷的软件完成的,而是非常刻意的。
      • 我通常将人类归入“有缺陷的软件”类别;)
      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2020-10-22
      • 2010-11-07
      • 2011-10-30
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多