JAVA根据PDF文件生成图片
程序员文章站
2022-06-19 15:26:35
PDF文件生成图片实现功能根据上传的PDF文件,生成图片文件,单页PDF,生成图片文件.多页PDF,则生成zip压缩包.一 : 文件生成效果二 : 引入所需maven依赖项目采用springboot框架 org.icepdf.os icepdf-core
PDF文件生成图片
实现功能
根据上传的PDF文件,生成图片文件,
单页PDF,生成图片文件.
多页PDF,则生成zip压缩包.
一 : 文件生成效果
二 : 引入所需maven依赖
项目采用springboot框架
<!-- PDF转图片 -->
<dependency>
<groupId>org.icepdf.os</groupId>
<artifactId>icepdf-core</artifactId>
<version>6.2.2</version>
<exclusions>
<exclusion>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
</exclusion>
</exclusions>
</dependency>
三 : JAVA代码工具类
生成图片工具类 PdfToImageUtil.java
package com.util;
import com.lowagie.text.pdf.PdfReader;
import lombok.extern.slf4j.Slf4j;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
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;
@Slf4j
public class PdfToImageUtil {
//支持文件格式
public static final String SUPPORT_FILE = "pdf";
//图片文件格式
public static final String IMAGE_SUFFIX = "jpg"; //png
//压缩文件格式
public static final String ZIP_SUFFIX = "zip";
//PDF是否为一页
private static boolean isImage;
/**
* 对外的开放接口,用于将PDF文件转换为图片文件压缩包进行下载
* @param file SpringMVC获取的图片文件
*/
public static synchronized void pdfToTransformation(MultipartFile file, HttpServletResponse response) throws Exception {
String fileName = file.getOriginalFilename();
if(null == fileName) return;
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
log.info("文件名称:" + fileName + ",文件后缀:" + suffix);
if(!SUPPORT_FILE.equals(suffix)) return;
isImage = false;
File imageFile = generateFile(file);
log.info("文件生成成功!");
downloadFile(imageFile, response);
}
/**
* 将PDF文件转换为多张图片并放入一个压缩包中
* @param file SpringMVC获取的图片文件
* @return 图片文件压缩包
* @throws Exception 抛出异常
*/
private static File generateFile(MultipartFile file) throws Exception {
String fileName = file.getOriginalFilename();
if(null == fileName) return null;
Document document = new Document();
document.setByteArray(file.getBytes(), 0, file.getBytes().length, fileName);
log.info("PDF页数:" + document.getNumberOfPages());
isImage = 1 == document.getNumberOfPages();
File imageReturnFile = null;
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) + "." + IMAGE_SUFFIX);
ImageIO.write(image, IMAGE_SUFFIX, imageFile);
image.flush();
if(isImage){
imageReturnFile = imageFile;
break;
}
fileList.add(imageFile);
}
document.dispose();
if(isImage) return imageReturnFile;
//压缩图片文件
String directoryName = fileName.substring(0, fileName.lastIndexOf("."));
File zipFile = new File(directoryName + "." + ZIP_SUFFIX);
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipFile));
zipFile(fileList, zipOutputStream);
zipOutputStream.close();
return zipFile;
}
/**
* 下载image/zip文件
* @param downloadFile 文件
* @param response HttpServletResponse
* @throws IOException IO异常
*/
private static void downloadFile(File downloadFile, HttpServletResponse response) throws IOException {
FileInputStream fileInputStream = new FileInputStream(downloadFile);
byte[] bytes = new byte[fileInputStream.available()];
fileInputStream.read(bytes);
fileInputStream.close();
//设置response参数
response.reset();
if(isImage){
response.setContentType("image/jpeg");
} else {
response.setContentType("application/zip");
}
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(downloadFile.getName(), "UTF-8"));
OutputStream outputStream = response.getOutputStream();
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
if(!isImage) downloadFile.delete();
}
/**
* 压缩文件
* @param inputFiles 具体需要压缩的文件集合
* @param zipOutputStream ZipOutputStream对象
* @throws IOException IO异常
*/
private static void zipFile(List<File> inputFiles, ZipOutputStream zipOutputStream) throws IOException {
byte[] buffer = new byte[1024];
for (File file : inputFiles) {
if (file.exists()) {
if (file.isFile()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
int size = 0;
while ((size = bis.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, size);
}
zipOutputStream.closeEntry();
bis.close();
file.delete();
} else {
File[] files = file.listFiles();
if(null == files) continue;
List<File> childrenFileList = Arrays.asList(files);
zipFile(childrenFileList, zipOutputStream);
}
}
}
}
/**
* 获取PDF页数
* @throws IOException
*/
public static String getPdfPageSize(MultipartFile file) throws IOException {
PdfReader pdfReader = new PdfReader(file.getBytes());
int pages = pdfReader.getNumberOfPages();
return String.valueOf(pages);
}
}
生成图片PdfController.java
package com.web.transformation.controller;
import com.util.PdfToImageUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class PdfController {
//PDF转图片或者ZIP
@RequestMapping("/pdfToImage")
@ResponseBody
public void pdfToImage(MultipartFile file, HttpServletResponse response) throws Exception{
PdfToImageUtil.pdfToTransformation(file,response);
}
//获取PDF页数
@RequestMapping("/getPdfPageSize")
@ResponseBody
public String pdfToImage(MultipartFile file) throws IOException {
return PdfToImageUtil.getPdfPageSize(file);
}
}
四 : 说明
生成的图片文件格式,可手动修改,此处设置为jpg,也可设置为png
也可将该配置,放置在yml配置文件中
本文地址:https://blog.csdn.net/qq_38254635/article/details/112029941
下一篇: SpringBoot之Junit单元测试
推荐阅读
-
PHP实现HTML生成PDF文件的方法,_PHP教程
-
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)_PHP教程
-
Office文档上传后实时转换为PDF格式_图片文件上传后实时裁剪_实现在线预览Office文档
-
根据模板文件生成一个静态html文件的类
-
使用C#如何在PDF文件添加图片印章的详细介绍
-
Java操作MySQL数据库存取图片以及其它类型文件_MySQL
-
php获取本地图片文件并生成xml文件输出具体思路
-
PHP实现HTML生成PDF文件程序
-
SmallPDF中如何提取PDF文件内图片?SmallPDF中提取PDF图片教程
-
php生成PDF格式文件并且加密_PHP教程