使用 Java 判斷文件是否為 PDF 文件
1.概述
在本教學中,我們將探索幾種使用 Java 確定文件是否為 PDF 的方法,使用無需第三方相依性且使用不同函式庫的方法。
2. 透過文件簽名檢測
文件簽名也稱為魔術數字。文件開頭的位元組序列決定了文件的類型。
PDF檔案簽章包含十六進位的25 50 44 46 2D。我們可以將其編碼為 ASCII 字串“ %PDF-
” 。
在本節和以下部分中,我們將使用包含 PDF 檔案的以下常數來執行測試:
final File PDF_FILE = new File("src/test/resources/input.pdf");
我們提取文件的前五個位元組並將它們與此文件簽名進行匹配,以識別它是否是 PDF:
@Test
void whenDetectPdfByFileSignature_thenCorrect() throws IOException {
boolean isPdf = false;
try (InputStream fis = new BufferedInputStream(new FileInputStream(PDF_FILE))) {
byte[] bytes = new byte[5];
if (fis.read(bytes) == 5) {
String header = new String(bytes);
isPdf = Objects.equals(header, "%PDF-");
}
}
assertTrue(isPdf);
}
我們可以看到,檢測只需要前幾個位元組。因此,這是一種輕量級的方法,我們不需要任何第三方依賴。
如果我們喜歡使用第三方依賴項而不是自己編寫檢測程式碼,我們可以有以下三種不同的選擇。在內部,它們也都依賴檔案簽章進行偵測。
3. 使用 Apache Tika 檢測
Apache Tika 是一個開源工具包,提供用於偵測各種文件類型(包括 PDF)的單一介面。如果我們需要在應用程式中執行多種文件類型識別,它會很方便。
讓我們在pom.xml
中包含以下 Maven依賴項:
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>3.1.0</version>
</dependency>
在這個例子中,我們只需呼叫detect()
方法來找出檔案的 MIME 類型,如果檔案是application/pdf
,則認為它是 PDF:
@Test
void whenDetectPdfByTika_thenCorrect() throws IOException {
Tika tika = new Tika();
boolean isPdf = Objects.equals(tika.detect(PDF_FILE), "application/pdf");
assertTrue(isPdf);
}
4. 使用 Apache PDFBox 檢測
Apache PDFBox 是用於以程式設計方式操作 PDF 檔案的熱門開源 Java 程式庫之一。
讓我們在pom.xml
中包含以下 Maven依賴項:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.4</version>
</dependency>
我們使用Loader
類別來解析 PDF 檔案。如果檔案不是有效的 PDF,則會拋出IOException
:
@Test
void whenDetectPdfByPdfBox_thenCorrect() throws IOException {
boolean isPdf;
try (PDDocument document = Loader.loadPDF(PDF_FILE)) {
isPdf = true;
} catch (IOException ioe) {
isPdf = false;
}
assertTrue(isPdf);
}
由於PDDocument
佔用系統資源,我們必須確保在使用後關閉它,以避免記憶體洩漏。這可以使用try-with-resources
區塊來處理,該區塊關閉實作Closable
介面的資源。
5. 使用 iText 檢測
iText 是另一個用於以程式設計方式操作 PDF 檔案的開源 Java 程式庫。
我們包含以下 Maven依賴項來使用 iText:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.4</version>
</dependency>
我們透過將檔案讀取為PdfDocument
來確定檔案類型。如果檔案不是有效的 PDF, PdfReader
將拋出ITextException
:
@Test
void whenDetectPdfByItext_thenCorrect() {
boolean isPdf;
try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(PDF_FILE))) {
isPdf = true;
} catch (ITextException | IOException e) {
isPdf = false;
}
assertTrue(isPdf);
}
Apache PDFBox 和 iText 都可以偵測 PDF 文件類型,並且還可以讀取整個文件。如果我們只想檢測文件類型而不是操作它,那麼它們通常是多餘的。在這種情況下,輕量級方法總是更受歡迎。
6. 結論
在本文中,我們探討了確定文件是否為 PDF 的不同方法。
如果我們也需要操作 PDF,那麼 Apache PDFBox 和 iText 對我們來說是最好的。如果我們只關心文件類型,我們可以驗證 PDF 文件簽名或使用 Apache Tika 來避免讀取整個 PDF 文件。
與往常一樣,完整的程式碼範例可 在 GitHub 上找到。