Linux系统下word转pdf,xls转pdf,ppt转pdf
word转换pdf的技术方案,供参考。【doc/docx/ppt/pptx/xls/xlsx均支持转换】
本方案是Java结合shell命令完成,不同于以往的仅依赖java组件转换或打印pdf的方案,需要目标服务器安装office套件,可选方案有OpenOffice和LibreOffice[二者源是一家产品],安装完office套件后,使用office提供的脚本完成转换。安装LibreOffice时,为避免复杂的依赖关系,建议采用yum方式安装:yum install libreoffice
脚本内容:soffice --headless --invisible --convert-to pdf 源office文档路径 --outdir 目录存储目录
需要将以上脚本编写成sh脚本的形式,其中源路径需要配置成参数,由Java程序调用sh脚本时传入,转换结束后,到指定的目录可取到同名的pdf文档,再进行与业务相关的逻辑处理。注:临时目录需要定期清理,防止存储过多临时文档,导致磁盘占满。
Java调用代码:
try {
String shpath = "/tmp/topdf.sh";//脚本路径,脚本中需要将源doc路径配置成变量,由下行程序调用时入参
String cmd = "param";//xshell脚本入参
Process ps = Runtime.getRuntime().exec(shpath,cmd);//
ps.waitFor();//等待转换结果
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String result = sb.toString();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
#!/bin/sh source=$1 echo ${source} soffice --headless --invisible --convert-to pdf ${source} --outdir /tmp/
但发现运行一段时间命令不再响应,没有文档结果。经检查服务器,libreoffice运行良好,但soffice --convert-to 命令就是无响应无输出。查看活跃线程如下:
有两个相关的活跃实例在运行。
经翻阅资料,这是LO在2011年产生的一个bug,相关bug list 参考:
https://bugs.documentfoundation.org/show_bug.cgi?id=37531
https://bugs.documentfoundation.org/show_bug.cgi?id=45026
大体意思是LO GUI实例一旦运行过一个,再运行一个实例的话,就会出现无响应的问题。解决思路有两个:
1、杀掉所有的libreoffice实例,即将上面的两个实例杀掉
2、执行命令时增加一行参数,经测试下面两条命令均可以执行【必须保证命令的执行要有权限】:
soffice --headless --convert-to pdf ${source-file} --outdir ${target-path} "-env:UserInstallation=file:///tmp/LibreOffice_Conversion_${USER}"
soffice --headless --convert-to pdf ${source-file} --outdir ${target-path} -env:UserInstallation=file:///home/user/.libreoffice-alt
程序员,除了编码,生活还应该有沉淀!
成长的乐趣,在于分享!
|