ppt预览:java实现ppt转image

前言

最近在项目中遇到了要在app端预览ppt的问题,客户端直接渲染整个ppt会消耗超长时间并且失败的概率极大。

后来想到可以将ppt按照顺序返回一个图片列表,在参考github上的项目并进行优化后实现。

项目源地址

所需依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>

java实现

生成的图片是原ppt图片的一半,缩放2倍到原图大小

生成的图片字体包含虚影,消除虚影

添加日志打印

package com.test.rest.utils;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import java.util.List;

@Slf4j
public class ConvertUtil {

    public static List<String> ppt2image(String filePath){
        String datePath = DateTime.now().toString(DatePattern.PURE_DATE_PATTERN);
        String storagePath = "/Users/mac/Downloads/" + datePath + "/" + System.currentTimeMillis();
        log.info("ppt2image filePath :{}, storagePath:{}", filePath, storagePath);
        Map<String, Object> map = new HashMap<>();
        File file = new File(filePath);
        try {
            List<String> images = convertPPTtoImage(file, storagePath);
            return images;
        } catch (Exception e) {
            log.error("ppt2image exception, filePath :{}, storagePath:{}, e:{}", filePath, storagePath, e);
            return null;
        }
    }

    private static List<String> convertPPTtoImage(File file, String dir) {

        long start = System.currentTimeMillis();

        File dirFile = new File(dir);
        if(!dirFile.exists()){
            dirFile.mkdirs();
        }

        List<String> images = new LinkedList<>();
        int isppt = checkFile(file);
        if (isppt < 0) {
            log.error("this file isn't ppt or pptx.");
            return null;
        }
        try {
            FileInputStream is = new FileInputStream(file);
            Dimension pgsize = null;
            Object[] slide = null;

            if(isppt == 0) {
                SlideShow ppt = new SlideShow(is);
                is.close();
                pgsize = ppt.getPageSize();
                slide = ppt.getSlides();
            }else if(isppt == 1) {
                XMLSlideShow xppt = new XMLSlideShow(is);
                is.close();
                pgsize = xppt.getPageSize();
                slide = xppt.getSlides();
            }

            int scale = 2; // 设置缩放因子
            for (int i = 0; i < slide.length; i++) {
                log.info("Processing Page {} ... ", i+1);
                BufferedImage img = new BufferedImage(pgsize.width*scale,
                        pgsize.height*scale, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics = img.createGraphics();
                graphics.setPaint(Color.white);
                //字体阴影修复
                graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
                graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width*scale,
                        pgsize.height*scale));
                graphics.scale(scale, scale); // 缩放图形

                if(isppt==0) {
                    Slide ss =  (Slide)slide[i];
                    ss.draw(graphics);
                }else{
                    XSLFSlide xss =  (XSLFSlide)slide[i];
                    xss.draw(graphics);
                }

                String filename = (i + 1) + ".jpg";
                File imgFile = new File(dir ,filename);
                images.add(imgFile.getAbsolutePath());
                FileOutputStream out = new FileOutputStream(imgFile);
                javax.imageio.ImageIO.write(img, "jpg", out);
                out.close();
            }
            log.info("completed in {} ms", System.currentTimeMillis() - start);
        } catch (Exception e) {
            log.error("convertPPTtoImage failed, e:{}", e);
        }
        return images;
    }

    private static int checkFile(File file) {
        int isppt = -1;
        String filename = file.getName();
        String suffixname = null;
        if (filename.contains(".")) {
            suffixname = filename.substring(filename.indexOf("."));
            if (suffixname.equals(".ppt")) {
                isppt = 0;
            }else if (suffixname.equals(".pptx")) {
                isppt = 1;
            }
        }
        return isppt;
    }
}
  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaPpt图片是指使用Java编程语言PPT文件换为图片的过程。通过Java提供的相关库和API,可以实现PPT文件中的每一页内容换为对应的图片文件。 在Java中,可以使用Apache POI库来读取PPT文件的内容,并使用Java图形库(如Java AWT或JavaFX)将每一页的内容渲染为图片。具体步骤如下: 1. 导入Apache POI库和Java图形库的相关依赖。 2. 使用Apache POI库加载PPT文件,获取每一页的内容。 3. 创建一个空白的图片对象,设置图片的宽度和高度。 4. 使用Java图形库将每一页的内容绘制到图片上。 5. 将生成的图片保存到指定的路径。 以下是一个简单的示例代码,演示了如何使用JavaPPT文件换为图片: ```java import org.apache.poi.xslf.usermodel.XMLSlideShow; import org.apache.poi.xslf.usermodel.XSLFSlide; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; public class PptToImageConverter { public static void main(String[] args) { String pptFilePath = "path/to/presentation.pptx"; String outputFolderPath = "path/to/output/folder/"; try { // Load the PPT file XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(pptFilePath)); // Get the dimensions of the slides Dimension slideSize = ppt.getPageSize(); // Iterate through each slide int slideNumber = 1; for (XSLFSlide slide : ppt.getSlides()) { // Create a blank image with the same dimensions as the slide BufferedImage image = new BufferedImage(slideSize.width, slideSize.height, BufferedImage.TYPE_INT_RGB); // Render the slide onto the image Graphics2D graphics = image.createGraphics(); slide.draw(graphics); // Save the image to a file String outputFilePath = outputFolderPath + "slide" + slideNumber + ".png"; ImageIO.write(image, "png", new FileOutputStream(outputFilePath)); // Increment the slide number slideNumber++; } System.out.println("PPT to image conversion completed."); } catch (IOException e) { e.printStackTrace(); } } } ``` 请注意,上述示例代码中使用的是Apache POI库的XSLF模块,适用于PPTX格式的文件。如果需要处理PPT格式的文件,可以使用HSLF模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值