用java将word转pdf

返回
Author Avatar
钢翼
2020-06-04
编程
100

一、使用场景:

一般我们需要自制打印报表的时候,用word做模板是最方便的,几乎所有电脑都有个office或wps,预览和微调模板都很方便。

由于常规的word是二进制格式,虽然通过书签或指定关键字也可以作为模板占位符,不过不直观。推荐还是通过word xml格式来作为模板,这样既可以通过word预览,又可以通过xml来引入Velocity模板引擎。

最后打印时,虽然可以通过调用office应用程序来进行打印,不过各个电脑可能装的office版本不同也可能装的是wps,适配麻烦,所以就需要将word转成pdf来进行打印了。

二、技术选型:

java将word转pdf主要有下面几种方式

    1.aspose,效果应该是最好最快的,不过商用的,用破解的没兴趣。

    2.通过中间格式转换 doc->html->pdf,poi+itext,转pdf用的itext,用的AGPL协议,这协议怎么说呢,传染性极高,颇为流氓。

    3.用docx4j,实际上转pdf调的另外一个服务来处理,你需要独立安装一个服务,而这个服务已经不提供下载了。。。

    4.用docx4j-export-fo,目前我就是用的这个,除了处理起来慢,其他还好。说是有字体问题,由于模板里没有什么冷门字体也就没遇到了。


三、实操:

添加Maven引用,如果只添加docx4j-export-fo会报jaxb的异常,理论上可以用其他jaxb包代替,不知道速度能不能提升。

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-export-fo</artifactId>
    <version>8.2.0</version>
</dependency>

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
    <version>8.2.0</version>
</dependency>

封装公共方法

 public static boolean word2pdf(String docxPath ,String pdfPath)  {
     FileOutputStream os = null;
     try {
        os = new FileOutputStream(new File(pdfPath));
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(docxPath));       
        Docx4J.toPDF(wordMLPackage, os);
        return true;
    }catch (Exception e){
        log.error("word转换pdf出错",e);
        return false;
    }finally {
        if(os!=null){
            try {
                os.close();
            }catch (IOException e){
            }
        }
    }
}