【SpringBoot集成】SpringBoot下集成Libreoffice实现在线预览功能

SpringBoot下集成Libreoffice实现在线预览功能

  • 一、准备
  • 二、相关jar包
  • 三、核心代码
    • 3.1、转换pdf代码
    • 3.2、将文件以特定格式返回给response
  • 四、前端部分实现代码

一、准备

首先,需要在服务器或者本机安装Libreoffice。下面是Linux下的Libreoffice安装笔记。【Linux学习笔记】Linux下安装Libreoffice

二、相关jar包

在pom中添加相关的jar包

<dependency>
   <groupId>org.jodconvertergroupId>
   <artifactId>jodconverter-spring-boot-starterartifactId>
   <version>4.2.2version>
dependency>
<dependency>
   <groupId>org.jodconvertergroupId>
   <artifactId>jodconverter-localartifactId>
   <version>4.2.2version>
dependency>
<dependency>
   <groupId>org.jodconvertergroupId>
   <artifactId>jodconverter-coreartifactId>
   <version>4.2.2version>
dependency>
<dependency>
   <groupId>org.libreofficegroupId>
   <artifactId>ridlartifactId>
   <version>6.4.0version>
dependency>

三、核心代码

3.1、转换pdf代码

    @Override
    public void onlinePreview(Long fileId) throws Exception {
        FileInfo fileInfo = fileMapper.selectById(fileId);
//        InputStream inputStream = mossFtpService.downLoadFileToStream(fileInfo.getPath(), fileInfo.getName());
        File outputFile = null;
        //  如果当前预览的文件的格式在可预览的范围内,并且预览的文件并非pdf格式则转换
        if (fileSuffixes.contains(fileInfo.getType().toLowerCase()) && !"pdf".equals(fileInfo.getType().toLowerCase())) {
            String pathName = fileInfo.getObjectName().substring(0, 8);
            String fileName = fileInfo.getObjectName().substring(9, 27);
            String pdfFileName = fileName + ".pdf";
            String[] fileArray = Objects.requireNonNull(fileInfo.getName()).split("\\.");
            //获取去掉文件名后缀的文件名
            String name = fileArray[0];
            String pdfFileShowName = name + ".pdf";
            //  1.将源文件转换成pdf文件。
            String output = checkSystem() + File.separator + pdfFileShowName;
            outputFile = new File(output);
            File fileParent = outputFile.getParentFile();
            if (!fileParent.exists()) {
                outputFile.mkdirs();
            }
            if (!outputFile.exists()) {
                outputFile.createNewFile();
            }
            try (InputStream inputStream = mossFtpService.downLoadFileToStream(fileInfo.getPath(), fileInfo.getName())) {
                documentConverter.convert(inputStream).as(Objects.requireNonNull(documentConverter.getFormatRegistry().getFormatByExtension(fileInfo.getType())))
                        .to(outputFile).as(documentConverter.getFormatRegistry().getFormatByExtension("pdf"))
                        .execute();
                //  2.将转换后的文件给前台展示
                InputStream pdfInputStream = new FileInputStream(outputFile);
                previewToResponse(pdfInputStream, pdfFileName);
                //  3.将转换后的pdf上传到ftp文件服务器
//                boolean flag = mossFtpService.uploadFile(pathName, pdfFileName, inputStream);
//                if (!flag) {
//                    log.error("PDF预览附件上传失败!原文件路径为:[" + fileInfo.getPath() + "]");
//                    throw new BusinessException("PDF预览附件上传失败!");
//                }
            } catch (IOException e) {
                log.error(e.getMessage());
                e.printStackTrace();
            } finally {
                outputFile.delete();
            }
        } else {
            try (InputStream inputStream = mossFtpService.downLoadFileToStream(fileInfo.getPath(), fileInfo.getName())) {
                previewToResponse(inputStream, fileInfo.getName());
            }
        }
    }

3.2、将文件以特定格式返回给response

    /**
     * @param inputStream pdf文件流
     * @param fileName    pdf文件名
     */
    private void previewToResponse(InputStream inputStream, String fileName) {
        try (BufferedInputStream bis = new BufferedInputStream(inputStream, 512); OutputStream toClient = new BufferedOutputStream(response.getOutputStream());) {
            response.reset();
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            //获取oss端文件的文件名,用作于下载文件的名称
            response.setContentType("application/octet-stream");
            //处理文件名为中文的情况
            response.setHeader("Content-Disposition", "attach;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            //*处理oss文件流传输*
            int number;
            byte[] buffer = new byte[ZE_4M];
            while ((number = bis.read(buffer)) != -1) {
                toClient.write(buffer, 0, number);
            }
            toClient.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

四、前端部分实现代码

PDF.js下载传送门
将下载好的插件放到如下目录中,各项目可能不同。
【SpringBoot集成】SpringBoot下集成Libreoffice实现在线预览功能_第1张图片
【SpringBoot集成】SpringBoot下集成Libreoffice实现在线预览功能_第2张图片

你可能感兴趣的:(Spring,Boot基础)