java spring+poi PPT转图片 生产环境解决方案

java spring+poi PPT转图片 生产环境解决方案

本文无法解决问题,请不要往下看了

poi 3.14
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.xslf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

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

public FileCommonVO uploadPPT(File file, String suffix, String requestFileName) {
    FileInputStream inputStream = null;
    FileOutputStream outputStream = null;
    StringBuilder ipFilePath = new StringBuilder();
    try {
        inputStream = new FileInputStream(file.getAbsolutePath());
        HSLFSlideShow hslfSlideShow = new HSLFSlideShow(inputStream);
        // 获取PPT每页的大小(宽和高度)
        Dimension pageSize = hslfSlideShow.getPageSize();
        // 获得PPT文件中的所有的PPT页面(获得每一张幻灯片),并转为一张张的播放片
        List<HSLFSlide> slideList = hslfSlideShow.getSlides();
        inputStream.close();

        for (HSLFSlide hslfSlide : slideList) {
            // 这几个循环只要是设置字体为宋体,防止中文乱码,
            List<List<HSLFTextParagraph>> oneTextParagraphs = hslfSlide.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 = new BufferedImage(pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = bufferedImage.createGraphics();
            graphics.setPaint(Color.white);
            graphics.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));
            hslfSlide.draw(graphics);

            // 设置文件保存的名称 uuid
            String fileSaveName = UUID.randomUUID().toString() + ".png";
            // 获取后缀名
            // String fileName = file.getName();
            // fileSaveName += fileName.substring(fileName.lastIndexOf(".")).replaceAll("-", "");

            // 最终拼接的完整路径
            String fullPath = path + fileSaveName;

            // 创建父目录
            File parentPath = new File(this.saveRootPath + path);
            if (!parentPath.exists()) {
                boolean mkdirs = parentPath.mkdirs();
                log.info("uploadPPT = mkdirs:" + mkdirs);
            }
            // File savefile = new File(this.saveRootPath + fullPath);
            // log.info("uploadPPT = 文件是否创建成功" + savefile.exists());

            建立完整的路径-输出流,同时输出图片
            outputStream = new FileOutputStream(this.saveRootPath + fullPath);
            ImageIO.write(bufferedImage, "png", outputStream);
        }

    } catch (IOException e) {
        log.info("uploadPPT = {} ", file.getName(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                log.error(" uploadPPT inputStream close ", e);
            }
        }
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                log.error(" uploadPPT outputStream close ", e);
            }
        }
    }
}

在这里插入图片描述
流程如上图所示

经过如上代码,会将file的PPT文件转成图片,保存。

(代码是90%的正常代码,部分代码由于涉及公司以删除,请自行补全。)

在这里插入图片描述
主要的流程无非就是上图所示,每一页PPT转成图片保存

坑来了

这里由于设置的是宋体,但是Linux是没有宋体的,所以请将Windows下的宋体包,上传到服务器,同时进行相关的操作
https://www.cnblogs.com/lidedong/p/9805404.html
https://blog.csdn.net/ranweizheng/article/details/82993222
弄完重启服务器 rebot。
重启完成后,重新操作没有乱码,已解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值