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

相关推荐
猫头虎14 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
MZ_ZXD00117 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
invicinble17 小时前
springboot的核心实现机制原理
java·spring boot·后端
space621232717 小时前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
金牌归来发现妻女流落街头19 小时前
【从SpringBoot到SpringCloud】
java·spring boot·spring cloud
皮卡丘不断更19 小时前
手搓本地 RAG:我用 Python 和 Spring Boot 给 AI 装上了“实时代码监控”
人工智能·spring boot·python·ai编程
lucky670719 小时前
Spring Boot集成Kafka:最佳实践与详细指南
spring boot·kafka·linq
Coder_Boy_20 小时前
基于Spring AI的分布式在线考试系统-事件处理架构实现方案
人工智能·spring boot·分布式·spring
毕设源码-钟学长21 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
Java水解1 天前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端