2011-05-31 114 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

相關問題