使用LibreOffice将office文档转pdf和jpg图片封面的java实现

2022-06-02 1202点热度 0人点赞 0条评论

最近有个需求,就是要将Office文档能在网页上预览展现,之前知道金山WPS Office是有开放API可以对接并显示,不过是要收费的。

经过一番调查,发现一个方法,我们知道PDF是可以在浏览器里直接显示的,所以只要想办法能把Office文档(doc、docx、xlsx、xlsx、ppt、pptx)转成PDF即可,而通过查找,LibreOffice(免费-属于OpenOffice)就可以实现将Office文档转成pdf(也可以将Office文档转成jpg等图片,作为封面时候)

实现思路

安装完了LibreOffice后,可以使用LibreOffice的soffice命令行将需要的文档进行转换。

安装比较简单,去https://www.libreoffice.org/download/download/下载对应的安装包(Windows、Linux、MacOS都有的)Linux下载下来的rpm压缩包解压后(tar zxvf LibreOffice_7.3.3.2_Linux_x86-64_rpm.tar.gz),使用rpm -ivh RPMS/*.rpm 即可完成安装。

转换命令如下:

我们假设是Linux环境并安装了LibreOffice7.3,soffice的完整路径是:/opt/libreoffice7.3/program/soffice

# 查看soffice的版本号
/opt/libreoffice7.3/program/soffice --version

# 示例命令1:将/opt/test.doc转成pdf,输出路径是/opt 完成后,会在输出路径下生成名字一样后缀不一样文件:/opt/test.pdf
/opt/libreoffice7.3/program/soffice --headless --invisible --convert-to pdf:writer_pdf_Export /opt/test.doc --outdir /opt/

# 示例命令2: 将some.doc的第一页转成jpg(当然也可以是png)输出到/opt/some.jpg
/opt/libreoffice7.3/program/soffice --headless --invisible --convert-to jpg:writer_jpg_Export /opt/some.doc --outdir /opt/

# 示例命令3:查看soffice的详细说明、使用方法
/opt/libreoffice7.3/program/soffice --help

Java实现

以上是命令行下的转换方式,如果要让程序自动运行,就要整合到程序下调用,Java可以使用调用外部命令的方式来实现。详见:https://blog.terrynow.com/2020/12/28/java-exec-linux-command/

这里写个示例如下:

/**
 * 将office文档转成pdf文件
 * @param sourcePath 需要转换的源文件路径(带上文件以及后缀名)
 * @param targetDir 转换后的文件保存的路径(只要文件夹)
 */
public static void office2pdf(String sourcePath, String targetDir) {
    // TODO soffice的路径要根据实际情况做修改,最好来自配置文件
    String command = String.format("/opt/libreoffice7.3/program/soffice --headless --invisible --convert-to pdf:writer_pdf_Export %s --outdir %s", sourcePath, targetDir);
    String executeCommandResult = executeCommand(command);
    // TODO 转换后的输出,可以根据需要做判断,输出可能是如下(可以自行测试)
    // convert /opt/test.doc -> /opt/test.pdf using filter : writer_pdf_Export

    System.out.println("office2pdf covert complete, result: "+executeCommandResult);
}

/**
 * 将office文档转成pdf文件
 * @param sourcePath 需要转换的源文件路径(带上文件以及后缀名)
 * @param targetDir 转换后的文件保存的路径(只要文件夹)
 */
public static void office2jpg(String sourcePath, String targetDir) {
    // TODO soffice的路径要根据实际情况做修改,最好来自配置文件
    String command = String.format("/opt/libreoffice7.3/program/soffice --headless --invisible --convert-to jpg:writer_jpg_Export %s --outdir %s", sourcePath, targetDir);
    String executeCommandResult = executeCommand(command);
    // TODO 转换后的输出,可以根据需要做判断,输出可能是如下(可以自行测试)
    // convert /opt/test.doc -> /opt/test.jpg using filter : writer_jpg_Export

    System.out.println("office2jpg covert complete, result: "+executeCommandResult);
}

/**
 * Java执行外部命令,这里我把错误输出流和正常的输出流都统一作为string输出了
 */
private static String executeCommand(String command) {
    StringBuilder sb = new StringBuilder();
    try {
        Process proc = Runtime.getRuntime().exec(command);
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
        // Read the output from the command
        String s = null;
        while ((s = stdInput.readLine()) != null) {
            sb.append(s).append("\n");
        }
        // Read any errors from the attempted command
        while ((s = stdError.readLine()) != null) {
            sb.append(s).append("\n");
        }
    } catch (Exception e) {
        sb.append(e.getMessage());
    }
    return sb.toString();
}

PS: 如果转换后遇到中文乱码问题,详见:https://blog.terrynow.com/2022/06/22/linux-libre-office-soffice-convert-to-image-or-pdf-gibberish-sovled/

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论