使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件

烂漫一生 提交于 2020-01-08 17:11:27

此项目根据企业真实需求制作而成,希望能帮助大家解决在线预览的问题!
此项目已开源,欢迎大家来STAR

在这里插入图片描述
在这里插入图片描述

一、配置管理

① pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.gblfy</groupId>
    <artifactId>business-online-preview</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <name>business-online-preview</name>
    <url>https://gblfy.com</url>
    <description>在线预览</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

② yml

③ controller

package com.gblfy.onlinepreview.controller;

import com.gblfy.onlinepreview.utils.FileFormatConverToPDF;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;

/**
 * @author gblfy
 * @ClassNme FileController
 * @Description 文件在在线预览
 * @Date 2020/01/08 8:09
 * @version1.0
 */
@RestController
public class FileOnlinePreviewController {

    /**
     * 在线预览测试方法
     * 企业真实需求:
     * 文件的路径 文件名 都需要动态获取
     *
     * @param response http响应网页来实现在线预览
     * @throws Exception
     */
    @RequestMapping("/viewPDF")
    public void reviewWord(HttpServletResponse response) throws Exception {
        FileFormatConverToPDF linuxPageDIsplsyFileUtil = new FileFormatConverToPDF();
        //文件存储路径
        String fileStoragePath = "/app/ftpFileDir/testFileDir/businessLearning/";
        //转换前的文件名
        String beforeConversion = "知识库建设方案2019-11-11.docx";
        /**
         * 文件格式转换+在线预览
         */
        linuxPageDIsplsyFileUtil.conversionFile(response, fileStoragePath, beforeConversion);
    }
}

④ 文件格式转换工具类FileFormatConverToPDF

package com.gblfy.onlinepreview.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author:
 * @Date: 2019/1/15 0015 15:04
 * @describe 文档在线预览  (服务器环境为Linux环境) 目前文档类型 仅开放 Excel 03/07 word 03/07 ppt 03/07
 */
@Slf4j
public class FileFormatConverToPDF {

    //libreoffice 文件格式转换shell命令
    public static final String LIBREOFFICE_SHELLCMD = "/usr/bin/soffice --headless --invisible --convert-to pdf ";
    //unoconv 文件格式转换shell命令
    public static final String UNOCONV_SHELLCMD = "/usr/bin/unoconv -f pdf ";
    //previewfile_dir 需要预览的pdf目录
    public static final String PREVIEWFILE_DIR = "/root/";

    private static FileFormatConverToPDF linuxPageDIsplsyFileUtil;

    public static synchronized FileFormatConverToPDF getSwitchUtil() {
        if (linuxPageDIsplsyFileUtil == null) {
            linuxPageDIsplsyFileUtil = new FileFormatConverToPDF();
        }
        return linuxPageDIsplsyFileUtil;
    }

    /**
     * 文档在线预览
     *
     * @param response
     * @param fileStoragePath  文件存储路径 (前段获取文件存储路径返给后台)
     * @param beforeConversion 文件名(必须带文件后缀名,这里指的就是文件全名称)
     * @throws Exception
     */
    public void conversionFile(HttpServletResponse response, String fileStoragePath, String beforeConversion) throws Exception {

        String fileNamePath = fileStoragePath + beforeConversion;
        log.info("文件路径====" + fileNamePath);
        File file = new File(fileNamePath);
        if (!file.exists()) {
            log.info("库存中没有指定文件。。。。");
            return;
        }
        //获取到文件名
        String interceptFileName = beforeConversion.substring(0, beforeConversion.lastIndexOf("."));
        //截取文件后缀名
        String fileNameSuffix = beforeConversion.substring(beforeConversion.lastIndexOf(".") + 1);
        String command = null;
        System.out.println("获取到文件名====" + interceptFileName);
        System.out.println("截取文件后缀名====" + fileNameSuffix);

        if ("doc".equals(fileNameSuffix)
                || "docx".equals(fileNameSuffix)
                || "xls".equals(fileNameSuffix)
                || "xlsx".equals(fileNameSuffix)
                || "ppt".equals(fileNameSuffix)
                || "pptx".equals(fileNameSuffix)) {
            System.out.println("此文件属于" + fileNameSuffix + "开始进行转换");
            command = LIBREOFFICE_SHELLCMD + fileNamePath;
            executeLinuxCmd(command);
        } else {
            command = UNOCONV_SHELLCMD + fileNamePath;
            executeCommand(command);
        }
        System.out.println("openPDF的参数====" + fileStoragePath + interceptFileName);
        previewPDFUtils.openPdf(response, PREVIEWFILE_DIR + interceptFileName + ".pdf");
    }

    /**
     * 使用LibreOffice进行格式转换 to pdf
     *
     * @param cmd
     * @return
     * @throws IOException
     */
    public static List<String> executeLinuxCmd(String cmd) throws IOException {
        log.info("执行文件转换的命令:" + cmd);
        Runtime run = Runtime.getRuntime();
        Process process = run.exec(new String[]{"/bin/sh", "-c", cmd});
        InputStream in = process.getInputStream();
        BufferedReader bs = new BufferedReader(new InputStreamReader(in));
        List<String> list = new ArrayList<String>();
        String result = null;
        while ((result = bs.readLine()) != null) {
            log.info("job result [" + result + "]");
            list.add(result);
        }
        in.close();
        process.destroy();
        return list;
    }

    /**
     * 使用Unoconv进行格式转换 to pdf
     *
     * @param command
     * @throws Exception
     */
    private static void executeCommand(String command) throws Exception {
        log.info("执行文件转换的命令:" + command);
        StringBuffer output = new StringBuffer();
        Process process;
        InputStreamReader inputStreamReader = null;
        BufferedReader reader = null;
        try {
            process = Runtime.getRuntime().exec(command);
            process.waitFor();
            inputStreamReader = new InputStreamReader(process.getInputStream(), "UTF-8");
            reader = new BufferedReader(inputStreamReader);
            String line = "";
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }
            //p.destroy();//这个一般不需要
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(reader);
            IOUtils.closeQuietly(inputStreamReader);
        }
    }
}

⑤ 在线预览previewPDFUtils

package com.gblfy.onlinepreview.utils;

import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @author gblfy
 * @ClassNme previewPDF
 * @Description TODO
 * @Date 2020/1/8 12:47
 * @version1.0
 */
public class previewPDFUtils {

    /**
     * 在线预览pdf文件
     *
     * @param response
     * @param previewFile 预览pdf文件的绝对路径
     * @throws Exception
     */
    public static void openPdf(HttpServletResponse response, String previewFile) throws Exception {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        System.out.println("进入openPDF=====" + previewFile);
        //String path ="/home/tubiao/桌面/优化数据库.pdf";
        inputStream = new FileInputStream(previewFile);
        response.setContentType("application/pdf");
        outputStream = response.getOutputStream();
        int a = 0;
        byte[] b = new byte[1024];
        while ((a = inputStream.read(b)) != -1) {
            outputStream.write(b, 0, a);
        }
        if (outputStream != null) {
            outputStream.close();
        }
        if (inputStream != null) {
            inputStream.close();
        }
    }
}

⑥ 启动类

package com.gblfy.onlinepreview;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 在线预览统一入口
 */
@SpringBootApplication
public class OnlinePreviewApplication {

    public static void main(String[] args) {
        SpringApplication.run(OnlinePreviewApplication.class, args);
        System.out.println("启动成功!!!");
    }
}

二、测试验证

①测试链接

浏览器测试链接:http://localhost:8888/viewPDF

②测试效果

在这里插入图片描述
在这里插入图片描述

三、安装Unoconv

①yum安装Unoconv

unoconv 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件功能环境搭建
https://gblfy.blog.csdn.net/article/details/102847276

②源码安装Unoconv

(企业内部)Linux环境_源码安装Unoconv实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件
https://gblfy.blog.csdn.net/article/details/103540694

四、安装LibreOffice

(企业内部)Linux环境_源码安装LibreOffice实现文件在线预览doc,doxc,xls,xlsx,ppt,pptx 文件
https://gblfy.blog.csdn.net/article/details/103861905

友情链接:
(企业内部)SpringBoot 使用LibreOffice 在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件
https://gblfy.blog.csdn.net/article/details/103861607

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!