由于工作需要,要从pdf文件中提取出图片保存到本地,项目中就引用到了Apache PDFBox库。
1 什么是Apache PDFBox?
Apache PDFBox库,一个用于处理PDF文档的开源Java工具。它允许用户创建全新的PDF文件,操作现有的PDF文档,以及从PDF文件中提取内容等。
1.1 Apache PDFBox的主要功能
- Extract Text:从PDF文件中提取Unicode文本。
- Split & Merge:将单个PDF拆分成多个文件,或将多个PDF文件合并为一个文件。
- Fill Forms:从PDF表单中提取数据或填写PDF表单。
- Preflight:根据PDF/A-1b标准验证PDF文件。
- Print:使用标准Java打印API打印PDF文件。
- Save as Image:将pdf文件保存为图像文件,如PNG或JPEG。
- Create PDFs:从头开始创建新的PDF文件,包含嵌入字体和图像。
- Signing:对PDF文件进行数字签名。
1.2 Apache PDFBox的组件
1.3 Apache PDFBox相关依赖
PDFBox版本 | JDK最低版本 | Maven版本 |
---|---|---|
PDFBox4.0.0-SNAPSHOT | JDK 11 | Maven 3 |
PDFBox 3.0.x | JDK 8 (目前测试进行到Java 19) | Maven 3 |
PDFBox 2.0.x | JDK 7 | Maven 3 |
2 从pdf中提取图片代码实现
2.1 SpringBoot工程引入依赖
该SpringBoot项目使用Java8。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.21</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version>
</dependency>
2.2 测试代码
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
public class PdfGetJpg {
public static void main(String[] args) {
// 创建文件对象
File file = new File("C:\\test.pdf");
export(file);
}
private static void export(File file) {
String fileName = file.getName().substring(0, file.getName().indexOf('.'));
PDDocument document = null;
try {
//解析PDF并加载
document = PDDocument.load(file);
//获取索引为0的页面(也就是获取第一页)
PDPage page = document.getPage(0); // 可以通过获取页数进行循环每一页
//获取页面所需的任何资源的字典
PDResources resources = page.getResources();
//返回XObject资源的名称
Iterable<COSName> cosNames = resources.getXObjectNames();
if(cosNames != null) {
Iterator<COSName> cosNameIterator = cosNames.iterator();
while (cosNameIterator.hasNext()) {
COSName cosName = cosNameIterator.next();
//判断给定名称的XObject资源是否为图像
if(resources.isImageXObject(cosName)) {
PDImageXObject pdImage = (PDImageXObject) resources.getXObject(cosName);
BufferedImage image = pdImage.getImage();
try(FileOutputStream fileOutputStream = new FileOutputStream(file.getParentFile().getAbsolutePath()+ File.separator + fileName + ".jpg")) {
//输出图片到指定位置
ImageIO.write(image, "jpg", fileOutputStream);
fileOutputStream.flush();
} catch (IOException e) {
System.out.println("输出文件失败:" + fileName + e.getMessage());
}
}
}
}
} catch (IOException e) {
System.out.println("提取失败:" + fileName);
} finally {
try {
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
PDFBox的其他操作具体可查看API文档: