2015-10-15 25 views
3

我遇到了我编写的过滤器程序的问题。它可以检测如果文件是PDF文档阅读前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标记? (我不是在谈论一个String对象,但这里的PDF文件本身)

回答

7

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

不,就像你在规范中读到的一样,在“%PDF”字节前面什么也不允许。

但是Adob​​e Reader尽管存在一些前导或尾随垃圾字节,但仍有很长时间接受文件的历史。

参考实施笔记Adobe的pdf_reference_1-7附录H:

3.4.1,“文件头”

  • 的Acrobat观众只需要头出现内 的某处该文件的前1024个字节。

  • 的Acrobat观众也接受形式

    %!PS−Adobe−N.n PDF−M.m 
    
  • 的头...

    3.4.4,“文件尾”

  • 的Acrobat观众只表示%%EOF标记出现的最后1024个字节的文件内的某处 需要。
  • 而且,人们不得不思考的倾向,一个PDF是ADOBE READER显示为期望的是有效的,也有在野外许多PDF文件是确实有垃圾字节前面。

    3

    不,BOM有效的在前面的PDF文件。

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

    我猜你正在使用的PDF是来自错误配置的应用程序,它们或者已经在输出缓冲区的前面已经有东西,或者更可能是用不正确的假设创建的,基于格式。

    +0

    您的最后一段实际上是不正确的。许多应用程序专门在PDF文件的前面添加了二进制数据,以便强制文件传输协议将文件作为二进制文件处理,而不会通过错误处理平台之间的结尾来破坏PDF文件。由于Adobe Acrobat一直在正确地处理这个问题(因此也需要其他PDF阅读器),这并不是什么大不了的事情。 –

    +0

    我们可能会劈头发,但我仍然支持这种说法。该规范实际上建议_after_ ASCII版本标题作者应该包含一个包含四个二进制字符的注释部分,以在其PDF包含二进制数据(这些日子大部分都是这样)时强制进行二进制传输。然而,这不是OP文件开头的BOM,但是。 (实际上它并不是真正的BOM。)另外,在我15多年的Web开发中,我从来没有将垃圾数据放在任何二进制文件的前面来强制它下载,这里有一个专用的HTTP头。 –

    +0

    我不是说你做了它:)但它通常是完成的。我已经在前面写了一堆垃圾(当然不是BOM),PDF书面预检软件和PDF文件非常常见。这不是由错误的软件,而是非常刻意地完成的。 –

    相关问题