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

相关推荐
indexsunny2 小时前
互联网大厂Java面试实战:音视频场景中的Spring Boot与Kafka技术问答
java·spring boot·redis·面试·kafka·spring security·互联网大厂
岁岁种桃花儿2 小时前
Spring Boot @GetMapping注解:从应用到原理深度解析
java·spring boot·后端
颜淡慕潇2 小时前
Spring Boot 3.x 升级实战:3.0 → 3.5:为什么升、升什么、以及我们是怎么升的
java·spring boot·后端
J_liaty11 小时前
Spring Boot拦截器与过滤器深度解析
java·spring boot·后端·interceptor·filter
lpfasd12312 小时前
Spring Boot 4.0.1 时变更清单
java·spring boot·后端
千寻技术帮17 小时前
10341_基于Springboot的珠宝销售网站
spring boot·mysql·毕业设计·商城·珠宝商城
一只叫煤球的猫18 小时前
为什么Java里面,Service 层不直接返回 Result 对象?
java·spring boot·面试
小当家.10519 小时前
从零构建项目认知:如何画出一张合格的系统架构图(以供应链系统为例)
java·spring boot·学习·架构·系统架构·供应链·实习
悟能不能悟19 小时前
springboot如何通过url地址获得这个地址的文件
java·spring boot·后端