java 利用openOffice实现word ppt 等资源转化为pdf文件

网上有很多教程,但是很多坑,比如jobconvert2.2.1无法转pptx等格式的文件 而jobconvert2.2.2可以  但是maven仓库又没有  对于公司开发  这是个问题 毕竟公司的仓库不能让你随意操作。

  由于公司使用的springboot 上网搜索了一下有相关的jar包  这就比较好办了  但是也有一些坑   下面是我的工作实践总结:

  1

  首先下载openoffice(外网下载很慢):http://www.openoffice.org/download/index.html

  对于window版本 可以直接百度然后在国内网站下载 比较快  对于linux版本的可以在服务器用wget指令下载  这样比较快

  我的版本是:Apache_OpenOffice_4.1.6_Linux_x86-64_install-rpm_zh-CN.tar.gz

 2 下载相应jar包

        <!--ppt转换为pdf word转换为pdf-->

        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-spring-boot-starter</artifactId>
            <version>4.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-core</artifactId>
            <version>4.2.2</version>
        </dependency>
        <!--jodconverter 本地支持包 -->
        <!-- https://mvnrepository.com/artifact/org.jodconverter/jodconverter-local -->
        <dependency>
            <groupId>org.jodconverter</groupId>
            <artifactId>jodconverter-local</artifactId>
            <version>4.2.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

 3  相信对于springboot有了解的应该知道  **--start 这种jar包一般都有自动配置  这个jar包也是有自动配置的 当我们配置了 相应的openOffice 相关配置

jodconverter:
  local:
    port-numbers: 8100
    enabled: true

 4 启动openOffice

启动OpenOffice服务 

windows下
  OpenOffice 4的program目录下cmd
  ./soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard 

linux下:

  cd /opt/openoffice4/program 

  soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &

注:window 安装完program目录一般在:C:\Program Files (x86)\OpenOffice 4\program

5  注入工具类  转换

   @Autowired
    private Converter converter;

 
   //转换

   converter.rconvert(sourceFile).to(tartgetFile).execute()

由于自动配置就注入了一个工具类  我们可以直接在自己代码中注入这个类实现转码工作 

但是这个前提是 我们在本地安装了openOffice 并且已经启用了 启用的端口为配置的端口   不然就会注入失败 

 由于笔者是公司合作开发  当其他同事拉取我的代码后 由于本地没有这个程序  所以注入会失败  然后导致项目启动不了  所以笔者没有采用这种方式  而且这种方式很死  无法控制openOffice的开关

方式二

     我们不用它自动注入的converter  我们自己配置相应的属性 然后自己new一个转换器实现转换功能

 1

  首先在配置文件配置相应的配置  名字随意  自己能找到就行

officeconverter:
  local:
    #office-home: /opt/openoffice4/
    office-home: C:\Program Files (x86)\OpenOffice 4
    ports: 8100

2 在执行需要转码的处理器时才new一个转换器  (这个转换器应该时单例的  不应该new多个) 所以我写了一个工具类

public class OpenOfficeConvert {


    private static OfficeManager officeManager;
    private  OpenOfficeConvert(){

    }
    public static void initOfficeMnnager(int [] ports,String officeHome){

        if(officeManager!=null){
            return;
        }
        if(ports==null||ports.length==0||officeHome==null||officeHome.equals("")){
            throw  new BusinessException("参数未配置");
        }
        officeManager= LocalOfficeManager.builder().portNumbers(ports).officeHome(officeHome).build();

    }

    public  static  void  convert(File sourceFile,File tartgetFile) throws OfficeException {

        if(officeManager==null){

            throw  new BusinessException("未初始化转换器,请先初始化");
        }
        if(!officeManager.isRunning()){
            officeManager.start();
        }
        LocalConverter make = LocalConverter.make(officeManager);

        make.convert(sourceFile).to(tartgetFile).execute();

        //officeManager.stop();
    }
    public  static  void  stopProcess() throws OfficeException {

        if(officeManager!=null){
            officeManager.stop();
        }

    }

}

3 使用工具类 转换文件  在需要转换文件的处理器哪里 我们首先初始化转化器  然后就可以转化了

   int [] ports=environment.getProperty("officeconverter.local.ports",int[].class);
                String  officeHome=environment.getProperty("officeconverter.local.office-home");

            try {
                OpenOfficeConvert.initOfficeMnnager(ports,officeHome);
                OpenOfficeConvert.convert(toFile,pdfFile);
            } catch (OfficeException e) {

                e.printStackTrace();
                throw  new BusinessException("转换文件出错");
            }

上面的 ports 和officeHome为我们在配置文件中填写的  这样相当于告诉程序  我们的程序openOffice 安装在哪里 我们希望它运行的端口   初始化的时候   先检测这个端口的openOffice 服务是否已经启动  若没有启动  那么程序会自动启动  (这样不需要我们手动启动openOffice服务了)

方式二比较灵活

  

发布了3 篇原创文章 · 获赞 0 · 访问量 60

猜你喜欢

转载自blog.csdn.net/qq_41082092/article/details/104969669