2015-10-15 60 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文件非常常見。這不是由錯誤的軟件,而是非常刻意地完成的。 –

    相關問題