Spring Boot 项目实现Word转PDF

一、简介

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 路径即可。

相关推荐
AI刀刀6 小时前
手机AI怎么导出pdf
人工智能·ai·智能手机·pdf·deepseek·ds随心转
流觞 无依6 小时前
Spring Boot 未授权访问漏洞排查与修复指南
java·spring boot·后端
ONLYOFFICE6 小时前
如何将 Word 集成到 Web 应用程序? 5 种方法详解与对比
前端·word·onlyoffice
Java开发的小李6 小时前
SpringBoot 高流量高并发 基础全面讲解
java·spring boot·后端·性能优化
eastyuxiao6 小时前
OpenClaw 免费 PDF 技能组合 + 一键指令(零收费、无订阅)
pdf
极创信息7 小时前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
一个心烑7 小时前
Layui结合springboot读取返回值,前端展示简单示例
前端·spring boot·layui
郝开7 小时前
Spring Cloud Gateway 3.5.14 使用手册
java·数据库·spring boot·gateway
eastyuxiao7 小时前
OpenClaw的PDF处理Skill收费吗?
人工智能·pdf
Tdsay_7 小时前
PDF 加水印怎么做?一次真实使用在线工具的体验分享(免费、本地处理)
pdf·pdf加水印·土豆丝在线工具