最近有个需求,就是要将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/
文章评论