一、简介
LibreOffice 是一款免费、开源、跨平台的办公套件(Office Suite),由 LibreOffice 基金会维护,对标微软 Office(Word/Excel/PowerPoint 等),支持 Windows、macOS、Linux 等主流操作系统,核心目标是提供无版权限制、功能完整的办公解决方案。完美支持微软 Office 格式(.docx/.xlsx/.pptx),也支持开源格式(.odt/.ods/.odp)和通用格式(PDF)。
二、应用场景
1.普通办公:替代微软 Office 完成日常文档 / 表格 / 幻灯片编辑,无版权风险;
2.自动化文件转换:就是你代码中的场景,批量将 docx/xlsx/pptx 转换为 PDF(最常用),或反向转换;
3.服务器端文档处理:Web 系统中,用户上传 Word 文档,后台自动转换为 PDF 供下载;
4.批量生成文档:结合模板,通过宏 / 命令行批量生成合同、报表等标准化文档;
5.跨平台办公:Linux 服务器 / 桌面端无微软 Office 时,用 LibreOffice 完成办公需求。
三、LibreOffice 核心组件

四、安装LibreOffice
1.准备几个安装包

2.安装如下命令安装即可
java
tar -xvf LibreOffice_25.2.4.3_Linux_x86-64_rpm.tar.gz
cd LibreOffice_25.2.4.3_Linux_x86-64_rpm/RPMS/
sudo rpm -ivh *.rpm
依次安装其他安装包
3.如果出现问题,可以升级一下当前环境的libxslt
java
libxslt在 C/C++ 程序中调用 XSLT 转换功能的底层库,性能高效、跨平台,是处理 XML 转换的工业级标准库。
yum install libxslt
五、项目中如何调用
代码示例
1.创建2个目录
java
inputFilePath 源文件目录
File fileFolder = new File(fileFolderPath);
outDir 转化之后的文件目录
File fileFolder = new File(fileFolderPath);
2.核心命令格式
java
# 基础格式:soffice --headless [操作参数] [输入文件] [输出参数]
String cmdStr = path(soffice所在的安装目录) + soffice --headless --convert-to pdf inputFilePath --outdir outDir
--headless:开启无头模式(必加,否则会弹出图形界面);
--convert-to [格式]:指定转换目标格式(如 pdf/xlsx/docx);
--outdir [路径]:指定输出目录;
--invisible:可选,增强无头模式(避免意外弹出窗口);
-env:UserInstallation=file:///tmp/lo_temp:可选,解决多线程 / 多进程调用时的冲突。
3.创建进程执行指定的可执行程序
java
Process process = Runtime.getRuntime().exec(command);
// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
boolean exited = process.waitFor(5, TimeUnit.MINUTES);
if (exited) {
exitStatus = process.exitValue();
// 下面两个可以获取输入输出流
printMessage(process.getErrorStream(), true);
printMessage(process.getInputStream(), false);
}
操作系统给每个进程的输出缓冲区(stdout/stderr)是有大小限制的(比如几 KB)。
如果 LibreOffice 执行时输出了内容,但你的 Java 程序没有读取这些内容,缓冲区会被占满,LibreOffice 进程会被阻塞,无法继续执行
private void printMessage(final InputStream input, boolean error) {
try {
InputStreamReader isr = new InputStreamReader(input, "utf-8");
BufferedReader br = new BufferedReader(isr);
String info;
while ((info = br.readLine()) != null) {
if (error) {
//这里不用做任何操作
log.error(info);
} else {
//这里不用做任何操作
log.info(info);
}
}
} catch (Exception e) {
log.error("ETechHelp.printMessage is fail", e);
}
}
读取的是进程的错误输出 process.getErrorStream()
读取的是进程的正常输出 process.getInputStream()
这套方案可直接集成到你的 Spring Boot 项目中,只需根据实际环境调整 application.yml 中的 LibreOffice 路径即可。