每一秒钟的时间都值得铭记

0%

Java实现PDF文件转换为图片

前几天写了一篇博客Java实现图片转换PDF文件,在博客下方有同学评论是否能够将PDF文件转换为图片,所以今天就在这里写了一个将PDF文件转换为图片的简单系统。

引入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>

<dependencies>
<!--SpringMVC的依赖,方便我们可以获取前端传递过来的文件信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--icepdf,用来将pdf文件转换为图片的依赖-->
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>6.2.2</version>
</dependency>
</dependencies>

前端页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>PDf转换图片</title>
<style>
.submitButton {
margin-top: 20px;
margin-left: 150px;
background-color: #e37e10;
border-radius: 10px;
border: 1px solid #ff8300;
}
</style>
</head>
<body>
<div style="text-align: center">
<h1>PDF转换图片工具</h1>
<form action="/pdf/to/image" enctype="multipart/form-data" method="post" onsubmit="return allowFileType()">
<input type="file" id="file" name="file" placeholder="请选择PDF文件" onchange="allowFileType()" style="border: 1px solid black;"><br>
<input type="submit" value="一键转换图片" class="submitButton">
</form>
</div>
</body>
<script>
function allowFileType() {
let file = document.getElementById("file").files[0];
let fileName = file.name;
let suffix = fileName.substring(fileName.lastIndexOf("."),fileName.length).toLowerCase();
if('.pdf' != suffix) {
alert("只允许传入PDF格式的文件!");
return false;
}
return true;
}
</script>
</html>

控制层接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.hrp.controller;

import com.hrp.util.ImageUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

/**
* @description: 用于处理Pdf相关的请求
*/
@Controller
@RequestMapping("pdf")
public class PdfController {

@PostMapping("to/image")
public void pdfToImage(@RequestParam("file") MultipartFile file,HttpServletResponse response) throws Exception{
ImageUtils.pdfToImage(file,response);
}

}

Image工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.hrp.util;

import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
* @description: PDF转换为图片的工具类
*/
@Component
public class ImageUtils {

/**
* 图片文件格式
*/
public static final String FORMAT_NAME = "png";
/**
* 图片文件后缀名
*/
public static final String PNG_SUFFIX = ".png";
/**
* 压缩文件后缀名
*/
public static final String ZIP_SUFFIX = ".zip";

/**
* 对外的开放接口,用于将PDF文件转换为图片文件压缩包进行下载
*
* @param file SpringMVC获取的图片文件
* @param response
* @throws Exception
*/
public static void pdfToImage(MultipartFile file, HttpServletResponse response) throws Exception {
File zipFile = generateImageFile(file);
downloadZipFile(zipFile, response);
}


/**
* 将PDF文件转换为多张图片并放入一个压缩包中
*
* @param file SpringMVC获取的图片文件
* @return 图片文件压缩包
* @throws Exception 抛出异常
*/
private static File generateImageFile(MultipartFile file) throws Exception {
String fileName = file.getOriginalFilename();
Document document = new Document();
document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);

List<File> fileList = new ArrayList<>();
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
Page.BOUNDARY_CROPBOX, 0F, 2.5F);
File imageFile = new File((i + 1) + PNG_SUFFIX);
ImageIO.write(image, FORMAT_NAME, imageFile);
image.flush();
fileList.add(imageFile);
}
document.dispose();

String directoryName = fileName.substring(0, fileName.lastIndexOf("."));
File zipFile = new File(directoryName + ZIP_SUFFIX);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
zipFile(fileList, zos);
zos.close();
return zipFile;
}

/**
* 下载zip文件
*
* @param zipFile zip压缩文件
* @param response HttpServletResponse
* @throws IOException IO异常
*/
private static void downloadZipFile(File zipFile, HttpServletResponse response) throws IOException {
FileInputStream fis = new FileInputStream(zipFile);
byte[] bytes = new byte[fis.available()];
fis.read(bytes);
fis.close();

response.reset();
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8"));
OutputStream out = response.getOutputStream();
out.write(bytes);
out.flush();
out.close();
zipFile.delete();
}

/**
* 压缩文件
*
* @param inputFiles 具体需要压缩的文件集合
* @param zos ZipOutputStream对象
* @throws IOException IO异常
*/
private static void zipFile(List<File> inputFiles, ZipOutputStream zos) throws IOException {
byte[] buffer = new byte[1024];
for (File file : inputFiles) {
if (file.exists()) {
if (file.isFile()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
zos.putNextEntry(new ZipEntry(file.getName()));
int size = 0;
while ((size = bis.read(buffer)) > 0) {
zos.write(buffer, 0, size);
}
zos.closeEntry();
bis.close();
file.delete();
} else {
File[] files = file.listFiles();
List<File> childrenFileList = Arrays.asList(files);
zipFile(childrenFileList, zos);
}
}
}
}

}

页面效果

在这里插入图片描述

作者简单测试了一下,该系统是可以顺利运行的,而且作者将后台生成的图片文件和压缩文件都进行了删除,这样就不会对后台系统产生不必要的资源浪费,节约了磁盘空间。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------这是我的底线^_^-------------