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 目录存储目录
Linux系统下word转pdf,xls转pdf,ppt转pdf
 
需要将以上脚本编写成sh脚本的形式,其中源路径需要配置成参数,由Java程序调用sh脚本时传入,转换结束后,到指定的目录可取到同名的pdf文档,再进行与业务相关的逻辑处理。注:临时目录需要定期清理,防止存储过多临时文档,导致磁盘占满。

Java调用代码:

 

Java代码  Linux系统下word转pdf,xls转pdf,ppt转pdf
  1.   try {  
  2.             String shpath = "/tmp/topdf.sh";//脚本路径,脚本中需要将源doc路径配置成变量,由下行程序调用时入参  
  3. String cmd = "param";//xshell脚本入参  
  4.             Process ps = Runtime.getRuntime().exec(shpath,cmd);//  
  5.             ps.waitFor();//等待转换结果  
  6.   
  7.             BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));  
  8.             StringBuffer sb = new StringBuffer();  
  9.             String line;  
  10.             while ((line = br.readLine()) != null) {  
  11.                 sb.append(line).append("\n");  
  12.             }  
  13.             String result = sb.toString();  
  14.             System.out.println(result);  
  15.         } catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }  
 

 

Shell脚本代码  Linux系统下word转pdf,xls转pdf,ppt转pdf
  1. #!/bin/sh    
  2.     
  3. source=$1  
  4. echo ${source}   
  5. soffice --headless --invisible --convert-to pdf ${source} --outdir /tmp/  
 

 

但发现运行一段时间命令不再响应,没有文档结果。经检查服务器,libreoffice运行良好,但soffice --convert-to 命令就是无响应无输出。查看活跃线程如下:

 

Linux系统下word转pdf,xls转pdf,ppt转pdf
 

有两个相关的活跃实例在运行。

 

经翻阅资料,这是LO在2011年产生的一个bug,相关bug list 参考:

https://bugs.documentfoundation.org/show_bug.cgi?id=37531 

 

https://bugs.documentfoundation.org/show_bug.cgi?id=45026     


Linux系统下word转pdf,xls转pdf,ppt转pdf

 

大体意思是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     

 

Linux系统下word转pdf,xls转pdf,ppt转pdf

 

程序员,除了编码,生活还应该有沉淀!