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

相关推荐
学长毕设6 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号8 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
字节探索11 小时前
Spring Boot 接口幂等性设计:从唯一索引到 Redis+Lua 的工程实践
java·spring boot
胡写代码11 小时前
删掉的数据还占着唯一键:逻辑删除 + 唯一索引的四次取舍
spring boot·后端
captain37613 小时前
Spring MVC(4)-响应
java·spring boot·后端
Metaphor69216 小时前
使用 Python 在 Word 文档中添加、修改和删除变量
python·word
指针向南17 小时前
PDF 转 HTML 免费5种方法,体积0.5%到368%
图像处理·人工智能·计算机视觉·pdf
CoderYanger17 小时前
Java EE 进阶:5. Spring IoC&DI(第二弹):Spring IoC
java·开发语言·spring boot·spring·面试·职场和发展·java-ee
aiks_yuan17 小时前
Spring Boot 4 注入 ObjectMapper 报找不到 Bean:升级 Jackson 3 的改法和过渡方案(4.1.2 实测)
spring boot