引入依赖
<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><!--将pdf文件转换为图片的依赖--><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>
控制层接口
/*** @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工具类
/*** @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);}}}}}