简介

LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示文稿、绘图文档、数学公式编辑、数据库管理等工作。
LibreOffice 支持各种文档格式。除了它原生支持的开放文档格式 (OpenDocument Format, ODF) 外,它还支持许多的非开放格式,比如微软的 Microsoft® Word, Excel, PowerPoint 以及 Publisher 的格式等。
Springboot整合openoffice实现文件在线预览_openoffice 在线预览-CSDN博客

安装

windows

1、下载并安装 libreoffice
2、进入安装目录

D:\Program Files\LibreOffice\program

3、启动 LibreOffice,这样就运行在 8100 端口了

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

image.png

Linux

1、下载
官方地址:
下载 LibreOffice | LibreOffice 简体中文官方网站 - 自由免费的办公套件
2、将下载好的linux版本的文件上传至服务器的某个目录,然后解压文件

tar -zxvf LibreOffice_7.1.7_Linux_x86-64_rpm.tar.gz

3、上面的文件解压之后会产生一个RPMS文件,使用以下命令进入到RPMS目录并进行安装

cd /LibreOffice_7.1.7_Linux_x86-64_rpm/RPMSyum localinstall *.rpm

4、安装libreoffice-headless(安装这个东西,需要java环境,可以先安装一下java环境)

yum install libreoffice-headless

5、执行完上面的代码就安装成功了。可以输入libreoffice测试一下。

/opt/libreoffice7.1 --convert-to pdf:writer_pdf_Export /目录/文件名.pptx --outdir /目录/

spring集成libreoffice

1、项目添加依赖

<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.7</version>
</dependency>

2、创建工具类

package com.example.libreoffice_study.util;

import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

/**
 * 文件格式转换工具类
 */
public class FileConvertUtil { 

    /**
     * 默认转换后文件后缀
     */
    private static final String DEFAULT_SUFFIX = "pdf";
    /**
     * openoffice_port
     */
    private static final Integer OPENOFFICE_PORT = 8100;

    /**
     * 方法描述 office文档转换为PDF(处理本地文件)
     * @param sourcePath 源文件路径
     * @param suffix     源文件后缀
     * @return byte[] 转换后文件
     */
    public static byte[] convertLocaleFile(String sourcePath, String suffix) throws Exception { 
        File inputFile = new File(sourcePath);
        InputStream inputStream = new FileInputStream(inputFile);
        return covertCommonByStream(inputStream, suffix);
    } 

    /**
     * 方法描述  office文档转换为PDF(处理网络文件)
     * @param netFileUrl 网络文件路径
     * @param suffix     文件后缀
     * @return byte[] 转换后文件
     */
    public static byte[] convertNetFile(String netFileUrl, String suffix) throws Exception { 
        // 创建URL
        URL url = new URL(netFileUrl);
        // 试图连接并取得返回状态码
        URLConnection urlconn = url.openConnection();
        urlconn.connect();
        HttpURLConnection httpconn = (HttpURLConnection) urlconn;
        int httpResult = httpconn.getResponseCode();
        if (httpResult == HttpURLConnection.HTTP_OK) { 
            InputStream inputStream = urlconn.getInputStream();
            return covertCommonByStream(inputStream, suffix);
        } 
        return null;
    } 

    /**
     * 方法描述  将文件以流的形式转换
     *
     * @param inputStream 源文件输入流
     * @param suffix      源文件后缀
     * @return OutputStream 转换后文件
     */
    public static byte[] covertCommonByStream(InputStream inputStream, String suffix) throws Exception { 
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
        connection.connect();
        DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
        DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
        DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
        DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
        converter.convert(inputStream, sourceFormat, out, targetFormat);
        connection.disconnect();
        return out.toByteArray();
    } 

    /**
     * 方法描述 outputStream转inputStream
     */
    public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception { 
        ByteArrayOutputStream baos = (ByteArrayOutputStream) out;
        return new ByteArrayInputStream(baos.toByteArray());
    } 

} 

3、测试

@RestController
public class TestController { 

    @RequestMapping("/test")
    public void test(@RequestParam("file") String file, @RequestParam("type") String type) throws Exception { 
        byte[] docs = FileConvertUtil.convertLocaleFile(file, type);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        outputStream.write(docs);
        FileOutputStream out = new FileOutputStream("D://test.pdf");
        outputStream.writeTo(out);
        outputStream.close();
        out.close();
        System.out.println("装换完成");
    } 

} 

4、文件默认的类型配置如下(应该也可以自定义吧)
image.png
注意默认的类型没有 docx 和 pptx 等类型,但可以使用 doc 和 ppt 替代,装换效果如下
image.png

示例代码

晓江/libreoffice_study