【工具类】PDF文件转图片

PDF文件转文件

1. 引入Maven依赖

主要使用了 pdfbox 包与 hutool 包。

pdfbox 负责 pdf 到图片的转换;

hutool 负责文件读取转换。

xml 复制代码
<dependency>
	<groupId>org.apache.pdfbox</groupId>
	<artifactId>pdfbox</artifactId>
	<version>2.0.27</version>
</dependency>
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.34</version>
</dependency>
2. 代码实现

主要思路:

pdfbox 提供了操作输入流与操作字节数组的两种方式。

2.1 字节数组
java 复制代码
public void pdf2Image() {
	// 这边简单采用读取本地文件的形式
    File file = new File("");
    File outFile = new File("");
    byte[] bytes = FileUtil.readBytes(file);

    String formatName = "png";

    try (PDDocument document = PDDocument.load(bytes)) {
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int numberOfPages = document.getNumberOfPages();

        // 将 BufferedImage 转换为字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (int i = 0; i < numberOfPages; i++) {
            // 渲染第一页为 BufferedImage
            BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 50);
            ImgUtil.write(bufferedImage, formatName, baos);
        }

        OutputStream outputStream = new FileOutputStream(outFile);
        baos.writeTo(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

通过字节数组可实现 pdf 文件转换为图片,但是这个代码在处理大文件时会一次性把文件读进内存导致内存溢出

2.2 文件流
java 复制代码
public void pdf2Image() {
    File file = new File("");
    File outFile = new File("");
    String formatName = "png";

    try (InputStream is = new BufferedInputStream(new FileInputStream(file))) {
        PDDocument document = PDDocument.load(is, MemoryUsageSetting.setupTempFileOnly());
        PDFRenderer pdfRenderer = new PDFRenderer(document);
        int numberOfPages = document.getNumberOfPages();

        // 将 BufferedImage 转换为字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (int i = 0; i < numberOfPages; i++) {
            // 渲染第一页为 BufferedImage
            BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 50);
            ImgUtil.write(bufferedImage, formatName, baos);
        }

        OutputStream outputStream = new FileOutputStream(outFile);
        baos.writeTo(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
相关推荐
阿维的博客日记5 分钟前
为什么会增加TreeMap和TreeSet这两类,有什么核心优势吗?可以解决什么核心痛点?
java·treeset·treemap
dllxhcjla13 分钟前
黑马头条1
java
宠友信息16 分钟前
一套基于uniapp+springboot完整社区系统是如何实现的?友猫社区源码级功能解析
java·spring boot·后端·微服务·微信·uni-app
humors22127 分钟前
各厂商工具包网址
java·数据库·python·华为·sdk·苹果·工具包
无限进步_36 分钟前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
海兰1 小时前
使用 Spring AI 打造企业级 RAG 知识库第二部分:AI 实战
java·人工智能·spring
历程里程碑1 小时前
二叉树---二叉树的中序遍历
java·大数据·开发语言·elasticsearch·链表·搜索引擎·lua
小信丶1 小时前
Spring Cloud Stream EnableBinding注解详解:定义、应用场景与示例代码
java·spring boot·后端·spring
无限进步_2 小时前
【C++】验证回文字符串:高效算法详解与优化
java·开发语言·c++·git·算法·github·visual studio
亚历克斯神2 小时前
Spring Cloud 2026 架构演进
java·spring·微服务