java spring+poi PPT转图片 生产环境解决方案
本文无法解决问题,请不要往下看了
poi 3.14
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.xslf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
public FileCommonVO uploadPPT(File file, String suffix, String requestFileName) {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
StringBuilder ipFilePath = new StringBuilder();
try {
inputStream = new FileInputStream(file.getAbsolutePath());
HSLFSlideShow hslfSlideShow = new HSLFSlideShow(inputStream);
// 获取PPT每页的大小(宽和高度)
Dimension pageSize = hslfSlideShow.getPageSize();
// 获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转为一张张的播放片
List<HSLFSlide> slideList = hslfSlideShow.getSlides();
inputStream.close();
for (HSLFSlide hslfSlide : slideList) {
// 这几个循环只要是设置字体为宋体,防止中文乱码,
List<List<HSLFTextParagraph>> oneTextParagraphs = hslfSlide.getTextParagraphs();
for (List<HSLFTextParagraph> list : oneTextParagraphs) {
for (HSLFTextParagraph hslfTextParagraph : list) {
List<HSLFTextRun> HSLFTextRunList = hslfTextParagraph.getTextRuns();
for (int j = 0; j < HSLFTextRunList.size(); j++) {
// 如果PPT在WPS中保存过,则
// HSLFTextRunList.get(j).getFontSize();的值为0或者26040,
// 因此首先识别当前文本框内的字体尺寸是否为0或者大于26040,则设置默认的字体尺寸。
// 设置字体大小
Double size = HSLFTextRunList.get(j).getFontSize();
if ((size <= 0) || (size >= 26040)) {
HSLFTextRunList.get(j).setFontSize(20.0);
}
// 设置字体样式为宋体
// String
// family=HSLFTextRunList.get(j).getFontFamily();
HSLFTextRunList.get(j).setFontFamily("宋体");
}
}
}
设置保存图片的图片属性
BufferedImage bufferedImage = new BufferedImage(pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bufferedImage.createGraphics();
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));
hslfSlide.draw(graphics);
// 设置文件保存的名称 uuid
String fileSaveName = UUID.randomUUID().toString() + ".png";
// 获取后缀名
// String fileName = file.getName();
// fileSaveName += fileName.substring(fileName.lastIndexOf(".")).replaceAll("-", "");
// 最终拼接的完整路径
String fullPath = path + fileSaveName;
// 创建父目录
File parentPath = new File(this.saveRootPath + path);
if (!parentPath.exists()) {
boolean mkdirs = parentPath.mkdirs();
log.info("uploadPPT = mkdirs:" + mkdirs);
}
// File savefile = new File(this.saveRootPath + fullPath);
// log.info("uploadPPT = 文件是否创建成功" + savefile.exists());
建立完整的路径-输出流,同时输出图片
outputStream = new FileOutputStream(this.saveRootPath + fullPath);
ImageIO.write(bufferedImage, "png", outputStream);
}
} catch (IOException e) {
log.info("uploadPPT = {} ", file.getName(), e);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log.error(" uploadPPT inputStream close ", e);
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
log.error(" uploadPPT outputStream close ", e);
}
}
}
}
流程如上图所示
经过如上代码,会将file的PPT文件转成图片,保存。
(代码是90%的正常代码,部分代码由于涉及公司以删除,请自行补全。)
主要的流程无非就是上图所示,每一页PPT转成图片保存
坑来了
这里由于设置的是宋体,但是Linux是没有宋体的,所以请将Windows下的宋体包,上传到服务器,同时进行相关的操作
https://www.cnblogs.com/lidedong/p/9805404.html
https://blog.csdn.net/ranweizheng/article/details/82993222
弄完重启服务器 rebot。
重启完成后,重新操作没有乱码,已解决