import com.daoshu.alarm.util.PptToJpg_poi;
import com.mti.ultd.common.view.RestResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/file")
@Api(value = "文件上传", tags = "文件上传")
@Slf4j
public class FileUploadController {
@ApiOperation(value = "上传PPT转Base64IMG", notes = "上传PPT转Base64IMG")
@PostMapping(value = "/loadPptToBase64Img")
public RestResponse<List<String>> loadPptToBase64Img(MultipartFile mfile, HttpServletRequest request) {
if(mfile == null){
return RestResponse.fail(5001, "未上传文件", null);
}
List<String> lastlist = new ArrayList<>();
try {
File file = File.createTempFile("temp", null);
mfile.transferTo(file);
if(!PptToJpg_poi.checkPPTFile(file)){
return RestResponse.fail(5001, "仅限于后缀为.ppt或.pptx文件", null);
}
lastlist = PptToJpg_poi.getBase64OfImageByPPTFile(file);
} catch (IOException e) {
e.printStackTrace();
return RestResponse.fail(5001, "文件转换异常", null);
}
return RestResponse.success(lastlist);
}
}
import lombok.extern.slf4j.Slf4j;
import org.apache.axis.encoding.Base64;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.model.TextRun;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.xslf.usermodel.*;
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.List;
/**
* 利用poi把ppt转化为图片
*/
@Slf4j
public class PptToJpg_poi {
public static void main(String[] args) throws IOException {
// 读入PPT文件
File file = new File("D:/soft-ljx/pptToImg/test.ppt");
List<String> list = getBase64OfImageByPPTFile(file);
}
/**
* 将PPT转换为Base64格式的图片列表
* @param file
* @return
* @throws IOException
*/
public static List<String> getBase64OfImageByPPTFile(File file) throws IOException {
if(!checkPPTFile(file)){
return null;
}
List<String> list = new ArrayList<>();
String suffix = getSuffix(file);
if("ppt".equals(suffix)){
list = doPPT2003toBase64OfImage(file);
}else if("pptx".equals(suffix)){
// list = doPPT2007toBase64OfImage(file);
}
return list;
}
/**
* 检查文件是否为PPT
* @param file
* @return
*/
public static boolean checkPPTFile(File file) {
boolean isppt = false;
String filename = file.getName();
String suffixname = null;
if (filename != null && filename.indexOf(".") != -1) {
suffixname = filename.substring(filename.lastIndexOf("."));
if (suffixname.equals(".ppt") || suffixname.equals(".pptx")) {
isppt = true;
}
}
return isppt;
}
/**
* 获取文件后缀名
* @param file
* @return
*/
public static String getSuffix(File file) {
String filename = file.getName();
if (filename != null && filename.indexOf(".") != -1) {
return filename.substring(filename.lastIndexOf(".")+1);
}
return "";
}
/**
* 将PPT转换为Base64格式图片
* ppt2003 文档的转换 后缀名为.ppt
* @param pptFile
* @return
*/
private static List<String> doPPT2003toBase64OfImage(File pptFile) throws IOException {
List<String> baseList= new ArrayList<>();
FileInputStream is = new FileInputStream(pptFile);
SlideShow ppt = new SlideShow(is);
//及时关闭掉 输入流
is.close();
Dimension pgsize = ppt.getPageSize();
Slide[] slide = ppt.getSlides();
for (int i = 0; i < slide.length; i++) {
TextRun[] truns = slide[i].getTextRuns();
for (int k = 0; k < truns.length; k++) {
RichTextRun[] rtruns = truns[k].getRichTextRuns();
for (int l = 0; l < rtruns.length; l++) {
// 重新设置 字体索引 和 字体名称 是为了防止生成的图片乱码问题
rtruns[l].setFontIndex(1);
rtruns[l].setFontName("宋体");
}
}
//根据幻灯片大小生成图片
BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setPaint(Color.BLUE);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
slide[i].draw(graphics);
//输出流
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(img, "png", stream);
baseList.add(Base64.encode(stream.toByteArray()));
stream.flush();
stream.close();
}
return baseList;
}
/**
* 将PPT转换为Base64格式图片
* ppt2007文档的转换 后缀为.pptx
* @param pptFile PPT文件
* @return
*/
private static List<String> doPPT2007toBase64OfImage(File pptFile) throws IOException {
List<String> baseList= new ArrayList<>();
FileInputStream is = new FileInputStream(pptFile);
XMLSlideShow xmlSlideShow = new XMLSlideShow(is);
is.close();
// 获取大小
Dimension pgsize = xmlSlideShow.getPageSize();
// 获取幻灯片
XSLFSlide[] slides = xmlSlideShow.getSlides();
for (int i = 0 ; i < slides.length ; i++) {
// 解决乱码问题
XSLFShape[] shapes = slides[i].getShapes();
for (XSLFShape shape : shapes) {
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.BLUE);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
// 最核心的代码
slides[i].draw(graphics);
//输出流
ByteArrayOutputStream stream = new ByteArrayOutputStream();
ImageIO.write(img, "png", stream);
baseList.add(Base64.encode(stream.toByteArray()));
stream.flush();
stream.close();
}
return baseList;
}
}