Java 中读写 PDF 需要使用到第三方类库,目前比较流行的有 iText 和 PDFBox 。
iText
iText是一个强大的库,用于创建和操作PDF文档。它提供了丰富的功能,包括文本、图像、表格的添加,以及PDF的合并、分割和加密等。
iText 依赖库
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
最新版本可以查看MVN中央仓库
当前的最新版 5.5.x 发布与 2022 年,已经有比较久没有更新了。
获取PDF页数
下面的 getNumberOfPages()
方法用于返回 PDF 文档中的页数:
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对象。
获取 PDF 元数据
下面的 getInfo()
方法可以获取PDF文件的元信息,如标题、作者、创建日期、创建者等。
public static Map<String, String> getInfo(final String pdfFile) throws IOException {
PdfReader reader = new PdfReader(pdfFile);
Map<String, String> info = reader.getInfo();
String producer = info.get("Producer");
String writer = info.get("Creator");
reader.close();
return info;
}
可以从 Map<String, String>
中获取到部分元数据信息。
PDFBox
Apache PDFBox是由Apache软件基金会维护的开源库,用于处理PDF文档。它提供了一套全面的API来创建、渲染、打印和操作PDF文件。
PDFBox 依赖库
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.2</version>
</dependency>
PDFBox 是有 Apache 维护的,一直在持续迭代中。
获取PDF页数
PDFBox 库提供了处理 PDF 文档的功能。为了获取页数,我们只需使用Loader类及其loadPDF()方法从File对象加载文档。
之后,我们使用PDDocument类的getNumberOfPages()方法:
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;
}
获取 PDF 元数据
PDFBox 获取 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();
String producer = info.getProducer();
String writer = info.getCreator();
document.close();
return info;
}
可以看到,PDFBox 获取数据更加地面向对象。
总结
iText和Apache PDFBox都是处理PDF文件的强大工具。iText提供了广泛的PDF创建和操作功能,而PDFBox则提供了一个全面的、面向对象的API来处理PDF文档。
选择哪个库取决于具体的项目需求、预算(iText在商业使用上可能有限制)以及对库的个人喜好。
开发者应该检查每个库的最新版本,以确保使用最新的功能和安全更新。在使用这些库时,还应该注意适当地管理资源,如在使用完毕后关闭文档,以避免内存泄漏。