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

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

相关推荐
开开心心就好4 小时前
Word转PDF工具,免费生成图片型文档
前端·网络·笔记·pdf·word·powerpoint·excel
演绎平生18 小时前
=word插入公式后行距变大怎么办?-笔记
pdf
2501_929157681 天前
Switch 20.5.0系统最新PSP模拟器懒人包
android·游戏·ios·pdf
zstar-_1 天前
FreeP2W:一个PDF转Word的CLI工具
pdf·word
njsgcs1 天前
读取文件夹内的pdf装换成npg给vlm分类人工确认然后填入excel vlmapi速度挺快 qwen3-vl-plus webbrowser.open
分类·pdf·excel
web打印社区2 天前
使用React如何静默打印页面:完整的前端打印解决方案
前端·javascript·vue.js·react.js·pdf·1024程序员节
十五春会2 天前
【uniapp】App平台展示pdf文件
pdf·uni-app
星空的资源小屋2 天前
Antares SQL,一款跨平台开源 SQL 客户端
数据库·人工智能·pdf·开源·电脑·excel·1024程序员节
羑悻的小杀马特2 天前
告别内网限制!用StirlingPDF+cpolar打造可远程访问的PDF工具站
pdf·cpolar·1024程序员节·stirlingpdf
Knight_AL2 天前
Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案)
spring boot·pdf·开源