Java实现PDF文件转图片(支持单页和多页)

article/2025/11/7 18:43:42

目录

    • 一、背景
    • 二、maven环境
      • 2.1、依赖
      • 2.2、插件
    • 三、PDF工具类
    • 四、实践
      • 4.1、单页PDF形式的发票转为图片
      • 4.2、多页PDF文档转为图片
    • 结语

一、背景

  很多小伙伴们不知道怎么把PDF文件转成图片,并且网上的实例总是跑不通,因为很多小细节没有写出来。现在我给大家两个个完整的实例:单页PDF形式的发票转为图片多页PDF文档转为图片。我这边采用的是springboot项目,JDK是1.8。具体的环境搭建和项目的创建我就不多说了,网上关于这些有很多的教程,请大家仔细查阅。

二、maven环境

2.1、依赖

本文主要以maven项目进行相关事例

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope>
</dependency><!--主要用到Pair类-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.23</version><type>bundle</type>
</dependency>

2.2、插件

  很多小伙伴可能会依赖有问题,那是因为pdfbox的依赖类型为bundle,需要加载插件:把他放到<build></build>标签下的<plugins></plugins>里面,插件依赖如下:

<plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions>
</plugin>

三、PDF工具类

PdfUtil.java

本工具类主要使用到apache的pdfbox和common-lang3实现(临时写的,异常处理就没有特别关注,主要在于怎么转换)

package com.alian.csdn.utils;import org.apache.commons.lang3.tuple.Pair;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class PdfUtil {/*** @param source      原文件* @param desFilePath 生成图片的路径* @param desFileName 生成图片的名称(多页文档时会变成:名称+下划线+从1开始的数字)* @param imageType   图片类型* @return*/public static Pair<Boolean, Object> pdfToImage(String source, String desFilePath, String desFileName, String imageType) {//通过给定的源路径名字符串创建一个File实例File file = new File(source);if (!file.exists()) {return Pair.of(false, "文件不存在,无法转化");}//目录不存在则创建目录File destination = new File(desFilePath);if (!destination.exists()) {boolean flag = destination.mkdirs();System.out.println("创建文件夹结果:" + flag);}PDDocument doc = null;try {//加载PDF文件doc = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(doc);//获取PDF文档的页数int pageCount = doc.getNumberOfPages();System.out.println("文档一共" + pageCount + "页");List<Object> fileList = new ArrayList<>();for (int i = 0; i < pageCount; i++) {//只有一页的时候文件名为传入的文件名,大于一页的文件名为:文件名_自增加数字(从1开始)String realFileName = pageCount > 1 ? desFileName + "_" + (i + 1) : desFileName;//每一页通过分辨率和颜色值进行转化BufferedImage bufferedImage = renderer.renderImageWithDPI(i, 96 * 2, ImageType.RGB);String filePath = desFilePath + File.separator + realFileName + "." + imageType;//写入文件ImageIO.write(bufferedImage, imageType, new File(filePath));//文件名存入listfileList.add(filePath);}return Pair.of(true, fileList);} catch (IOException e) {e.printStackTrace();return Pair.of(false, "PDF转化图片异常");} finally {try {if (doc != null) {doc.close();}} catch (IOException e) {System.out.println("关闭文档失败");e.printStackTrace();}}}
}

四、实践

4.1、单页PDF形式的发票转为图片

    /*** 单页PDF形式的发票转为图片* 此处单元测试的注解是采用:org.junit.Test*/@Testpublic void pdfInvoiceToImage() {String source = "C:\\myFile\\invoice\\加油发票.pdf";String desFileName = "invoice";String desFilePath = "C:\\myFile\\invoice";String imageType = "png";Pair<Boolean, Object> pair = PdfUtil.pdfToImage(source, desFilePath, desFileName, imageType);System.out.println("PDF形式的发票转化为图片结果:" + pair.getLeft());if (!pair.getLeft()) {System.out.println("" + pair.getRight());} else {List<String> fileList = (List<String>) pair.getRight();System.out.println("转化的文件的内容:");fileList.forEach(System.out::println);}}

运行结果:

文档一共1页
单页PDF形式的发票转化为图片结果:true
转化的文件的内容:
C:\myFile\invoice\invoice.png

在目标目录里PDF发票已经转成图片了,并且清晰度还可以,如果觉得不可以大家可以去调整工具类dpi的值。

在这里插入图片描述

4.2、多页PDF文档转为图片

    /*** 多页PDF文档转为图片* 此处单元测试的注解是采用:org.junit.Test*/@Testpublic void pdfDocumentToImage2() {String source = "C:\\myFile\\document\\阿里巴巴Java开发手册(终极版).pdf";String desFileName = "阿里巴巴Java开发手册";String desFilePath = "C:\\myFile\\document";String imageType = "png";Pair<Boolean, Object> pair = PdfUtil.pdfToImage(source, desFilePath, desFileName, imageType);System.out.println("PDF文档转化为图片结果:" + pair.getLeft());if (!pair.getLeft()) {System.out.println("" + pair.getRight());} else {List<String> fileList = (List<String>) pair.getRight();System.out.println("转化的文件的内容:");fileList.forEach(System.out::println);}}

运行结果:

文档一共39页
PDF文档转化为图片结果:true
转化的文件的内容:
C:\myFile\document\阿里巴巴Java开发手册_1.png
C:\myFile\document\阿里巴巴Java开发手册_2.png
C:\myFile\document\阿里巴巴Java开发手册_3.png
C:\myFile\document\阿里巴巴Java开发手册_4.png
C:\myFile\document\阿里巴巴Java开发手册_5.png
C:\myFile\document\阿里巴巴Java开发手册_6.png
C:\myFile\document\阿里巴巴Java开发手册_7.png
C:\myFile\document\阿里巴巴Java开发手册_8.png
C:\myFile\document\阿里巴巴Java开发手册_9.png
C:\myFile\document\阿里巴巴Java开发手册_10.png
C:\myFile\document\阿里巴巴Java开发手册_11.png
C:\myFile\document\阿里巴巴Java开发手册_12.png
C:\myFile\document\阿里巴巴Java开发手册_13.png
C:\myFile\document\阿里巴巴Java开发手册_14.png
C:\myFile\document\阿里巴巴Java开发手册_15.png
C:\myFile\document\阿里巴巴Java开发手册_16.png
C:\myFile\document\阿里巴巴Java开发手册_17.png
C:\myFile\document\阿里巴巴Java开发手册_18.png
C:\myFile\document\阿里巴巴Java开发手册_19.png
C:\myFile\document\阿里巴巴Java开发手册_20.png
C:\myFile\document\阿里巴巴Java开发手册_21.png
C:\myFile\document\阿里巴巴Java开发手册_22.png
C:\myFile\document\阿里巴巴Java开发手册_23.png
C:\myFile\document\阿里巴巴Java开发手册_24.png
C:\myFile\document\阿里巴巴Java开发手册_25.png
C:\myFile\document\阿里巴巴Java开发手册_26.png
C:\myFile\document\阿里巴巴Java开发手册_27.png
C:\myFile\document\阿里巴巴Java开发手册_28.png
C:\myFile\document\阿里巴巴Java开发手册_29.png
C:\myFile\document\阿里巴巴Java开发手册_30.png
C:\myFile\document\阿里巴巴Java开发手册_31.png
C:\myFile\document\阿里巴巴Java开发手册_32.png
C:\myFile\document\阿里巴巴Java开发手册_33.png
C:\myFile\document\阿里巴巴Java开发手册_34.png
C:\myFile\document\阿里巴巴Java开发手册_35.png
C:\myFile\document\阿里巴巴Java开发手册_36.png
C:\myFile\document\阿里巴巴Java开发手册_37.png
C:\myFile\document\阿里巴巴Java开发手册_38.png
C:\myFile\document\阿里巴巴Java开发手册_39.png

我们现在去目标目录查看文件是否已转化完成,从列表可以看到文档未丢失,并且清晰。

在这里插入图片描述
小伙伴们可以直接拷贝相关代码进行试验,赶紧行动起来吧。

结语

以上就是今天要讲的内容,本文简单介绍了使用pdfbox把pdf文件转换成图片,同时支持单页和多页PDF文件的转化,当然pdfbox是一个很强大的功能,我们这里只是用到最简单的处理,详细的使用还需要大家多多查看官方文档。如果有什么疑问,欢迎大家评论交流。如果觉得不错,可以帮忙一键三连,谢谢。


http://chatgpt.dhexx.cn/article/LId1LrgU.shtml

相关文章

怎么压缩PDF文件大小?分享几个压缩文件的方法

PDF格式文件它有着较高的兼容性&#xff0c;可以在不同软件和设备中打开&#xff0c;还不会影响到原文件的页面排版&#xff0c;很多人都喜欢使用它。如今大部分人都会在网上查找自己需要的资料并下载&#xff0c;例如电子书、PPT模板等&#xff0c;但它们基本都是PDF格式&…

(PDF统一页面大小)PDF统一缩放至A4或指定大小

需求 有时候混着用扫描仪和手机APP“扫描全能王”&#xff0c;导致拼接的PDF页面大小相差非常大。 这个时候就需要找到合适的工具&#xff0c;将PDF的页面统一缩放至A4或指定大小。 方案 Adobe Acrobat Pro DC软件&#xff1a;免费下载地址 1. 基本思路&#xff1a; 工具 …

统一PDF页面大小

问题描述&#xff1a; 使用图片制作的pdf页面大小不统一非常难看 软件&#xff1a;adobe acrobat pro dc 具体步骤&#xff1a; 0.确保制作pdf的图片的宽高比相同 1.印刷制作中 【设置页面框->页面大小->页面范围->确定】 2.打印 选择【adobe pdf】打印机打印到…

如何缩小pdf文件大小?

如何缩小pdf文件大小&#xff1f;pdf是一种比较稳定的文件格式&#xff0c;不易被编辑并且比较的正式&#xff0c;由于这些特性使得pdf文件成为越来越受欢迎的文件形式&#xff0c;不管在工作还是生活学习中使用的都比较广泛。同样的大家有没有发现&#xff0c;pdf文件的体积容…

pdf太大了怎么缩小?怎么能缩小pdf文件大小?

pdf太大了怎么缩小&#xff1f;pdf已经是网络上常用的文件格式了&#xff0c;尤其是日常办公当中&#xff0c;pdf使用次数非常多&#xff0c;但是有时候pdf文件的容量会比较大&#xff0c;上传到某些平台会有限制&#xff0c;那么p我们就需要压缩pdf文件&#xff0c;但是有时候…

java html转pdf文档并且设置文档的边距

阿尔法哲 一定要看到最后 ory 引用了https://www.cnblogs.com/aerfazhe/p/16170095.html 其他两个可自行研究哈 1、基于IText&#xff08;推荐&#xff09; iText 是业界使用最为广泛的创建 PDF 的框架&#xff0c;从 iText 5 升级到 iText 7 后&#xff0c;功能模块的划分更…

PDF页面太大要如何才能缩小?

你是否也遇到过打开一个PDF文档发现并不是常见的页面大小&#xff0c;整个页面特别大&#xff0c;就像被放大过一样&#xff0c;这样的PDF文档要如何处理成常用的页面大小呢&#xff1f; 首先我们需要判断一下PDF的页面过大是实际过大还是只是查看被缩放过大&#xff0c;可以用…

PDF怎么压缩指定大小

PDF是我们办公室常见的文件格式&#xff0c;因为其本身私密性比较高&#xff0c;而且可以保护文件&#xff0c;故编辑难度大。由于PDF文件比较好的私密性和兼容能力好&#xff0c;很多格式的文件都可以转为PDF&#xff0c;慢慢的PDF文件多了&#xff0c;内容也大了&#xff0c;…

Java更改 PDF 页面大小

在日常工作中&#xff0c;我们可能经常面临更改 PDF 页面大小的情况。 例如&#xff0c;一个包含不同大小页面的合并 PDF 文件&#xff0c;我们需要将页面大小调整为相同大小以便于阅读和打印。 在本文中&#xff0c;将详细为您介绍在 Java 应用程序中更改 PDF 文件的页面大小&…

Hibernate QBC查询知识点总结

Hibernate &#xff1a;QBC查询基本步骤与常规运算符 QBC查询的基本步骤 这种方式比较面向对象方式&#xff0c;重点是有三个描述条件的对象&#xff1a;Restrictions,Order,Projections。 使用QBC查询&#xff0c;一般需要以下三个步骤&#xff1a; 1&#xff1a;使用Sessio…

Hibernate-6.QBC

QBC:Query By Criteria 条件查询&#xff0c;即面向对象的查询方式6.1查询所有 6.2分页 6.3排序 6.4条件查询 6.5多条件查询 6.6模糊查询 6.7 In 6.8 And 6.9 OR 6.10聚合函数 6.11 Max 6.12 内连接 6.13 左连接 6.14 离线查询 …

Qt 编译方式之 qbs

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 QBS简介 QBS&#xff08;Qt Build Suite&#xff09;同 qmake、cmake 之类一样都是构建工具。QBS 号称是下一代的构建工具(博主的理解上…

QBC查询及语法

QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活&#xff0c;而且支持运行时动态生成查询语句。 在Hibernate应用中使用QBC查询通常经过3个步骤 (1)使用Session实例的createCriteria()方法创建Criteria对…

Hibernate 之QBC

一、Hibernate 中聚合函数的使用 Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能: List cats session.createCriteria(Cat. class ) .setProjection(Projections.projectionList() .add(Projections.rowCount…

Qt6 中如何使用 qsb

【写在前面】 Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出&#xff0c;市场发生了巨大变化。现在&#xff0c;Qt 6 加入了大量不同平台的图形 API&#xff0c;以确保用户可以在所有平台上以最高性能运行 Qt。 在 Qt Q…

MyBatis十:逆向工程(QBC风格)

逆向工程 一、创建逆向工程 创建依赖pom.xml <packaging>jar</packaging><!-- 依赖MyBatis核心包 --> <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5…

QBC 查询

当使用 hibernate 的 QBC 进行查询的时候&#xff0c;无需写 sql 语句&#xff0c;使用的是 Criteria 对象中的方法进行的实现&#xff0c;创建 Criteria 对象的时候&#xff0c;需要传入一个实体类.class&#xff0c;会自动关联该实体类对应的数据库表。 一&#xff1a;查询所…

Hibernate--QBC举例+详解(一)

QBC检索 QBC&#xff08;Query By Criteria&#xff09;是Hibernate提供的另一种检索对象的方式&#xff0c;它主要由Criteria接口、Criterion接口和Expression类组成。 Criteria接口是Hibernate API中的一个查询接口&#xff0c;它需要由session进行创建。一个单独的查询就是…

统一软件开发过程(RUP)的概念和方法

统一软件开发过程&#xff08;Rational Unified Process,RUP)是一种面向对象且基于网络的程序开发方法论。 根据Rational(Rational Rose和统一建模语言的开发者)的说法&#xff0c;好像一个在线的指导者&#xff0c;它可以为所有方面和层次的程序开发提供指导方针&#xff0c;…

程序员技术开发委托合同模板 私活模板

---需要电子word版&#xff0c;请关注--------- 回复&#xff1a;私活 含税与不含税计算工具&#xff1a; 假设税率是6% 不含税金额&#xff1d;总金额/1.06 税额&#xff1d;不含税金额0.06 增值税在线计算器&#xff1a;http://www.ab126.com/goju/7332.html 大小写转换&…