由于工作需要,要从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文档:
感谢你看到了现在,最后别忘了点个赞哦!