Java实现PDF文件转换为图片

2022-08-01 11:27:38

一、实现功能及开发环境描述

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

限于作者水平,如有错误,欢迎批评指正

  • 作者:洋酒杯
  • 原文链接:https://blog.csdn.net/weixin_43760266/article/details/122633778
    更新时间:2022-08-01 11:27:38