Java SpringBoot 图片转PDF示例

news/2025/1/8 3:12:15/文章来源:https://www.cnblogs.com/anyuan/p/18655465

一个SpringBoot工程里面用到了第三方签章服务,支持PDF多页盖章,用户上传的是多张图片格式的文件,所以需要将图片转成PDF。

用了几个扩展包,出现过版本不兼容、转完的PDF带水印、还有操作复杂的。 最后借助 aspose-pdf 这个扩展包实现了,这里记录一下简单的 Demo。

pom.xml 文件引入 aspose-pdf 依赖

<dependencies>...<dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-pdf</artifactId><version>23.1</version></dependency>...</dependencies>

创建一个 FileUtils 工具类文件 FileUtils.java

package com.cnblog.imgtopdf.util;import com.aspose.pdf.Document;
import com.aspose.pdf.Image;
import com.aspose.pdf.Page;
import com.aspose.pdf.Rectangle;
import lombok.extern.slf4j.Slf4j;import java.io.*;
import java.net.URL;@Slf4j
public class FileUtils {/*** 根据文件路径获取文件* @param filePath 文件路径* @return File*/public static File getFileByPath(String filePath) {log.info("------------开始获取图片文件------------");// 拆分路径,获取文件后缀名String[] split = filePath.substring(filePath.lastIndexOf("/") + 1).split("\\.");File file = null;URL url;InputStream inStream = null;OutputStream os = null;try {// 创建临时文件,使用路径名称和路径后缀名file = File.createTempFile(split[0], "." + split[1]);url = new URL(filePath);inStream = url.openStream();os = new FileOutputStream(file);int bytesRead;int byteSize = 1024 * 528;byte[] buffer = new byte[byteSize];// 写入文件while ((bytesRead = inStream.read(buffer, 0, byteSize)) != -1) {os.write(buffer, 0, bytesRead);}log.info("------------获取图片文件完成------------");} catch (Exception e) {e.printStackTrace();} finally {try {if (null != os) {os.close();}if (null != inStream) {inStream.close();}} catch (Exception e) {e.printStackTrace();}}return file;}/*** 图片转PDF* @param file 图片文件* @return File PDF文件*/public static File imgToPdfFile(File file) {log.info("------------开始执行图片转PDF------------");// 获取classpath,还可使用临时文件夹String pdfPath = ClassLoader.getSystemResource("").getPath();String pdfName = "demo.pdf";try {String pdfFilePath = pdfPath + pdfName;// 创建一个新文档Document doc  = new Document();// 将页面添加到文档的页面集合Page page = doc.getPages().add();// 将图像加载到流中java.io.FileInputStream imageStream = new java.io.FileInputStream(file.getPath());// 设置边距,以便图像适合等。page.getPageInfo().getMargin().setBottom(0);page.getPageInfo().getMargin().setTop(200);page.getPageInfo().getMargin().setLeft(200);page.getPageInfo().getMargin().setRight(0);page.setCropBox(new Rectangle(0, 0, 595, 842));// 创建图像对象Image image1 = new Image();// 将图像添加到该部分的段落集合中page.getParagraphs().add(image1);// 设置图片文件流image1.setImageStream(imageStream);// 保存生成的 PDF 文件doc.save(pdfFilePath);//输出流File mOutputPdfFile = new File(pdfFilePath);// 判断临时文件否存在,如果存在可选择删除if (!mOutputPdfFile.exists()) {mOutputPdfFile.deleteOnExit();return null;}doc.close();log.info("------------图片转PDF执行完成------------");return mOutputPdfFile;} catch (IOException e) {log.error("图片转PDF失败:file:{}, error:{}", file.getPath(), e.getMessage());}return null;}
}

最后写一个测试类 ImgToPdfTest ,用这个博客的头像试试效果:

package com.cnblog.imgtopdf.impl;import com.cnblog.imgtopdf.util.FileUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.File;@Slf4j
@SpringBootTest
class ImgToPdfTest {@Testpublic void imgToPdf(){String imgPath = "https://pic.cnblogs.com/avatar/2319511/20210331180835.png";File file = FileUtils.getFileByPath(imgPath);FileUtils.imgToPdfFile(file);}
}

执行结果及文件位置:

预览转换完成的PDF文件:

还可以根据需求设置不一样的转换参数,包括间距,画布大小等。

本篇代码Github:https://github.com/Journeyerr/cnblogs/tree/master/imgToPdf

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864978.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LDAPS 636端口无法连接 报服务器不在工作

LDAPS 636端口无法连接 报服务器不在工作的解决办法 AD与第三方系统集成,需要用到389和636两个端口,389是普通连接,636是SSL,二者所能做的操作不同。如果两个端口都已放通,能telnet通,正常是可以直接用389连接的,但连上后只能看都一些基本的属性信息,OU及人员信息无法…

给 Postgres 写一个向量插件 - 向量类型

在这篇文章中,我们将为 Postgres 实现 vector 类型: CREATE TABLE items (v vector(3));Postgres 扩展结构和 pgrx 包装器 在实现它之前,让我们先看看典型的扩展结构,以及 pgrx 如何为我们简化它。 典型的 Postgres 扩展可以大致分为 2 层:实现,通常使用 C 等低级语言完成…

罗永浩 AI 智能助理 J1 Assistant 上线;字节开源 LatentSync ,精准控制唇形同步丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

学习jsp-使用IDEA2024社区版

安装tomcat 先要知道自己有的jdk对应可以运行的tomcat版本 https://tomcat.apache.org/whichversion.htmlServlet SpecJSP SpecEL SpecWebSocket SpecAuthentication Spec (JASPIC)Apache Tomcat VersionLatest Released VersionSupported Java Versions6.1 4.0 6.0 2.2 3.1 11…

学习 - Nginx - 浅谈反向代理正向代理

一张图搞懂反向代理&正向代理反向代理 客户端发送请求 连接到互联网以后,不能直接访问到业务服务器(如Tomcat集群),需要通过Nginx反向代理才能访问,同理Tomcat返回报文数据的时候也不能直接返回给客户端,也需要通过Nginx才可以 正向代理 用户通过代理服务器(网关)访…

2025年简单好用的电脑桌面便签记事本软件

在新的一年,很多打工人希望自己可以更加高效工作,把每件事管理的井井有条,实现升职加薪。 每天使用电脑办公,想要随手记录工作事项、零散琐事,用一款电脑桌面便签或记事本软件是非常方便的。 今天为大家推荐一款2025年简单又好用的电脑桌面便签记事本软件:敬业签! ~ 桌面…

基础知识-虚拟化(Virtualization)技术

(250106) 参考资料 KVM 虚拟化技术 | cnblogs | 惨绿少年@clsn.io 虚拟化介绍 | cnblogs | 休耕 云计算与虚拟化技术发展编年史 | cnblogs | 云物互联 nova系列二:kvm介绍 | cnblogs | linhaifeng 虚拟化与容器 | cnblogs | marility 《LPIC-3-Virtualization-and-Containe…

【k8s基础】k8s 基本使用

介绍及教程大全 Kubernetes中文文档 结构模型 k8s 是经典的一对多模型,有一个主要的管理节点master和许多的工作节点slaver。当然,k8s 也可以配置多个管理节点,拥有两个以上的管理节点被称为 高可用。k8s 包括了许多的组件,每个组件都是单运行在一个docker容器中,然后通过…

Scss 入门

Scss 是对 CSS 的扩展,提供了比 CSS 更简洁的语法和更强大的功能。不过,在部署时,我们要先把 Scss 编译成 CSS,才能让浏览器识别。编译 Scss 的方法有很多,这里我们使用 VS Code 的插件 Live Sass Compiler 进行自动编译。 基本准备配置保存目录。在 VS Code 配置文件中添…

Seed Lab实验:RSAPublic-Key Encryption and Signature Lab

Seed Lab实验:RSAPublic-Key Encryption and Signature Lab笔记RSAPublic-Key Encryption and Signature Lab 1.推导RSA私钥 import gmpy2p = 0xF7E75FDC469067FFDC4E847C51F452DF q = 0xE85CED54AF57E53E092113E62F436F4F e = 0x0D88C3n = q * p phi = (p - 1) * (q - 1) d =…

双稳态触发器

双稳态触发器双稳态触发器是一种具有记忆功能的逻辑单元电路,它能储存一位二进制码。 特点有两个稳定状态“0”态和“1”态; 能根据输入信号将触发器置成“0”或“1”态; 输入信号消失后,被置成的“0”或“1”态能保存下来,即具有记忆功能。RS触发器 基本RS触发器 输入低电…

在Lazarus下的Free Pascal编程教程——以数据处置推动程序运行的模块化程序设计方法

0.前言 我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。 了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和…