文件格式转换神器 unoconv !!!
一、Unoconv简介
- unoconv是一个基于LibreOffice / Openoffice开发的命令行工具。
- 可以将不同格式的文件(如DOC、PPT、PDF等)在不同的操作系统上通过Libreoffice / Openoffice转换为PDF、DOC、PNG、PPTX等格式。
- 支持在命令行中指定输出文件名称、格式等功能。
官方文档:http://dag.wiee.rs/home-made/unoconv/
Github地址:https://github.com/unoconv/unoconv
二、环境安装
unoconv 依赖
LibreOffice
和Python
环境,LibreOffice安装包中包含了一个Python解释器。
2.1 Linux安装LibreOffice
- 卸载已有的:
yum remove libreoffice*
- 下载:https://www.libreoffice.org/download/download/
这里选择的是:libreoffice7.6.6.3
其他版本:https://downloadarchive.documentfoundation.org/libreoffice/old/
- 解压:
tar -zxvf LibreOffice_7.6.6_Linux_x86-64_rpm.tar.gz
- 安装:
cd LibreOffice_7.6.6.3_Linux_x86-64_rpm/RPMS && yum localinstall *.rpm
- 验证:
ll /usr/bin | grep libre libreoffice7.6 --version
2.2 Windows安装LibreOffice
-
下载地址:https://downloadarchive.documentfoundation.org/libreoffice/old/7.6.6.3/win/x86_64/
-
安装:
没什么要注意的,一直下一步就可以了,默认安装到C盘。 -
配置系统环境变量:
C:\Program Files\LibreOffice\program
-
验证:
soffice --version
三、安装unoconv
3.1 Linux安装unoconv
- 下载:https://github.com/unoconv/unoconv/archive/refs/tags/0.8.2.tar.gz
- 解压
tar -zxvf /data0/unoconv-0.8.2.tar.gz
- 创建软连接(使用绝对路径)
ln -s /data0/unoconv-0.8.2/unoconv /usr/bin/unoconv
- 验证
ll /usr/bin | grep unoconv unoconv --version
- 安装中文字体库(解决中文乱码问题)
可参考这篇文章:https://blog.csdn.net/Ls66666Ls/article/details/119875353
3.2 Windows安装unoconv
-
下载:https://github.com/unoconv/unoconv/archive/refs/tags/0.8.2.zip
-
解压
-
在
C:\Windows
下创建可执行文件unoconv.bat
文件内容如下:@echo off python D:\Develop\Environment\unoconv-0.8.2\unoconv %*
这里解释一下:
- @echo off 是为了防止显示命令。
- python D:\Develop\Environment\unoconv-0.8.2\unoconv %* 用于执行unoconv命令。
- %* 是一个占位符,用来传递你在命令行中输入的所有参数。
-
验证:
1)查询版本信息:
unoconv --version
2)文件转换:unoconv -f [目标格式] [目标文件名] [原文件名]
四、Java使用unoconv完成文件格式转换
/**
* 利用unoconv进行文件格式转换
*
* @param sourceFilePath 源文件全路径
* @param format 转换类型(例: pdf、docx、pptx等)
* @author sunhaonan 2023/12/11 14:40
*/
private static void convert(String sourceFilePath, String format)
throws IOException, InterruptedException {
if (!FileUtil.exist(sourceFilePath)) {
throw new ServiceException("Source file not exist");
}
// -f [输出格式]
// -o [输出文件名] [输入文件名] (默认输出文件名 = 原文件名)
ProcessBuilder builder = new ProcessBuilder(buildCommand(), "-f", format, sourceFilePath);
log.info(String.join(" ", builder.command()));
Process process = builder.start();
boolean complated = process.waitFor(30, TimeUnit.SECONDS);
if (!complated) {
// 如果超时,强制终止子进程
process.destroyForcibly();
throw new ServiceException("unoconv命令超时,已强制终止子进程~");
}
}
private static String buildCommand() {
// Windows环境需要指定unoconv.bat绝对路径
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
return "C:/Windows/unoconv.bat";
}
return "unoconv";
}
五、问题记录
5.1 unoconv 版本太低导致 pptx转pdf失败
报错信息:
...
/usr/lib/libreoffice/program/libuno_cppu.so.3(+0x99c4)[0x7f201960c9c4]
/usr/lib/libreoffice/program/libuno_sal.so.3(+0x44b68)[0x7f201ade6b68]
/lib/x86_64-linux-gnu/libc.so.6(+0x94b43)[0x7f201ac02b43]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x44)[0x7f201ac93bb4]
unoconv: RuntimeException during import phase:
Office probably died. Binary URP bridge disposed during call ./binaryurp/source/bridge.cxx:613
Traceback (most recent call last):
File "/usr/bin/unoconv", line 1285, in <module>
die(exitcode)
File "/usr/bin/unoconv", line 1138, in die
if convertor.desktop.getCurrentFrame():
uno.com.sun.star.lang.DisposedException: Binary URP bridge already disposed
报错原因:unoconv 0.6版本遗留问题
解决办法:升级版本
参考链接:https://forum.cloudron.io/topic/10047/pptx-to-pdf-fails?lang=zh-CN