zoukankan      html  css  js  c++  java
  • 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调用代码:

     

    Java代码  收藏代码
    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(" ");  
    12.             }  
    13.             String result = sb.toString();  
    14.             System.out.println(result);  
    15.         } catch (Exception e) {  
    16.             e.printStackTrace();  
    17.         }  
     

     

    Shell脚本代码  收藏代码
    1. #!/bin/sh    
    2.     
    3. source=$1  
    4. echo ${source}   
    5. 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     

     

     

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

    成长的乐趣,在于分享!
    大龄程序员,一路走来,感慨颇多。闲暇时写写字,希望能给同行人一点帮助。
    本文版权归作者growithus和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    海涛老师的面试题作业12打印从1到最大的n位数
    海涛老师的面试题作业28字符串的排列组合问题。
    二叉堆 算法基础篇(一)
    海涛老师的面试题作业5从尾到头打印链表
    关于C++访问控制的理解
    关于STL优先级队列的一些应用
    海涛老师的面试题作业27二叉搜索树与双向链表
    编程之美快速找出满足条件的两个数课后题
    Effective C++ C++虚函数默认参数机制
    变位词程序的设计与实现编程珠玑第二章读后感
  • 原文地址:https://www.cnblogs.com/growithus/p/11012215.html
Copyright © 2011-2022 走看看