# libreoffice_study
**Repository Path**: luochunhai/libreoffice_study
## Basic Information
- **Project Name**: libreoffice_study
- **Description**: libreoffice 将文件转为 pdf
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2024-12-05
- **Last Updated**: 2024-12-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 简介
LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示文稿、绘图文档、数学公式编辑、数据库管理等工作。
LibreOffice 支持各种文档格式。除了它原生支持的开放文档格式 (OpenDocument Format, ODF) 外,它还支持许多的非开放格式,比如微软的 Microsoft® Word, Excel, PowerPoint 以及 Publisher 的格式等。https://blog.csdn.net/weixin_45020617/article/details/129985431
## 安装
### windows
1、下载并安装 libreoffice
2、进入安装目录
```bash
D:\Program Files\LibreOffice\program
```
3、启动 LibreOffice,这样就运行在 8100 端口了
```bash
soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard
```
### Linux
1、下载
官方地址:https://zh-cn.libreoffice.org/download/libreoffice
2、将下载好的linux版本的文件上传至服务器的某个目录,然后解压文件
```bash
tar -zxvf LibreOffice_7.1.7_Linux_x86-64_rpm.tar.gz
```
3、上面的文件解压之后会产生一个RPMS文件,使用以下命令进入到RPMS目录并进行安装
```bash
cd /LibreOffice_7.1.7_Linux_x86-64_rpm/RPMSyum localinstall *.rpm
```
4、安装libreoffice-headless(安装这个东西,需要java环境,可以先安装一下java环境)
```bash
yum install libreoffice-headless
```
5、执行完上面的代码就安装成功了。可以输入libreoffice测试一下。
```bash
/opt/libreoffice7.1 --convert-to pdf:writer_pdf_Export /目录/文件名.pptx --outdir /目录/
```
## spring集成libreoffice
1、项目添加依赖
```xml
com.artofsolving
jodconverter
2.2.1
org.apache.commons
commons-lang3
3.7
```
2、创建工具类
```java
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、测试
```java
@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、文件默认的类型配置如下(应该也可以自定义吧)

注意默认的类型没有 docx 和 pptx 等类型,但可以使用 doc 和 ppt 替代,装换效果如下
