一、实现功能及开发环境描述
1、实现功能
上传PDF文件后,将每页的PDF页面转换为指定格式的图片文件,并将 PDF文件及图片保存到指定的本地磁盘路径。
2、开发环境
此处描述的开发环境并非都为必要条件,仅作为参考,方便其他开发人员排查因版本不同出现的问题。
Windows10-64位
JDK-1.8
Maven-3.3.9
数据库:Oracle Database 19c
二、代码实现
1、引入pom依赖
pom.xml
<!--icepdf,用来将pdf文件转换为图片的依赖-->
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>6.2.2</version>
</dependency>
2、前端页面
pdf2pic.html
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<form class="form-horizontal m-t" id="signupForm" enctype="multipart/form-data">
<div class="form-group">
<div class="col-sm-4" nowrap >
<input name="picture" id="picture" type="file" placeholder="请选择PDF文件" onchange="allowFileType()" />
</div>
<div class="col-sm-4 col-sm-offset-3">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</div>
</form>
</body>
<script type="text/javascript" src="/pdf2pic.js"></script>
</html>
pdf2pic.js
$.validator.setDefaults({
//拦截表单验证成功后的提交表单事件,执行完函数中的代码在提交表单
submitHandler : function() {
save();
}
});
function save() {
/**
* 使用FormData表单提交解决serialize不能提交表单中file类型的数据
*/
$.ajax({
type : "POST",
url : "/save",
data :new FormData(document.getElementById('signupForm')),
// data :new FormData($('#picture')),
processData: false,
contentType: false,
async: false,
cache: false, //上传文件不需要缓存
error : function(request) {
parent.layer.alert("Connection error");
},
success : function(data) {
if (data.code == 0) {
parent.layer.msg("操作成功");
parent.reLoad();
var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引
parent.layer.close(index);
} else {
parent.layer.alert(data.msg)
}
}
});
}
3、控制层接口
pdf2picController.java
@Log("将pdf转为图片并保存pdf和图片")
@ResponseBody
@PostMapping("/save")
public void save(@RequestParam("picture") MultipartFile pdf) throws Exception {
ImageUtils.pdfToImage(pdf);
}
4、PDF工具类
PDFUtils
/**
* @description: PDF转换为图片的工具类
*/
@Component
public class ImageUtils {
//图片文件格式
public static final String FORMAT_NAME = "png";
//图片文件后缀名
public static final String PNG_SUFFIX = ".png";
//用于将PDF文件转换为图片文件并保存到本地
public static void pdfToImage(MultipartFile file) throws Exception {
//1、pdf文件保存到本地
String fileName = pdf.getOriginalFilename();
fileName = FileUtil.renameToUUID(fileName);
FileUtil.uploadFile(pdf.getBytes(), simpleDemoConfig.getUploadPath(), fileName);
//2、将图片文件保存到本地
Document document = new Document();
document.setByteArray(pdf.getBytes(), 0, pdf.getBytes().length, fileName);
for (int i = 0; i < document.getNumberOfPages(); i++) {
//将磁盘中的图片读取到内存的图像缓冲区中
BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
Page.BOUNDARY_CROPBOX, 0F, 2.5F);
//创建一个后缀名为.png的File对象用于保存图片文件
File imageFile = new File( UUID.randomUUID() + "-" + (i + 1) + PNG_SUFFIX);
//将内存中的图片写入File对象
ImageIO.write(image,FORMAT_NAME , imageFile);
image.flush();
//将File类型转为MultipartFile类型,用于将图片保存到本地文件夹
InputStream inputStream = new FileInputStream(imageFile);
MultipartFile imgMultipartFile = new MockMultipartFile(imageFile.getName(), inputStream);
//将图片保存到本地
String imageName = imgMultipartFile.getName();
FileOutputStream out = new FileOutputStream(simpleDemoConfig.getUploadPath() + imageName);
out.write(imgMultipartFile.getBytes());
out.flush();
out.close();
}
document.dispose();
}
}
/*simpleDemoConfig.getUploadPath()路径说明
(此处也可直接写入String类型指定路径,以下注释则可忽略)
simpleDemoConfig为配置类SimpleDemoConfig的实例
@Component
@ConfigurationProperties(prefix="config")
public class SimpleDemoConfig {
private String uploadPath;
public String getUploadPath() {return uploadPath;}
}
实际路径写在application.yml配置文件中
config:
uploadPath: E:/var/uploaded_files/
*/
参考资料:
Java实现PDF文件转换为图片(将图片进行压缩下载)
将File转换成MultipartFile
限于作者水平,如有错误,欢迎批评指正