一、实现功能及开发环境描述
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
<!DOCTYPEhtml><html><metacharset="utf-8"><headth:include="include :: header"></head><bodyclass="gray-bg"><formclass="form-horizontal m-t"id="signupForm"enctype="multipart/form-data"><divclass="form-group"><divclass="col-sm-4"nowrap><inputname="picture"id="picture"type="file"placeholder="请选择PDF文件"onchange="allowFileType()"/></div><divclass="col-sm-4 col-sm-offset-3"><buttontype="submit"class="btn btn-primary">提交</button></div></div></form></body><scripttype="text/javascript"src="/pdf2pic.js"></script></html>
pdf2pic.js
$.validator.setDefaults({//拦截表单验证成功后的提交表单事件,执行完函数中的代码在提交表单submitHandler:function(){save();}});functionsave(){/**
* 使用FormData表单提交解决serialize不能提交表单中file类型的数据
*/
$.ajax({
type:"POST",
url:"/save",
data:newFormData(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")publicvoidsave(@RequestParam("picture")MultipartFile pdf)throwsException{ImageUtils.pdfToImage(pdf);}
4、PDF工具类
PDFUtils
/**
* @description: PDF转换为图片的工具类
*/@ComponentpublicclassImageUtils{//图片文件格式publicstaticfinalString FORMAT_NAME="png";//图片文件后缀名publicstaticfinalString PNG_SUFFIX=".png";//用于将PDF文件转换为图片文件并保存到本地publicstaticvoidpdfToImage(MultipartFile file)throwsException{//1、pdf文件保存到本地String fileName= pdf.getOriginalFilename();
fileName=FileUtil.renameToUUID(fileName);FileUtil.uploadFile(pdf.getBytes(), simpleDemoConfig.getUploadPath(), fileName);//2、将图片文件保存到本地Document document=newDocument();
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=newFile( UUID.randomUUID()+"-"+(i+1)+ PNG_SUFFIX);//将内存中的图片写入File对象ImageIO.write(image,FORMAT_NAME, imageFile);
image.flush();//将File类型转为MultipartFile类型,用于将图片保存到本地文件夹InputStream inputStream=newFileInputStream(imageFile);MultipartFile imgMultipartFile=newMockMultipartFile(imageFile.getName(), inputStream);//将图片保存到本地String imageName= imgMultipartFile.getName();FileOutputStream out=newFileOutputStream(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
限于作者水平,如有错误,欢迎批评指正