最近项目中有个需求是将上传的PPT转换为一张张图片返回给前端,然后前端去轮播这些图片。然后我这里总结下。
我用的是Apache POI实现PPT转图片,Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
有兴趣的可以查看官方文档:Apache POI官网
Apache POI操作PPT文档有两种方式:
POI-HSLF 对应的 Powerpoint '97(-2007) 的文件格式 – 后缀名为 .ppt
POI-XSLF 对应的PowerPoint 2007 OOXML 的文件格式 – 后缀名为 .pptx
我这里上传的是.pptx为后缀的PPT实例:
step 1:
maven方式引入相应的ja包,有两种方式:
1、引入这两个jar包:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.12</version>
</dependency>
2、引入这1个jar包即可:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
step 2: 写个工具类
import org.apache.poi.xslf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
/*
* pptx 转为图片
*/
public class PPTToImageUtil {
private static final Logger log = LoggerFactory.getLogger(PPTToImageUtil.class);
/**
* 将后缀为.pptx的PPT转换为图片
* @param pptFile PPT的路径
* @param imgFile 将PPT转换为图片后的路径
* @return
*/
public static List doPPT2007toImage(File pptFile, String imgFile) {
List<String> list = new ArrayList<>();
FileInputStream is = null ;
try {
is = new FileInputStream(pptFile);
XMLSlideShow xmlSlideShow = new XMLSlideShow(is);
is.close();
// 获取大小
Dimension pgsize = xmlSlideShow.getPageSize();
// 获取幻灯片
List<XSLFSlide> slides = xmlSlideShow.getSlides();
for (int i = 0 ; i < slides.size() ; i++) {
// 解决乱码问题
List<XSLFShape> shapes1 = slides.get(i).getShapes();
for (XSLFShape shape : shapes1) {
if (shape instanceof XSLFTextShape) {
XSLFTextShape sh = (XSLFTextShape) shape;
List<XSLFTextParagraph> textParagraphs = sh.getTextParagraphs();
for (XSLFTextParagraph xslfTextParagraph : textParagraphs) {
List<XSLFTextRun> textRuns = xslfTextParagraph.getTextRuns();
for (XSLFTextRun xslfTextRun : textRuns) {
xslfTextRun.setFontFamily("宋体");
}
}
}
}
//根据幻灯片大小生成图片
BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
// 最核心的代码
slides.get(i).draw(graphics);
//图片将要存放的路径
String absolutePath = imgFile+"/"+DateUtils.datePath() +"/"+ (i + 1) + ".jpeg";
File jpegFile = new File(absolutePath);
// 图片路径存放
list.add((i + 1) + ".jpeg");
//如果图片存在,则不再生成
if (jpegFile.exists()) {
continue;
}
// 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
FileOutputStream out = new FileOutputStream(jpegFile);
// 写入到图片中去
ImageIO.write(img, "jpeg", out);
out.close();
}
log.error("PPT转换成图片 成功!");
return list;
} catch (Exception e) {
log.error("PPT转换成图片 发生异常!{}"+e);
}
return list;
}
}
step 3:
写个测试类测试:
public static void main(String[] args) {
File file = new File("E:\\测试.pptx");
File imagePath = new File("E:\\images");
PPTToImageUtil.doPPT2007toImage(file, imagePath);
}