从PDF中提取图片

由于工作需要,要从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。

XML 复制代码
<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 测试代码

java 复制代码
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文档:

感谢你看到了现在,最后别忘了点个赞哦!

相关推荐
bianshaopeng1 小时前
android 原生加载pdf
android·pdf
卢卡斯2331 小时前
在线PDF怎么转换成JPG图片?分享14种转换操作!
pdf
J不A秃V头A8 小时前
iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行
java·pdf
嘻嘻仙人1 天前
【杂谈一之概率论】CDF、PDF、PMF和PPF概念解释与分析
pdf·概率论·pmf·cdf
资深前端之路1 天前
vue2 将页面生成pdf下载
前端·vue.js·pdf
Eiceblue1 天前
Python 复制PDF中的页面
vscode·python·pdf
J不A秃V头A2 天前
使用iTextPDF库设置文字为英文样式
java·pdf
Odoo穆尘2 天前
【零散技术】Odoo PDF 打印问题问题合集
pdf·odoo
暮毅2 天前
一、前后端分离及drf的概念
django·pdf·前后端分离
ziyue75752 天前
java将word转pdf
java·pdf·word