由于项目需要实现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博客

Logo

更多推荐