1. 概述

在这个教程中,我们将了解使用iTextPDFBox库在Java中获取PDF文件信息的不同方法。

2. 使用iText库

iText是一个用于创建和操作PDF文档的库。它也提供了一种简单的方式来获取文档信息。

2.1. Maven依赖

首先,在pom.xml中声明itextpdf依赖:

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13.3</version>
</dependency>

2.2. 获取页面数量

创建一个名为PdfInfoIText的类,其中包含一个返回PDF文档页面数的getNumberOfPages()方法:

public class PdfInfoIText {

    public static int getNumberOfPages(final String pdfFile) throws IOException {
        PdfReader reader = new PdfReader(pdfFile);
        int pages = reader.getNumberOfPages();
        reader.close();
        return pages;
    }
}

在示例中,我们首先使用PdfReader类从File对象加载PDF。接着,使用getNumberOfPages()方法,最后关闭PdfReader对象。为此,我们定义一个测试用例:

@Test
public void givenPdf_whenGetNumberOfPages_thenOK() throws IOException {
    Assert.assertEquals(4, PdfInfoIText.getNumberOfPages(PDF_FILE));
}

在测试用例中,我们验证存储在测试资源文件夹中的PDF文件的页面数。

2.3. 获取PDF元数据

现在来看看如何获取文档的元数据。我们将使用getInfo()方法。这个方法可以获取文件的信息,如标题、作者、创建日期、创建者、生产者等。在PdfInfoIText类中添加getInfo()方法:

public static Map<String, String> getInfo(final String pdfFile) throws IOException {
    PdfReader reader = new PdfReader(pdfFile);
    Map<String, String> info = reader.getInfo();
    reader.close();
    return info;
}

接下来,为获取文档的创建者和生产者编写测试用例:

@Test
public void givenPdf_whenGetInfo_thenOK() throws IOException {
    Map<String, String> info = PdfInfoIText.getInfo(PDF_FILE);
    Assert.assertEquals("LibreOffice 4.2", info.get("Producer"));
    Assert.assertEquals("Writer", info.get("Creator"));
}

2.4. 了解PDF密码保护

我们还想知道文档是否受密码保护。为此,向PdfInfoIText类添加isEncrypted()方法:

public static boolean isPasswordRequired(final String pdfFile) throws IOException {
    PdfReader reader = new PdfReader(pdfFile);
    boolean isEncrypted = reader.isEncrypted();
    reader.close();
    return isEncrypted;
}

现在,编写一个测试用例来查看此方法的行为:

@Test
public void givenPdf_whenIsPasswordRequired_thenOK() throws IOException {
    Assert.assertFalse(PdfInfoIText.isPasswordRequired(PDF_FILE));
}

在下一节,我们将使用PDFBox库执行相同的工作。

3. 使用PDFBox库

另一种获取PDF文件信息的方法是使用Apache PDFBox库。

3.1. Maven依赖

我们需要在项目中包含pdfbox的Maven依赖:

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>3.0.0</version>
</dependency>

3.2. 获取页面数量

PDFBox库提供了处理PDF文档的能力。为了获取页面数,我们只需使用Loader类及其loadPDF()方法从File对象加载文档,然后使用PDDocument类的getNumberOfPages()方法:

public class PdfInfoPdfBox {

    public static int getNumberOfPages(final String pdfFile) throws IOException {
        File file = new File(pdfFile);
        PDDocument document = Loader.loadPDF(file);
        int pages = document.getNumberOfPages();
        document.close();
        return pages;
    }
}

为此创建一个测试用例:

@Test
public void givenPdf_whenGetNumberOfPages_thenOK() throws IOException {
    Assert.assertEquals(4, PdfInfoPdfBox.getNumberOfPages(PDF_FILE));
}

3.3. 获取PDF元数据

获取PDF元数据也很简单。我们需要使用getDocumentInformation()方法。这个方法返回文档元数据(如文档作者或创建日期)作为PDDocumentInformation对象:

public static PDDocumentInformation getInfo(final String pdfFile) throws IOException {
    File file = new File(pdfFile);
    PDDocument document = Loader.loadPDF(file);
    PDDocumentInformation info = document.getDocumentInformation();
    document.close();
    return info;
}

为此编写一个测试用例:

@Test
public void givenPdf_whenGetInfo_thenOK() throws IOException {
    PDDocumentInformation info = PdfInfoPdfBox.getInfo(PDF_FILE);
    Assert.assertEquals("LibreOffice 4.2", info.getProducer());
    Assert.assertEquals("Writer", info.getCreator());
}

在测试用例中,我们只验证文档的生产者和创建者。

3.4. 了解PDF密码保护

我们可以使用PDDocument类的isEncrypted()方法检查PDF是否受到密码保护:

public static boolean isPasswordRequired(final String pdfFile) throws IOException {
    File file = new File(pdfFile);
    PDDocument document = Loader.loadPDF(file);
    boolean isEncrypted = document.isEncrypted();
    document.close();
    return isEncrypted;
}

为验证密码保护编写一个测试用例:

@Test
public void givenPdf_whenIsPasswordRequired_thenOK() throws IOException {
    Assert.assertFalse(PdfInfoPdfBox.isPasswordRequired(PDF_FILE));
}

4. 总结

在这篇文章中,我们学习了如何使用Java中的两个流行库获取PDF文件信息。本文中展示的代码的完整工作版本可在GitHub上找到。