SpringBoot实现PPT格式文件上传并在线预览功能

1、需要引入依赖

<dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.9</version>
        </dependency>
         <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
               <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <!--其他格式转换为PDF -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>xdocreport</artifactId>
            <version>1.0.6</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

2、上传文件到本地文件夹中

 @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<Object> uploadFileToLocal(@RequestParam("multipartFile") MultipartFile multipartFile) {
        if (multipartFile == null) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        File file = null;
        try {
            File dir = new File(basePath);
            if (!dir.exists()) {
                dir.mkdir();
            }
            file = new File(basePath + File.separator + multipartFile.getOriginalFilename());
            if (!file.exists()) {
                multipartFile.transferTo(file);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.ok(FileVo.builder().size(multipartFile.getSize()).path(file.getAbsolutePath()).build());

    }

basePath为定义的常量: private static final String basePath = “C:\tempFile”;

通过上传接口,可在C盘的tempfile目录下找到上传的文件,首先我们先上传一个PPT文件,上传成功会返回文件的绝对路径地址以及文件大小,绝对地址将作为在线预览文件接口的参数。

3、在线预览PPT文件

 @GetMapping("/showPPT")
    public void showPPT(@RequestParam("path") String path,HttpServletResponse response) throws IOException {
        byte[] buffer = new byte[1024 * 4];
        String type = path.substring(path.lastIndexOf(".") + 1);
        //转换pdf文件,如存在则直接显示pdf文件
        String pdf = path.replace(type, "pdf");
        File pdfFile = new File(pdf);
        if (pdfFile.exists()) {
            outFile(buffer, pdfFile, response);
        } else {
            FileInputStream in = new FileInputStream(path);
            ZipSecureFile.setMinInflateRatio(-1.0d);
            XMLSlideShow xmlSlideShow = new XMLSlideShow(in);
            in.close();
            // 获取大小
            Dimension pgsize = xmlSlideShow.getPageSize();
            // 获取幻灯片
            List<XSLFSlide> slides = xmlSlideShow.getSlides();
            List<File> imageList = new ArrayList<>();
            for (int i = 0; i < slides.size(); i++) {
                // 解决乱码问题
                List<XSLFShape> shapes = slides.get(i).getShapes();
                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 img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
                Graphics2D graphics = img.createGraphics();
                graphics.setPaint(Color.white);
                graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
                // 将PPT内容绘制到img上
                slides.get(i).draw(graphics);
                //图片将要存放的路径
                String absolutePath = basePath + File.separator+ (i + 1) + ".jpg";
                File jpegFile = new File(absolutePath);
                if (!jpegFile.exists()) {
                    // 判断如果图片存在则不再重复创建,建议将图片存放到一个特定目录,后面会统一删除
                    FileOutputStream fileOutputStream = new FileOutputStream(jpegFile);
                    ImageIO.write(img, "jpg", fileOutputStream);
                }
                // 图片路径存放
                imageList.add(jpegFile);
            }
            File file = png2Pdf(imageList, pdf);
            outFile(buffer, file, response);
        }
    }

    private void outFile(byte[] buffer, File pdfFile, HttpServletResponse response) throws IOException {
        ByteArrayOutputStream out;
        int n = 0;
        FileInputStream fileInputStream = new FileInputStream(pdfFile);
        out = new ByteArrayOutputStream();
        ServletOutputStream outputStream = response.getOutputStream();
        while ((n = fileInputStream.read(buffer)) != -1) {
            out.write(buffer, 0, n);
        }
        outputStream.write(out.toByteArray());
        outputStream.flush();
    }
	//将图片列表转换为PDF格式文件并存储
    public File png2Pdf(List<File> pngFiles, String pdfFilePath) {
        Document document = new Document();
        File pdfFile = null;
        long startTime = System.currentTimeMillis();
        try {
            pdfFile = new File(pdfFilePath);
            if (pdfFile.exists()) {
                return pdfFile;
            }
            PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
            document.open();
            pngFiles.forEach(pngFile -> {
                try {
                    Image png = Image.getInstance(pngFile.getCanonicalPath());
                    png.scalePercent(50);
                    document.add(png);
                } catch (Exception e) {
                    System.out.println("png2Pdf exception");
                }
            });
            document.close();
            return pdfFile;
        } catch (Exception e) {
            System.out.println(String.format("png2Pdf %s exception", pdfFilePath));
        } finally {
            if (document.isOpen()) {
                document.close();
            }
            // 删除临时生成的png图片
            for (File pngFile : pngFiles) {
                try {
                    FileUtils.delete(pngFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println("png2Pdf耗时:" + (endTime - startTime));
        }

        return null;
    }

核心思路:将PPT文件读取每一页幻灯片,将幻灯片转换为图片格式,最后将所有图片放到一个pdf文件中形成一个pdf文件用于在线预览。预览时会在同级目录下创建一个相同文件名后缀为pdf的文件,每次预览会先查找文件是否存在,存在则直接预览,不存在则会走上面的处理。

4、预览效果

到此这篇关于SpringBoot实现PPT格式文件上传并在线预览的文章就介绍到这了,更多相关SpringBoot PPT格式文件上传内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot实现单文件与多文件上传功能

    目录 1.单文件上传 2.多文件上传 1.单文件上传 首先创建一个Spring Boot项目,并添加spring-boot-starter-web依赖 然后创建一个upload.jsp文件,做一个简单的文件上传页面,具体代码如下: <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head>     <title>Titl

  • springboot整合minio实现文件上传与下载且支持链接永久访问

    目录 1.minio部署 2.项目搭建 3.文件上传 4.文件下载 5.文件永久链接下载 1.minio部署 1.1 拉取镜像 docker pull minio/minio 1.2 创建数据目录 mkdir -p /home/guanz/minio mkdir -p /home/guanz/minio/midata 1.3 启动minio docker run -d -p 9000:9000 -p 9001:9001 --restart=always -e MINIO_ACCESS_KEY=g

  • SpringBoot文件分片上传的示例代码

    目录 背景 文件MD5计算 文件分片切割 文件分片接收 检查分片 保存分片 合并分片 云文件分片上传 阿里云OSS 华为云OBS Minio 背景 最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,如图纸,视频等,并且需要在上传大文件过程中进行优化实时展现进度条,进行技术评估后针对框架文件上传进行扩展升级,扩展接口支持大文件分片上传处理,减少服务器瞬时的内存压力,同一个文件上传失败后可以从成功上传分片位置进行断点续传,文件上传成功后再次上

  • SpringBoot实现文件上传功能

    经典的文件上传 服务器处理上传文件一般都是先在请求中读取文件信息,然后改变名称保存在服务器的临时路径下,最后保存到服务器磁盘中.本次以thymeleaf搭建demo,因此需要引入thymeleaf依赖库. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <versio

  • SpringBoot实现PPT格式文件上传并在线预览功能

    1.需要引入依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId&

  • jsp中点击图片弹出文件上传界面及预览功能的实现

    花了两天时间琢磨一下图片预览的功能 任务需求如下: 1:jsp页面中有一个图片(pic_1) 2:点击图片弹出类似于资源管理器的界面 3:选择完某一个图片之后在pic_1处预览 我在IE8上试验下面这段代码,可以实现上述功能,没有在别的浏览器中测试,如果各位朋友知道多种浏览器的支持方法,请赐教,共同学习,谢谢. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:

  • php实现文件上传及头像预览功能

    php文件上传原理是通过form表单的enctype="multipart/form-data"属性将文件临时放到wamp文件夹中的tmp目录下,再通过后台php程序将文件保存在体统中. html代码: <form action="shangchuan.php" method="post" enctype="multipart/form-data"> <input type="file"

  • JS+HTML5 FileReader实现文件上传前本地预览功能

    HTML5之FileReader的使用 HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简单,可以按照如下步骤创建FileReader对象并调用其方法: 1.检测浏览器对FileReader的支持 if(window.FileReader) { var fr = new FileReader(); // add your code here } e

  • Ajax上传图片及上传前先预览功能实例代码

    手头上有几个小项目用到了easyUI,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成.在文件上传的时候用到了Ajax上传文件,以及图片在上传之前的预览效果,解决了这两个小问题,和小伙伴们分享下. 上传之前的预览 方式一 先来说说图片上传之前的预览问题.这里主要采用了HTML5中的FileReader对象来实现,关于FileReader对象,如果小伙伴们不了解,可以查看这篇文章HTML5学习之FileReader接口.我们来看看实现方式: <!DOCT

  • 分离与继承的思想实现图片上传后的预览功能:ImageUploadView

    本文要介绍的是网页中常见的图片上传后直接在页面生成小图预览的实现思路,考虑到该功能有一定的适用性,于是把相关的逻辑封装成了一个ImageUploadView组件,实际使用效果可查看下一段的git效果图.在实现这个组件的过程中,有用到前面几篇博客介绍的相关内容,比如继承库class.js,任意组件的事件管理库eventBase.js,同时包含进了自己对职责分离,表现与行为分离这两方面的一些思考,欢迎阅读与交流. 演示效果: 注:由于演示的代码都是静态的,所以文件上传的组件是用setTimeout模

  • jquery实现图片上传前本地预览功能

    本文实例为大家分享了jquery实现图片上传前预览的具体代码,供大家参考,具体内容如下 介绍之前有一个小问题,一直找不到图片预览时,图片不出来的原因,原来在于图片的路径!!!一直写的是图片的本地路径,没有什么用.直接上代码. html部分: 复制代码 代码如下: <img id="pic" src="" > <input id="upload" name="file" accept="image/*

  • vue+springboot+element+vue-resource实现文件上传教程

    vue页面设置 <el-upload class="upload-demo" action="" :before-upload="beforeUpload" //上传前操作 :before-remove="beforeRemove" //移除钱操作 :multiple="false" //禁止多选 :http-request="myUpload" //文件上传,重写文件上传方法,a

  • 微信小程序实现pdf、word等格式文件上传的方法

    目前微信只支持从聊天记录里面获取文件 一.前言 目前微信提供了一个接口 wx.chooseMessageFile 它能让用户从聊天记录里面选择一个或者多个文件,然后返回它的一些信息,列入文件的path地址,文件名,文件的大小等. 获取这些信息再结合微信的上传接口wx.uploadFile,即可实现文件上传. 二.具体实现 首先需要一个按钮来调用wx.chooseMessageFile. wx.chooseMessageFile({ count: 1, //能选择文件的数量 type: 'file

  • SpringBoot整合MongoDB实现文件上传下载删除

    本文主要内容 MongoDB基础操作命令示例练习 MongoDB居于GridFSTemplate的文件上传.下载.删除等操作(工作重点使用) 1. 基础命令 创建的数据库名称:horse,创建的集合名称:blog # 创建数据库 use horse # 删除当前数据库[horse] db.dropDatebase() # 查看所有数据库 show dbs # 设置用户的角色和权限 db.createUser({user:"horse",pwd:"mongo123",

随机推荐