1. 概述
在这个教程中,我们将了解使用iText和PDFBox库在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上找到。