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

 更新时间:2022年02月23日 14:44:10   作者:Just do Java  
本文介绍SpringBoot实现PPT格式文件上传并在线预览功能,通过上传接口,可在C盘的tempfile目录下找到上传的文件,预览时会在同级目录下创建一个相同文件名后缀为pdf的文件,每次预览会先查找文件是否存在,存在则直接预览,不存在则会走上面的处理,需要的朋友可以参考下

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格式文件上传内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot 整合 Java DL4J 打造文本摘要生成系统

    Springboot 整合 Java DL4J 打造文本摘要生成系统

    本文介绍了如何使用SpringBoot整合JavaDeeplearning4j构建文本摘要生成系统,该系统能够自动从长篇文本中提取关键信息,生成简洁的摘要,帮助用户快速了解文本的主要内容,技术实现包括使用LSTM神经网络进行模型构建和训练,并通过SpringBoot集成RESTfulAPI接口
    2024-11-11
  • Java Scanner的使用和hasNextXXX()的用法说明

    Java Scanner的使用和hasNextXXX()的用法说明

    这篇文章主要介绍了Java Scanner的使用和hasNextXXX()的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • OpenFeign无法远程调用问题及解决

    OpenFeign无法远程调用问题及解决

    文章介绍了在使用Feign客户端时遇到的读超时问题,并分析了原因是系统启动时未先加载Nacos配置,为了解决这个问题,建议将Nacos配置放在`bootstrap.yml`文件中,以便项目启动时优先加载Nacos配置
    2024-11-11
  • Java中使用HashMap改进查找性能的步骤

    Java中使用HashMap改进查找性能的步骤

    这篇文章主要介绍了Java中使用HashMap改进查找性能的步骤,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • 浅谈SpringBoot之开启数据库迁移的FlyWay使用

    浅谈SpringBoot之开启数据库迁移的FlyWay使用

    这篇文章主要介绍了浅谈SpringBoot之开启数据库迁移的FlyWay使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • redisson分布式限流RRateLimiter源码解析

    redisson分布式限流RRateLimiter源码解析

    这篇文章主要为大家介绍了redisson分布式限流RRateLimiter源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 解决spring结合mybatis时一级缓存失效的问题

    解决spring结合mybatis时一级缓存失效的问题

    这篇文章主要介绍了解决spring结合mybatis时一级缓存失效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java实现链表中元素的获取、查询和修改方法详解

    Java实现链表中元素的获取、查询和修改方法详解

    这篇文章主要介绍了Java实现链表中元素的获取、查询和修改方法,结合实例形式详细分析了Java针对链表中元素的获取、查询和修改相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2020-03-03
  • springMVC几种页面跳转方式小结

    springMVC几种页面跳转方式小结

    本篇文章主要介绍了springMVC 几种页面跳转方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java实现ECDSA签名算法

    Java实现ECDSA签名算法

    这篇文章主要介绍了Java实现ECDSA签名算法,帮助大家更好得利用Java实现机器学习算法,感兴趣的朋友可以了解下
    2020-10-10

最新评论