使用LibreOffice将office文档转pdf(java实现)
由于项目需要实现office文档在浏览器里预览,找了几种方案测试了一下,先采用的openoffice进行了测试,这个方案是在linux服务器上安装openOffice然后通过openOffice命令来转换pdf。在测试转换文档过程中频繁出现openoffice服务崩溃的现象,然后就弃用了。后来又看到java通过jacob来调用com组件实现转换的方案,但是只能在windows环境下使用,而我们线上
由于项目需要实现office文档在浏览器里预览,找了几种方案测试了一下,先采用的openoffice进行了测试,这个方案是在linux服务器上安装openOffice然后通过openOffice命令来转换pdf。在测试转换文档过程中频繁出现openoffice服务崩溃的现象,然后就弃用了。后来又看到java通过jacob来调用com组件实现转换的方案,但是只能在windows环境下使用,而我们线上环境都是linux环境,所以果断放弃,当然也有不少收费的商业产品方案。
最后在同事的推荐下,使用openoffice的升级版libreoffice进行了实现,效果还不错。
LibreOffice安装
我的服务端的环境是centos7和libreoffice5.3,安装步骤参考这遍文章
https://blog.csdn.net/weixin_50236329/article/details/119860056
下载字体
yum groupinstall "fonts"修改字符集
vim /etc/locale.conf
将LANG="en_US.UTF-8"修改成LANG="zh_CN.UTF-8"最后重启
reboot
安装完成后,输入命令soffice --version,会显示如下版本信息,如果提示没有soffice命令,需要增加环境变量,或者是安装的有问题。
java调用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileNotFoundException;
/**
* office文件转pdf工具类
*/
public class Office2PDFUtils {
private static final Logger log = LoggerFactory.getLogger(Office2PDFUtils.class);
/**
* 将office文档转成pdf文件
* @param sourcePath
* @param targetPath
* @throws Exception
*/
public static boolean word2pdf(String sourcePath, String targetPath) throws Exception {
if (!new File(sourcePath).exists()) {
throw new FileNotFoundException();
}
String command = String.format("soffice --convert-to pdf:writer_pdf_Export %s --outdir %s", sourcePath, targetPath);
boolean flag = executeCommand(command);
log.info("word2pdf: convert pdf complete. flag="+flag);
return flag;
}
/**
* 执行libreoffice的转换命令
* @param command
* @return
*/
public static boolean executeCommand(String command){
try {
long start = System.currentTimeMillis();
Process process = Runtime.getRuntime().exec(command);
// 返回值是子线程执行完毕的返回值,返回0表示正常结束
int exitStatus = process.waitFor();
log.info("executeCommand: convert pdf exitStatus= " + exitStatus);
// 销毁子进程
process.destroy();
long end = System.currentTimeMillis();
log.info("executeCommand: convert pdf cost time " + (end - start) + "ms");
return exitStatus == 0;
}catch (Exception e){
log.error("executeCommand: runtime exec error", e);
}
return false;
}
}
public static void main(String[] args) throws Exception { String source = "/Users/lucy/test/word-testV1.0.docx"; String target = "/Users/lucy/test/"; InputStream inputStream = Office2PDFUtils.word2pdf(source, target); }
总结
针对普通office文件的转换都还OK,但是有几个坑,第一个是需要转换的office文档如果文件名中包含的有空格会转换失败,需要转换的时候将空格处理掉;第二个是文档里如果有比较复杂的表格和visio元素会转换失败;后来又安装libreoffice7.2的版本测试了一下,能转换成功解决掉这些坑,但是转换的速度很慢,如果场景仅仅是后台去进行转换,对转换的时间没有要求,可以进行异步线程去处理转换,同步调用的话很可能会超时。如果公司或者项目有条件的话,可以去购买商业产品进行集成,省事节省时间,没有什么坑,有丰富的实践案例,
参考文章:【libreoffice】libreoffice实现office转pdf、html、jpg等格式数据_weixin_34032779的博客-CSDN博客
更多推荐
所有评论(0)