PPT文件转为Base64格式图片


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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祥哥哥咩~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值