apache poi 解析ppt为图片,有两个问题:poi将ppt当作二进制流处理,有些格式,ppt自带艺术字等读取不出,IO读写也很频繁
maven 配置
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.8</version>
        </dependency>
代码
package com.ylw;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.imageio.ImageIO;

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.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

import com.ylw.entity.wanlixing.ActWanlixingProjectImage;

/**
 * PPT解析成图片保存
 * @param projectId
 * @param occFile
 */
private void uploadPPTImage(Integer projectId,String occFile) {
List<String> images = new ConverterPPT2Image().convertPPTs(occFile);
ActWanlixingProjectImage projectImage = null;
List<ActWanlixingProjectImage> projectImageList = new ArrayList<ActWanlixingProjectImage>();
for(String str:images){
if(str.split("#").length>1){
projectImage = new ActWanlixingProjectImage();
projectImage.setProjectId(projectId);
projectImage.setImagePath(str.split("#")[0]);
if(TextUtil.isNumeric1(str.split("#")[1])){
projectImage.setSorting(Integer.parseInt(str.split("#")[1]));
}
projectImage.setImageType(3);
projectImage.setCreateTime(DateConvertUtils.getNow());
projectImageList.add(projectImage);
}
}
actWanlixingProjectImageService.save(projectImageList);
}

public class ConverterPPT2Image{
    public final int DEFAULT_WIDTH = 800;
    public final int DEFAULT_HEIGHT = 600;
    private String srcPath;
    private int index;
    private Dimension pgsize;
    private BufferedImage img;
    private List<String> images = new ArrayList<String>();
    public List<String> convertPPTs(String occFile){
try {
File tmpFold = new File(Constants.ANLIXING_PPT_SAVE_PATH);
    if(!tmpFold.exists()){
    tmpFold.mkdirs();
    }
    new AliyunUploadUtil().download(occFile, Constants.ANLIXING_PPT_SAVE_PATH+occFile);
    srcPath=Constants.ANLIXING_PPT_SAVE_PATH+occFile;
    String ext = getExtension(occFile);
        if (".pptx".equalsIgnoreCase(ext)) {
            convertPPTX(Constants.ANLIXING_PPT_SAVE_PATH+occFile);
        } else if (".ppt".equalsIgnoreCase(ext)) {
            convertPPT(Constants.ANLIXING_PPT_SAVE_PATH+occFile);
        }
File file = new File(Constants.ANLIXING_PPT_SAVE_PATH+occFile);
if(file!=null){
file.delete();
}
return images;
} catch (Exception e) {
e.printStackTrace();
};
return new ArrayList<String>();
    }
 
    private void convertPPT(String path) throws IOException {
        FileInputStream is = new FileInputStream(srcPath);
        SlideShow ppt = new SlideShow(is);
        is.close();
        pgsize = ppt.getPageSize();
        Slide[] slide = ppt.getSlides();
        for (index = 0; index < slide.length; index++) {
        setFont(slide[index]);
            Graphics2D graphics = createGraphics2D();
            slide[index].draw(graphics);
            String imagePath =  saveImage(Constants.ANLIXING_PPT_SAVE_PATH + "brif_" + new Random().nextInt() + ".jpg");
            img = null;
            images.add(imagePath+"#"+index);
        }
    }

private void setFont(Slide slide) {
        TextRun[] truns = slide.getTextRuns();
        for (TextRun trun : truns) {
            RichTextRun[] rtruns = trun.getRichTextRuns();
            for (RichTextRun rtrun : rtruns) {
            rtrun.setFontIndex(1);
                rtrun.setFontName("宋体");
            }
        }
    }
    private String  saveImage(String pngPatch) throws IOException {
        Image smallImg = img.getScaledInstance(DEFAULT_WIDTH, DEFAULT_HEIGHT, Image.SCALE_SMOOTH);
        img = new BufferedImage(DEFAULT_WIDTH, DEFAULT_HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = img.createGraphics();
        g.drawImage(smallImg, 0, 0, null);
        g.dispose();
        OutputStream out = new FileOutputStream(pngPatch);
        ImageIO.write(img, "jpg", out);
        out.close();
        //图片上传到阿里云
        File file = new File(pngPatch);
        String imagePath =null;
        if(file!=null){
        imagePath = AliyunUploadUtil.uploadPPTImage(file, Constants.ALIYUN_WANLIXING_SAVE_PATH);
        //删除垃圾数据
        file.delete();
        }
        return imagePath;
    }

private Graphics2D createGraphics2D() {
        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));
        return graphics;
    }

private void convertPPTX(String path) throws IOException {
        FileInputStream is = new FileInputStream(srcPath);
        XMLSlideShow ppt = new XMLSlideShow(is);
        is.close();
        pgsize = ppt.getPageSize();
        XSLFSlide[] slide = ppt.getSlides();
        for (index = 0; index < slide.length; index++) {
        Graphics2D graphics = createGraphics2D();
             setFont(slide[index]);
             slide[index].draw(graphics);
             String imagePath =  saveImage(Constants.ANLIXING_PPT_SAVE_PATH + "brif_" + new Random().nextInt() + ".jpg");
             img = null;
             images.add(imagePath+"#"+index);
        }
    }

private void setFont(XSLFSlide slide) {
        for (XSLFShape shape : slide.getShapes()) {
            if (shape instanceof XSLFTextShape) {
                for (XSLFTextParagraph paragraph : ((XSLFTextShape) shape)) {
                    List<XSLFTextRun> truns = paragraph.getTextRuns();
                    for (XSLFTextRun trun : truns) {
                            trun.setFontFamily("宋体");
                    }
                }
            }

}
    }

public int getIndex() {
        return index;
    }

public static String getExtension(String fileName) {
        int pos = fileName.lastIndexOf(".");
        if (pos >= 0) {
            return fileName.substring(pos);
        } else {
            return "";
        }
    }

}

java poi 解析为图片相关推荐

  1. Java Poi word 插入图片并添加边框

    Java Poi word 插入图片并添加边框 //得到Picture的Base64编码 Base64Picture p1; //打开Word文件 Resource resource = new Cl ...

  2. 关于JAVA POI解析WPS docx文档中的table(复杂表格包含单元格横向,纵向的合并)

    关于JAVA POI解析WPS docx文档中的table(复杂表格包含单元格横向,纵向的合并) 首先,关于poi解析表格先阅读一篇他人的博客 使用poi读取word2007(.docx)中的复杂表格 ...

  3. Java POI解析Word提取数据存储在Excel

    JavaPOI解析word提取数据到excel 一.了解POI POI以前有了解,这次需求是解析word读取其中标题,还有内容赛选获取自己想要的内容 经过两天的学习,开始熟悉Java这么读取word和 ...

  4. java中输出拼json,java poi 解析excel 输出json 并且拼接字符串显示到jsp

    ##js代码 $(function() { $("#file_form").submit( function() { //首先验证文件格式 var fileName = $('#f ...

  5. java poi解析excel_Java 利用POI 解析Excel

    引入的依赖 org.apache.poi poi 3.16 org.apache.poi poi-ooxml 3.16 简单说明 主要有四个属性,Workbook(工作表),Sheet(表单),Row ...

  6. java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区

    需求描述 如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章) 思路: 用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则 ...

  7. java poi 读取excel 图片_Poi读取excel插图的方法和操作步骤

    我们在使用Excel制作表格的时候,有时会使用"Poi读取excel插图",但是很多初学者都不懂也不会制作.下面,我就给大家讲一下"Poi读取excel插图"的 ...

  8. 使用java poi解析表格

    @Testpublic void poi() throws Exception {InputStream inputStream=new FileInputStream("C:\\Users ...

  9. java poi 解析et,POI操作WPS表格

    原文网址: http://www.doczj.com/doc/c7dacf4dc850ad02de804186.html/thread-22004642-1-1.html Wps二次开发--POI入门 ...

最新文章

  1. 从0到1构建数据科学竞赛知识体系,有夕,鱼佬,茂霖等竞赛大咖将特邀分享...
  2. 吐槽 | 聊一聊公众号的那些事
  3. Bagging和Boosting 概念及区别
  4. 一行Java代码实现将数组转成List
  5. 【转】PowerShell入门(五):Cmd命令与PowerShell命令的交互
  6. 反射获取list泛型_Android 从浅到懂使用反射机制
  7. gcc support java_由于CC寻找不存在的gcc版本,自制软件无法安装公式
  8. Java系统中如何拆分同步和异步
  9. python判断GET和POST有没有某个参数
  10. 锐捷 linux共享wifi,电脑共享wifi都弱爆了,无线路由器直接共享锐捷
  11. VBA代码助手专业版功能概览
  12. java导出带图片excel
  13. plotyy函数_MATLAB学习笔记 plotyy函数 | 学步园
  14. awvs安装|User acunetix already exist. Home directory for user acunetix not found.
  15. 自己的第一个windows程序
  16. 【MySQL】数据库中的三大范式
  17. Python,爬取电影天堂,你觉得怎么样?
  18. 选择正确的域名和空间/服务器
  19. 计算机word软件学后的总结,计算机office教学总结范文
  20. Elasticsearch分布式搜索笔记

热门文章

  1. 华镭操作系统桌面版 RAYS LX
  2. 【情人节专属】AI一键预测你和Ta的CP值
  3. Js字符串数据处理方法汇总
  4. Mac下IntelliJ IDEA快捷键大全
  5. uniapp打包微信小程序识别二维码
  6. Mysql中索引失效得原因和解决
  7. ipad分屏功能怎么开启_率土之滨叫阵功能怎么出现的 开启叫阵方法一览
  8. IDEA 打包 jar
  9. L1-067 洛希极限 - java
  10. TortoiseSVN 和 VisualSVN Server 使用教程