java ppt转图片 解决图片不清晰问题,Java PowerPoint转图片,使用java操作ppt转图片

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

POI 操作office需要的jar包:

 <properties>
		<poi.version>3.17</poi.version>
    </properties>
       <!-- poi office -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-examples</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>${poi.version}</version>
        </dependency>

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

package com.gorun.platform.art.common.minio.http;


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

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;

public class Ppt {
    
    

    public static void main(String[] args) {
    
    
        File ppt = new File("C:\\Users\\lenovo\\Desktop\\7787.pptx");
        String img = "C:\\Users\\lenovo\\Desktop\\demo";
        System.out.println(converPPTtoImage(ppt,img,"png",8));
    }

    /**
     * 将PPT 文件转换成image
     *
     * @param orignalPPTFile    //PPT文件对象 如:d:/demo/demo1.ppt
     * @param targetImageFileDir    //转换后的图片保存路径 如:d:/demo/pptImg
     * @param imageFormatNameString //图片转化的格式字符串 ,如:"jpg"、"jpeg"、"bmp" "png" "gif" "tiff"
     * @param times //生成图片放大的倍数,倍数越高,清晰度越高
     * @return 图片名列表
     */
    public static int converPPTtoImage(File orignalPPTFile,String targetImageFileDir,
                                       String imageFormatNameString, int times) {
    
    

        //验证图片是否为pptx格式
        if(!checkIsPPTFile(orignalPPTFile)){
    
    
            System.out.print("转换文件必须是pptx!");
            return 0;
        }
        List<String> list = new ArrayList<String>();
        FileInputStream is = null ;
        int imgCount = 0;
        File imgFile = new File(targetImageFileDir);
        //如果没有文件夹就创建文件夹
        createDirIfNotExist(targetImageFileDir);
        try {
    
    
            is = new FileInputStream(orignalPPTFile);
            XMLSlideShow xmlSlideShow = new XMLSlideShow(is);
            is.close();
            // 获取大小
            Dimension pgsize = xmlSlideShow.getPageSize();
            // 获取幻灯片
            XSLFSlide[] slides = xmlSlideShow.getSlides().toArray(new XSLFSlide[0]);
            imgCount = slides.length;
            for (int i = 0 ; i < slides.length ; i++) {
    
    
                // 解决乱码问题
                XSLFShape[] shapes = slides[i].getShapes().toArray(new XSLFShape[0]);
                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对象,图像的尺寸为原来的每页的尺寸*倍数times
                BufferedImage img = new BufferedImage(pgsize.width * times,
                        pgsize.height * times, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics = img.createGraphics();
                graphics.setPaint(Color.white);
                graphics.scale(times, times);// 将图片放大times倍
                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width,pgsize.height));
                // 最核心的代码
                slides[i].draw(graphics);
                //图片将要存放的路径
                String absolutePath = imgFile.getAbsolutePath()+"/"+ (i + 1)
                        + "_" + UUID.randomUUID().toString() + "." + imageFormatNameString;
                File jpegFile = new File(absolutePath);
                // 图片路径存放
                list.add((i + 1) + ".jpg");
                //如果图片存在,则不再生成
                if (jpegFile.exists()) {
    
    
                    continue;
                }
                // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径
                FileOutputStream out = new FileOutputStream(jpegFile);
                // 写入到图片中去
                ImageIO.write(img, "jpeg", out);
                out.close();
            }
            System.out.print("PPT转换成图片 成功!");
            return imgCount;
        }
        catch (Exception e) {
    
    
            e.printStackTrace();
            System.out.print("PPT转换成图片 发生异常!");
        }
        return imgCount;
    }



    /**
     * 检查是否为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 (".pptx".equals(suffixname)) {
    
    
                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;
    }

}

猜你喜欢

转载自blog.csdn.net/ole_triangle_java/article/details/116118000