用java将word转pdf
钢翼
编程
一、使用场景:
一般我们需要自制打印报表的时候,用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){
}
}
}
}