Java实现PDF文件转换为图片

tech2022-08-18  132

文章目录

引入依赖前端页面控制层接口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> <!--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>

前端页面

<!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; /** * @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工具类

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); } } } } }

页面效果

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

最新回复(0)