网上查询了许许多多的博客,说利用 poi、iText、Jsoup、jdoctopdf、使用 jodconverter 来调用 openOffice 的服务来转换等等,我尝试了很多种,但要么显示不完全,要么可是可能有问题,使用这个 jacob 的方法我最开始是最不想用的,因为它要导入 dll 文件,但最后我还是选择了使用该方法,原因是感觉转换后的 pdf 文件简直就是完美。
jacob 缺点:需要 window 环境,而且速度是最慢的需要安装 msofficeWord 以及 SaveAsPDFandXPS.exe ( word 的一个插件,用来把 word 转化为 pdf ,本次未安装测试通过)
插入正题:
SaveAsPDFandXPS 下载地址: http://www.microsoft.com/zh-cn/download/details.aspx?id=7
jacob 包下载地址: http://sourceforge.net/projects/jacob-project/
下载 jacob 解压后存放路径:
jacob.jar 放在 E:\jdk1.8.0\jre\lib\ext 目录下
jacob.dll 放在 E:\jdk1.8.0\jre\bin 目录下
实现代码如下:
1 package com.jd.poi.test; 2 3 import java.io.File; 4 5 import com.jacob.activeX.ActiveXComponent; 6 import com.jacob.com.ComThread; 7 import com.jacob.com.Dispatch; 8 import com.jacob.com.Variant; 9 10 /** 11 * 效果最好的一种方法,但是需要 window 环境,而且速度是最慢的需要安装 msofficeWord 以及 SaveAsPDFandXPS.exe ( 12 * word 的一个插件,用来把 word 转化为 pdf,可以不用安装,本次未安装测试通过 ) 13 * 14 * SaveAsPDFandXPS 15 * 下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=7 16 * jacob 包下载地址:http://sourceforge.net/projects/jacob-project/ 17 * 18 * jacob.jar 放在 E:\jdk1.5.0_14\jre\lib\ext 19 * jacob.dll 放在 E:\jdk1.5.0_14\jre\bin 20 * 21 * @author u Y 22 * 23 */ 24 public class WordToPdf { 25 26 private static final int wdFormatPDF = 17; // PDF 格式 27 28 public void wordToPDF(String sfileName, String toFileName) { 29 30 System.out.println("启动 Word..."); 31 long start = System.currentTimeMillis(); 32 ActiveXComponent app = null; 33 Dispatch doc = null; 34 try { 35 app = new ActiveXComponent("Word.Application"); 36 app.setProperty("Visible", new Variant(false)); 37 Dispatch docs = app.getProperty("Documents").toDispatch(); 38 doc = Dispatch.call(docs, "Open", sfileName).toDispatch(); 39 System.out.println("打开文档..." + sfileName); 40 System.out.println("转换文档到 PDF..." + toFileName); 41 File tofile = new File(toFileName); 42 if (tofile.exists()) { 43 tofile.delete(); 44 } 45 Dispatch.call(doc, "SaveAs", toFileName, // FileName 46 wdFormatPDF); 47 long end = System.currentTimeMillis(); 48 System.out.println("转换完成..用时:" + (end - start) + "ms."); 49 50 } catch (Exception e) { 51 System.out.println("========Error:文档转换失败:" + e.getMessage()); 52 } finally { 53 Dispatch.call(doc, "Close", false); 54 System.out.println("关闭文档"); 55 if (app != null) 56 app.invoke("Quit", new Variant[] {}); 57 } 58 // 如果没有这句话,winword.exe进程将不会关闭 59 ComThread.Release(); 60 } 61 62 public static void main(String[] args) { 63 WordToPdf d = new WordToPdf(); 64 d.wordToPDF("E:\\aaa\\Spring.doc", "E:\\aaa\\Spring.pdf"); 65 } 66 67 }
本次博主的测试并没有安装 SaveAsPDFandXPS.exe 但最后也是完全转换成功,具体原因不明,转换后如图所示,图片和字体均为发现异常:
如果出现如下错误,可以尝试安装 SaveAsPDFandXPS.exe 后在尝试:
最后,感谢两位博主的教程分享,有了你们的铺路,我们才会更加轻易的找到资源,吃水不忘挖井人。
博主1:http://zgzdlm.iteye.com/blog/1558877
博主2:http://feifei.im/archives/93