广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot实现PPT格式文件上传并在线预览功能
  • 239
分享到

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

2024-04-02 19:04:59 239人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

1、需要引入依赖 <dependency> <groupId>com.itextpdf</groupId>

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

--结束END--

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

本文链接: https://www.lsjlt.com/news/140225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作