文章目录
引入依赖前端页面控制层接口Image工具类页面效果
前几天写了一篇博客Java实现图片转换PDF文件,在博客下方有同学评论是否能够将PDF文件转换为图片,所以今天就在这里写了一个将PDF文件转换为图片的简单系统。
引入依赖
<parent>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-parent
</artifactId>
<version>2.0.4.RELEASE
</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot
</groupId>
<artifactId>spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>org.icepdf.os
</groupId>
<artifactId>icepdf-core
</artifactId>
<version>6.2.2
</version>
</dependency>
</dependencies>
前端页面
<!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>
控制层接口
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
;
@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工具类
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
;
@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";
public static void pdfToImage(MultipartFile file
, HttpServletResponse response
) throws Exception
{
File zipFile
= generateImageFile(file
);
downloadZipFile(zipFile
, response
);
}
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
;
}
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();
}
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
);
}
}
}
}
}
页面效果
作者简单测试了一下,该系统是可以顺利运行的,而且作者将后台生成的图片文件和压缩文件都进行了删除,这样就不会对后台系统产生不必要的资源浪费,节约了磁盘空间。