美文网首页POIPOI
java poi 实现ppt转图片(解决图片不高清问题)

java poi 实现ppt转图片(解决图片不高清问题)

作者: 来个帅气点的妮称 | 来源:发表于2018-07-01 12:38 被阅读7次

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。

POI 操作office需要的jar包:

image.png

poi生成的原图清晰度比较有限,所以转高清图的思路是生成图片的时候放大图片。下面是代码的实现。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

import javax.imageio.ImageIO;
import org.apache.poi.hslf.usermodel.HSLFSlide;
import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.HSLFTextParagraph;
import org.apache.poi.hslf.usermodel.HSLFTextRun;

public class pptUtils {

/**
 * 将PPT 文件转换成image
 * 
 * @param orignalPPTFileName //PPT文件路径 如:d:/demo/demo1.ppt
 * @param targetImageFileDir //转换后的图片保存路径 如:d:/demo/pptImg
 * @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"
 * @param 生成图片放大的倍数,倍数越高,清晰度越高
 * @return 图片名列表
 */
@SuppressWarnings("resource")
public static List<String> converPPTtoImage(String orignalPPTFileName, String targetImageFileDir,
        String imageFormatNameString, int times) {
    List<String> imgList = new ArrayList<>();
    List<String> imgNamesList = new ArrayList<String>();// PPT转成图片后所有名称集合
    FileInputStream orignalPPTFileInputStream = null;
    FileOutputStream orignalPPTFileOutStream = null;
    HSLFSlideShow oneHSLFSlideShow = null;
    //创建文件夹
    createDirIfNotExist(targetImageFileDir);
    try {
        try {
            orignalPPTFileInputStream = new FileInputStream(orignalPPTFileName);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return Collections.emptyList();
        }
        try {
            oneHSLFSlideShow = new HSLFSlideShow(orignalPPTFileInputStream);
        } catch (IOException e) {
            e.printStackTrace();
            return Collections.emptyList();
        }
        // 获取PPT每页的大小(宽和高度)
        Dimension onePPTPageSize = oneHSLFSlideShow.getPageSize();
        // 获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转为一张张的播放片
        List<HSLFSlide> pptPageSlideList = oneHSLFSlideShow.getSlides();
        // 下面循环的主要功能是实现对PPT文件中的每一张幻灯片进行转换和操作
        for (int i = 0; i < pptPageSlideList.size(); i++) {
            // 这几个循环只要是设置字体为宋体,防止中文乱码,
            List<List<HSLFTextParagraph>> oneTextParagraphs = pptPageSlideList.get(i).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对象,图像的尺寸为原来的每页的尺寸*倍数times
            BufferedImage oneBufferedImage = new BufferedImage(onePPTPageSize.width * times,
                    onePPTPageSize.height * times, BufferedImage.TYPE_INT_RGB);
            Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();
            // 设置转换后的图片背景色为白色
            oneGraphics2D.setPaint(Color.white);
            oneGraphics2D.scale(times, times);// 将图片放大times倍
            oneGraphics2D
                    .fill(new Rectangle2D.Float(0, 0, onePPTPageSize.width * times, onePPTPageSize.height * times));
            pptPageSlideList.get(i).draw(oneGraphics2D);
            // 设置图片的存放路径和图片格式,注意生成的图片路径为绝对路径,最终获得各个图像文件所对应的输出流对象
            try {
                String imgName = (i + 1) + "_" + UUID.randomUUID().toString() + "." + imageFormatNameString;
                imgNamesList.add(imgName);// 将图片名称添加的集合中
                imgList.add(imgName);
                orignalPPTFileOutStream = new FileOutputStream(targetImageFileDir + imgName);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return Collections.emptyList();
            }
            // 转换后的图片文件保存的指定的目录中
            try {
                ImageIO.write(oneBufferedImage, imageFormatNameString, orignalPPTFileOutStream);
            } catch (IOException e) {
                e.printStackTrace();
                return Collections.emptyList();
            }

        }

    } finally {
        try {
            if (orignalPPTFileInputStream != null) {
                orignalPPTFileInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            if (orignalPPTFileOutStream != null) {
                orignalPPTFileOutStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    return imgList;
}

/**
 * 检查是否为ppt文件
 * @param file
 * @return
 */
public static boolean checkIsPPTFile(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;
    } else {
        return isppt;
    }
}

/**
 * 创建文件如果路径不存在则创建对应的文件夹
 * @param file
 * @return
 */
public static File createDirIfNotExist(String file) {
    File fileDir = new File(file);
    if (!fileDir.exists()) {
        fileDir.mkdirs();
    }
    return fileDir;
}

public static void main(String[] args) {
    List<String> result = converPPTtoImage("C:\\Users\\Administrator\\Desktop\\demo.ppt", "D:\\demo\\", "jpg", 8);
    for(String s:result){
        System.out.println(s);
    }
    // testPPT();
    // testPPTX();
}

}

相关文章

网友评论

    本文标题:java poi 实现ppt转图片(解决图片不高清问题)

    本文链接:https://www.haomeiwen.com/subject/dsmcuftx.html