java 读取PDF文件生成图片形式

浅浅的花香味﹌ 2023-01-02 02:29 284阅读 0赞

引入所需maven依赖

  1. <!-- PDF转图片 -->
  2. <dependency>
  3. <groupId>org.icepdf.os</groupId>
  4. <artifactId>icepdf-core</artifactId>
  5. <version>6.2.2</version>
  6. <exclusions>
  7. <exclusion>
  8. <groupId>javax.media</groupId>
  9. <artifactId>jai_core</artifactId>
  10. </exclusion>
  11. </exclusions>
  12. </dependency>

JAVA代码工具类

  1. package com.util;
  2. import com.lowagie.text.pdf.PdfReader;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.icepdf.core.pobjects.Document;
  5. import org.icepdf.core.pobjects.Page;
  6. import org.icepdf.core.util.GraphicsRenderingHints;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import javax.imageio.ImageIO;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.awt.image.BufferedImage;
  11. import java.io.BufferedInputStream;
  12. import java.io.File;
  13. import java.io.FileInputStream;
  14. import java.io.FileOutputStream;
  15. import java.io.IOException;
  16. import java.io.OutputStream;
  17. import java.net.URLEncoder;
  18. import java.util.ArrayList;
  19. import java.util.Arrays;
  20. import java.util.List;
  21. import java.util.zip.ZipEntry;
  22. import java.util.zip.ZipOutputStream;
  23. //java 项目 www.fhadmin.org
  24. @Slf4j
  25. public class PdfToImageUtil {
  26. //支持文件格式
  27. public static final String SUPPORT_FILE = "pdf";
  28. //图片文件格式
  29. public static final String IMAGE_SUFFIX = "jpg"; //png
  30. //压缩文件格式
  31. public static final String ZIP_SUFFIX = "zip";
  32. //PDF是否为一页
  33. private static boolean isImage;
  34. /**
  35. * 对外的开放接口,用于将PDF文件转换为图片文件压缩包进行下载
  36. * @param file SpringMVC获取的图片文件
  37. */
  38. public static synchronized void pdfToTransformation(MultipartFile file, HttpServletResponse response) throws Exception {
  39. String fileName = file.getOriginalFilename();
  40. if(null == fileName) return;
  41. String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
  42. log.info("文件名称:" + fileName + ",文件后缀:" + suffix);
  43. if(!SUPPORT_FILE.equals(suffix)) return;
  44. isImage = false;
  45. File imageFile = generateFile(file);
  46. log.info("文件生成成功!");
  47. downloadFile(imageFile, response);
  48. }
  49. /**
  50. * 将PDF文件转换为多张图片并放入一个压缩包中
  51. * @param file SpringMVC获取的图片文件
  52. * @return 图片文件压缩包
  53. * @throws Exception 抛出异常
  54. */
  55. private static File generateFile(MultipartFile file) throws Exception {
  56. String fileName = file.getOriginalFilename();
  57. if(null == fileName) return null;
  58. Document document = new Document();
  59. document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);
  60. log.info("PDF页数:" + document.getNumberOfPages());
  61. isImage = 1 == document.getNumberOfPages();
  62. File imageReturnFile = null;
  63. List<File> fileList = new ArrayList<>();
  64. for (int i = 0; i < document.getNumberOfPages(); i++) {
  65. BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN,
  66. Page.BOUNDARY_CROPBOX, 0F, 2.5F);
  67. File imageFile = new File((i + 1) + "." + IMAGE_SUFFIX);
  68. ImageIO.write(image, IMAGE_SUFFIX, imageFile);
  69. image.flush();
  70. if(isImage){
  71. imageReturnFile = imageFile;
  72. break;
  73. }
  74. fileList.add(imageFile);
  75. }
  76. document.dispose();
  77. if(isImage) return imageReturnFile;
  78. //压缩图片文件
  79. String directoryName = fileName.substring(0, fileName.lastIndexOf("."));
  80. File zipFile = new File(directoryName + "." + ZIP_SUFFIX);
  81. ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
  82. zipFile(fileList, zipOutputStream);
  83. zipOutputStream.close();
  84. return zipFile;
  85. }
  86. /**
  87. * 下载image/zip文件
  88. * @param downloadFile 文件
  89. * @param response HttpServletResponse
  90. * @throws IOException IO异常
  91. */
  92. private static void downloadFile(File downloadFile, HttpServletResponse response) throws IOException {
  93. FileInputStream fileInputStream = new FileInputStream(downloadFile);
  94. byte[] bytes = new byte[fileInputStream.available()];
  95. fileInputStream.read(bytes);
  96. fileInputStream.close();
  97. //设置response参数
  98. response.reset();
  99. if(isImage){
  100. response.setContentType("image/jpeg");
  101. } else {
  102. response.setContentType("application/zip");
  103. }
  104. response.setCharacterEncoding("UTF-8");
  105. response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downloadFile.getName(), "UTF-8"));
  106. OutputStream outputStream = response.getOutputStream();
  107. outputStream.write(bytes);
  108. outputStream.flush();
  109. outputStream.close();
  110. if(!isImage) downloadFile.delete();
  111. }
  112. /**
  113. * 压缩文件
  114. * @param inputFiles 具体需要压缩的文件集合
  115. * @param zipOutputStream ZipOutputStream对象
  116. * @throws IOException IO异常
  117. */
  118. private static void zipFile(List<File> inputFiles, ZipOutputStream zipOutputStream) throws IOException {
  119. byte[] buffer = new byte[1024];
  120. for (File file : inputFiles) {
  121. if (file.exists()) {
  122. if (file.isFile()) {
  123. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  124. zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
  125. int size = 0;
  126. while ((size = bis.read(buffer)) > 0) {
  127. zipOutputStream.write(buffer, 0, size);
  128. }
  129. zipOutputStream.closeEntry();
  130. bis.close();
  131. file.delete();
  132. } else {
  133. File[] files = file.listFiles();
  134. if(null == files) continue;
  135. List<File> childrenFileList = Arrays.asList(files);
  136. zipFile(childrenFileList, zipOutputStream);
  137. }
  138. }
  139. }
  140. }
  141. /**
  142. * 获取PDF页数
  143. * @throws IOException
  144. */
  145. public static String getPdfPageSize(MultipartFile file) throws IOException {
  146. PdfReader pdfReader = new PdfReader(file.getBytes());
  147. int pages = pdfReader.getNumberOfPages();
  148. return String.valueOf(pages);
  149. }
  150. }

生成图片PdfController.java

  1. package com.web.transformation.controller;
  2. import com.util.PdfToImageUtil;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. //java项目 www.fhadmin.org
  10. @Controller
  11. public class PdfController {
  12. //PDF转图片或者ZIP
  13. @RequestMapping("/pdfToImage")
  14. @ResponseBody
  15. public void pdfToImage(MultipartFile file, HttpServletResponse response) throws Exception{
  16. PdfToImageUtil.pdfToTransformation(file,response);
  17. }
  18. //获取PDF页数
  19. @RequestMapping("/getPdfPageSize")
  20. @ResponseBody
  21. public String pdfToImage(MultipartFile file) throws IOException {
  22. return PdfToImageUtil.getPdfPageSize(file);
  23. }
  24. }

![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]

[wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]:

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读