从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。

<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文档:

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

相关推荐

  1. 使用 Python PDF 文件提取、转换图像

    2023-12-27 16:52:02       17 阅读
  2. python:PyPDF2 PDF文件提取目录

    2023-12-27 16:52:02       28 阅读
  3. ROSBAG提取图片

    2023-12-27 16:52:02       53 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-27 16:52:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-27 16:52:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-27 16:52:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-27 16:52:02       18 阅读

热门阅读

  1. python异常之assert语句

    2023-12-27 16:52:02       47 阅读
  2. MongoDB 根据 _id 获取记录的创建时间并回填记录中

    2023-12-27 16:52:02       29 阅读
  3. Jtti 香港服务器使用RAID技术的优势

    2023-12-27 16:52:02       36 阅读
  4. Python爬虫如何处理页面中的相对链接

    2023-12-27 16:52:02       41 阅读
  5. centos mysql8 设置远程访问

    2023-12-27 16:52:02       43 阅读
  6. 零基础学C语言——内存管理

    2023-12-27 16:52:02       46 阅读
  7. 前端小白年度总结

    2023-12-27 16:52:02       31 阅读