ppt转图片

本文介绍了如何将PPT转换为图片的便捷方法,包括使用软件内的导出功能、在线转换工具以及自动化脚本,旨在帮助用户高效地将演示文稿转化为高质量的图像文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面这种ppt转图片的方法有局限性,对于不规范的ppt转为的图片会出现空白现象,解决办法推荐  阿里云服务的  智能媒体管理 的文档转换。 https://help.aliyun.com/document_detail/63761.html?spm=a2c4g.11174283.6.562.38171c0cHU0JjI

package com.huankeyun.community.utils;

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;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.drawingml.x2006.main.*;
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import java.util.List;

/**
 * PPT转image工具类 使用的Apache poi-3.14的版本
 * 依赖第三方jar包:poi-3.14-20160307.jar、poi-ooxml-3.14-20160307.jar、
 * poi-ooxml-schemas-3.14-20160307.jar、poi-scratchpad-3.14-20160307.jar、xmlbeans-2.6.0.jar
 *
 * @author yds
 * @date 2017-03-22
 */
@Service
public class ConverPPTFileToImageUtil {
    /**
     * 将PPTX 文件转换成image
     *
     * @param orignalPPTFileName    //PPTX文件路径 如:d:/demo/demo1.pptx
     * @param targetImageFileDir    //转换后的图片保存路径 如:d:/demo/pptxImg
     * @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"
     * @return Map<String   ,   Object> key: converReturnResult 类型:boolean 转化结果 true
     * 代表转换成功,false 代表转换失败 key:imgNames 类型:List<String> 转换成功后图片的全部名称集合
     * 注:获取“imgNames”图片名称集合时,请先判断“converReturnResult”
     * 是否为true;如果有一张转换失败则为false
     */
    @SuppressWarnings("resource")
    public static Map<String, Object> converPPTXtoImage(String orignalPPTFileName, String targetImageFileDir, String imageFormatNameString) {
        Map<String, Object> map = new HashMap<String, Object>();
        boolean converReturnResult = false;// 是否全部转成功
        List<String> imgNamesList = new ArrayList<String>();// PPT转成图片后所有名称集合
        FileInputStream orignalPPTFileInputStream = null;
        FileOutputStream orignalPPTFileOutStream = null;
        XMLSlideShow oneSlideShow = null;
        try {
            try {
                orignalPPTFileInputStream = new FileInputStream(orignalPPTFileName);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                map.put("converReturnResult", converReturnResult);
                return map;
            }
            try {
                oneSlideShow = new XMLSlideShow(orignalPPTFileInputStream);
            } catch (IOException e) {
                e.printStackTrace();
                map.put("converReturnResult", converReturnResult);
                return map;
            }
            // 获取PPT每页的尺寸大小(宽和高度)
            Dimension onePPTPageSize = oneSlideShow.getPageSize();
            // 获取PPT文件中的所有PPT页面,并转换为一张张播放片
            List<XSLFSlide> pptPageXSLFSLiseList = oneSlideShow.getSlides();

            String xmlFontFormat = "<xml-fragment xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">"
                    + "<a:rPr lang=\"zh-CN\" altLang=\"en-US\" dirty=\"0\" smtClean=\"0\"> "
                    + "<a:latin typeface=\"+mj-ea\"/> " + "</a:rPr>" + "</xml-fragment>";
            for (int i = 0; i < pptPageXSLFSLiseList.size(); i++) {
                /**
                 * 设置中文为宋体,解决中文乱码问题
                 */
                CTSlide oneCTSlide = pptPageXSLFSLiseList.get(i).getXmlObject();
                CTGroupShape oneCTGroupShape = oneCTSlide.getCSld().getSpTree();
                List<CTShape> oneCTShapeList = oneCTGroupShape.getSpList();
                for (CTShape ctShape : oneCTShapeList) {
                    CTTextBody oneCTTextBody = ctShape.getTxBody();

                    if (null == oneCTTextBody) {
                        continue;
                    }
                    CTTextParagraph[] oneCTTextParagraph = oneCTTextBody.getPArray();
                    CTTextFont oneCTTextFont = null;
                    try {
                        oneCTTextFont = CTTextFont.Factory.parse(xmlFontFormat);
                    } catch (XmlException e) {
                        e.printStackTrace();
                    }
                    for (CTTextParagraph ctTextParagraph : oneCTTextParagraph) {
                        CTRegularTextRun[] onrCTRegularTextRunArray = ctTextParagraph.getRArray();
                        for (CTRegularTextRun ctRegularTextRun : onrCTRegularTextRunArray) {
                            CTTextCharacterProperties oneCTTextCharacterProperties = ctRegularTextRun.getRPr();
                            oneCTTextCharacterProperties.setLatin(oneCTTextFont);
                        }
                    }
                }
                // 创建BufferedImage 对象,图像尺寸为原来的PPT的每页尺寸
                BufferedImage oneBufferedImage = new BufferedImage(onePPTPageSize.width, onePPTPageSize.height,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();
                // 将PPT文件中的每个页面中的相关内容画到转换后的图片中
                pptPageXSLFSLiseList.get(i).draw(oneGraphics2D);
                /**
                 * 设置图片的存放路径和图片格式,注意生成的文件路径为绝对路径,最终获得各个图像文件所对应的输出流的对象
                 */
                try {
                    String imgName = (i + 1) + "_" + UUID.randomUUID().toString() + "." + imageFormatNameString;
                    imgNamesList.add(imgName);// 将图片名称添加的集合中
                    File file = new File(targetImageFileDir, imgName);
                    orignalPPTFileOutStream = new FileOutputStream(file);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    map.put("converReturnResult", converReturnResult);
                    return map;
                }
                // 将转换后的各个图片文件保存带指定的目录中
                try {
                    ImageIO.write(oneBufferedImage, imageFormatNameString, orignalPPTFileOutStream);

                } catch (IOException e) {
                    e.printStackTrace();
                    map.put("converReturnResult", converReturnResult);
                    return map;
                }
            }
        } finally {
            try {
                if (orignalPPTFileInputStream != null) {
                    orignalPPTFileInputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (orignalPPTFileOutStream != null) {
                    orignalPPTFileOutStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            converReturnResult = true;
            map.put("converReturnResult", converReturnResult);
            map.put("imgNames", imgNamesList);
        }
        return map;
    }


    /**
     * 将PPT 文件转换成image
     *
     * @param orignalPPTFileName    //PPTX文件路径 如:d:/demo/demo1.pptx
     * @param targetImageFileDir    //转换后的图片保存路径 如:d:/demo/pptxImg
     * @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"
     * @return Map<String       ,       Object> key: converReturnResult 类型:boolean 转化结果 true
     * 代表转换成功,false 代表转换失败 key:imgNames 类型:List<String> 转换成功后图片的全部名称集合
     * 注:获取“imgNames”图片名称集合时,请先判断“converReturnResult”
     * 是否为true;如果有一张转换失败则为false
     */
    @SuppressWarnings("resource")
    public static Map<String, Object> converPPTtoImage(String orignalPPTFileName, String targetImageFileDir,
                                                       String imageFormatNameString) {
        Map<String, Object> map = new HashMap<String, Object>();
        boolean converReturnResult = false;// 是否全部转成功
        List<String> imgNamesList = new ArrayList<String>();// PPT转成图片后所有名称集合

        FileInputStream orignalPPTFileInputStream = null;
        FileOutputStream orignalPPTFileOutStream = null;
        HSLFSlideShow oneHSLFSlideShow = null;

        try {
            try {
                orignalPPTFileInputStream = new FileInputStream(orignalPPTFileName);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                map.put("converReturnResult", converReturnResult);
                return map;
            }

            try {
                oneHSLFSlideShow = new HSLFSlideShow(orignalPPTFileInputStream);
            } catch (IOException e) {
                e.printStackTrace();
                map.put("converReturnResult", converReturnResult);
                return map;
            }
            // 获取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对象,图像的尺寸为原来的每页的尺寸
                 */
                BufferedImage oneBufferedImage = new BufferedImage(onePPTPageSize.width, onePPTPageSize.height,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D oneGraphics2D = oneBufferedImage.createGraphics();
                /**
                 * 设置转换后的图片背景色为白色
                 *
                 */
                oneGraphics2D.setPaint(Color.white);
                oneGraphics2D.fill(new Rectangle2D.Float(0, 0, onePPTPageSize.width, onePPTPageSize.height));
                pptPageSlideList.get(i).draw(oneGraphics2D);
                /**
                 * 设置图片的存放路径和图片格式,注意生成的图片路径为绝对路径,最终获得各个图像文件所对应的输出流对象
                 */
                try {
                    String imgName = (i + 1) + "_" + UUID.randomUUID().toString() + "." + imageFormatNameString;
                    imgNamesList.add(imgName);// 将图片名称添加的集合中
                    File file = new File(targetImageFileDir, imgName);
                    orignalPPTFileOutStream = new FileOutputStream(file);


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

            }

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

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

            converReturnResult = true;
            map.put("converReturnResult", converReturnResult);
            map.put("imgNames", imgNamesList);
        }

        return map;
    }


    /**
     * 判断是否为ppt
     *
     * @param contentType
     * @return
     */
    public boolean checkFileisPPT(String contentType) throws IOException {
        boolean isppt = false;
        if (contentType.equals("application/vnd.ms-powerpoint")) {
            isppt = true;
        }
        return isppt;
    }

    /**
     * 判断是否为pptx
     *
     * @param
     * @return
     */
    public boolean checkFileisPPTX(String contentType) throws IOException {
        boolean f = false;
        if (contentType.equals("application/vnd.openxmlformats-officedocument.presentationml.presentation")) {
            f = true;
        }
        return f;
    }

    public boolean checkPdf(String contentType){
        boolean f=false;
        if (contentType.equals("application/pdf")){
            f=true;
        }
        return f;
    }
    public static String tmpdir;


    @PostConstruct
    public void postConstruct() {
        tmpdir = System.getProperty("java.io.tmpdir", "/tmpdir");
        System.out.println("Temp dir: " + tmpdir);
    }

    public List<String> pptOpptxImage(String contentType, String filePath) throws IOException {
        Map<String, Object> map = new HashMap<>();
        if (checkFileisPPT(contentType)) {
            map = ConverPPTFileToImageUtil.converPPTtoImage(filePath, tmpdir, "jpg");
        }

        if (checkFileisPPTX(contentType)) {
            // PPTX调用示例
            map = ConverPPTFileToImageUtil.converPPTXtoImage(filePath, tmpdir, "jpg");
        }
        boolean converReturnResult = false;
        if (map.containsKey("converReturnResult")) {
            converReturnResult = (Boolean) map.get("converReturnResult");
        }
        System.out.println("converReturnResult:" + converReturnResult);
        List<String> images = new ArrayList<>();
        if (converReturnResult) {// 如果全部转换成功,则为true;如果有一张转换失败,则为fasle
            @SuppressWarnings("unchecked")
            List<String> imgNames = (List<String>) map.get("imgNames");
            for (String imgName : imgNames) {
                System.out.println(imgName);
            }
            images = imgNames;

        }

        return images;
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值