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调用代码:

      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("
    ");
                }
                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     

     

     

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

     

     
    成长的乐趣,在于分享!
    大龄程序员,一路走来,感慨颇多。闲暇时写写字,希望能给同行人一点帮助。
    本文版权归作者growithus和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【转】java对File.listFiles()排序
    java 获取当前目录文件名
    python批量创建文件夹
    [好课推荐]数据结构与算法python实现
    SCI论文重复率与降重
    [转]一图搞定Matplotlib
    [GitHub寻宝]机器学习实战python3代码分享
    [好课推荐]人工智能实践:Tensorflow2.0
    [转]用深度学习给黑白照片上色
    java split函数分割字符串
  • 原文地址:https://www.cnblogs.com/growithus/p/11012216.html
Copyright © 2011-2022 走看看