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