2011-05-31 161 views
18

有没有任何方法检查一个字节[]是否是一个PDF格式,而不打开?确定是否一个字节[]是一个pdf文件

我有一些代码来显示一个字节[]的列表作为PDF缩略图。我之前知道所有的byte []都是pdf,因为我们过滤了servlet只返回这些。现在需求已经改变了,我需要把所有的文件类型都带回来。有什么方法检查byte []是什么,或者更确切地说,确定它是不是pdf?

+1

也许这可能是有些帮助:http://stackoverflow.com/questions/2731917/how-to-detect-if-a -file-is-pdf-or-tiff – 2011-05-31 11:41:38

+1

-1:打开一个十六进制编辑器并查看PDF的标题。不难。答案:'%PDF'是前4个字节。 – leppie 2011-05-31 11:41:43

+0

@leppie:有些格式没有这样的规格(例如csv)。所以,直到你找到“官方”规格 - 只是“打开一个十六进制编辑器”是非常糟糕的。例如,JPEG格式不是那么容易:) – chopikadze 2012-01-03 06:25:15

回答

39

检查数组的前4个字节。

如果这些是0x25 0x50 0x44 0x46那么它最有可能是一个PDF文件。

+0

由于某种原因,我投下了这个答案,当我打算投票。我现在不能改变它。 – 2014-03-21 19:23:30

+4

我用了这个答案好几年了,现在我正在盯着一个以0xEF 0XBB 0XBF开头的PDF。任何想法? – MichaelD 2015-02-09 20:36:41

+4

看起来这些字节被预置为UTF-8格式的PDF。这意味着你不能盲目地检查0x25 0x50 ... – MichaelD 2015-02-09 20:55:38

8

据我所知,所有的PDF的开头%PDF,所以你可以检查字符串的第一个字节。

14

前四个字节应该是:0x25 0x50 0x44 0x46(十六进制格式,ASCII码是%PDF)。 “幻数”可以找到其他格式here

3

虽然标记的答案和其他答案是正确的,但它们在100%的时间内都不会成功。问题是PDF规范说%PDF-1.x只需要在前1024个字节而不是前4个。有些程序会在%PDF之前添加信息并仍然有效。

我会建议看以下堆栈溢出问题的答案:How to detect if a file is PDF or TIFF?

+1

*问题是PDF规范说%PDF-1.x只需要在前1024个字节而不是前4个* - 这是错误的,规格说明(ISO 32000-1)明确指出:“** PDF文件的第一行应为由5个字符%PDF组成的标题,后跟格式为1.N的 版本,其中N是0之间的数字和7 **“。即使Adobe PDF参考文献也类似地指出:“PDF文件的第一行是标识文件符合的PDF规范版本的标题”,并提供与规范相同的变体。仅仅... – mkl 2016-03-11 11:32:38

+0

...仅仅是Adobe PDF参考文件的***实现注释***说,“** Acrobat浏览器只需要标题出现在文件的前1024个字节内**。”因此,“某些程序会在%PDF之前添加信息并仍然有效。”是错误的,创建的PDF文件是***无效的***,它们只是被许多浏览者接受和显示,尽管它被破坏了;他们也被许多其他PDF处理器拒绝。 – mkl 2016-03-11 11:34:44

+0

%PDF-1.x的值可能比前几个字符出现更多,并且与您提到的相反,仍然有效。我有几个有效的PDF文件,其中%PDF-1.x出现在前8个字符之外。因此,我正在寻找一个很好的答案来解决这个问题。不幸的是,除1个帖子外,其他人都说使用前几个字符并匹配%PDF-1.x。有几个文件是有效的,没有这种方法,这让我指出,只检查前几个字符的方法并不总是有效的,正如我在帖子中所说的那样,并推荐了其他方法。 – 2016-03-11 17:41:52

相关问题