2016-04-01 50 views
2

使用perl,確定文件是否爲PDF的最佳方法是什麼?確定文件是否是perl中的PDF?

顯然,並不是所有的PDFs都以%PDF開頭。看到這個答案的評論:https://stackoverflow.com/a/941962/327528

+0

檢測需要多好?你是否需要檢測常見的PDF文件以將其列入白名單,或者是否應該檢測到可能以PDF格式打開的所有文件,以黑名單列出它們?後者要困難得多,因爲合法的PDF文件實際上可能包含魔術%PDF字符串之前的數據,從而欺騙你認爲這是一個圖像等而不是PDF。 –

+0

*顯然,並非所有PDF都以%PDF開頭* - 所有*有效* pdf(根據規範)都以「%PDF-1」開頭。但是,某些pdf查看者也接受無效的pdf,因此留下不同的印象。 – mkl

回答

0

模塊PDF::Parse呼籲IsaPDF

返回true,如果文件能夠被解析,是一個PDF文件的方法。

+0

PDF :: Parse :: IsaPDF只會檢查文件是否以「%PDF」開頭。 – cecukemon

1

檢測PDF並不困難,但有一些特殊情況需要注意。

  1. 所有符合的PDF文件都包含一個單行標題,用於標識文件符合的PDF規範。通常是%PDF-1.N其中N是0到7之間的數字。
    • 第3版PDF參考有一個實現注意事項,即Acrobat查看器只需要頭部出現在文件。 (我已經看到一些情況,其中一個作業控制前綴被添加到PDF文件的開頭,所以'%PDF-1'不是該文件的前七個字節)
    • 隨後的實現註釋來自第三版(PDF 1.4)指出:Acrobat觀衆還將接受表格的標題:%!PS-Adobe-Nn PDF-Mm但請注意,這不是ISO32000:2008(PDF 1.7)規範的一部分。
    • 如果文件不是立即以%PDF-1.N開始,請小心,因爲我已經看到一個情況,即包含PDF的zip文件被錯誤地識別爲PDF,因爲該部分嵌入文件不是' t壓縮。所以檢查PDF文件預告片是個好主意。
  2. 一個PDF的結束將包含「%% EOF」中的線,
    • 的PDF參考第三版有一個實現注意,Acrobat查看只需要出現的%% EOF標記在文件的最後1024個字節內。
    • %% EOF上面的兩行應該是'startxref'標記,而它們之間的行應該是從文件開頭到最後一個交叉引用表的字節偏移量的數字。

總之,在文件轉換成字節的緩衝區的第一個和最後一個1KB讀,檢查相關識別的字節串令牌約在那裏他們都應該是,如果他們是那麼你有一個合理的期望,你有一個PDF文件在你的手中。