DOC文档转PDF

最近项目中有用到Word文档转PDF的功能,做了一些尝试,也遇到了一些困难。 
下面把尝试的情况记录下来,也希望做过类似工作的童鞋能一起探讨一下。 

我尝试过的Word文档转PDF,用过两种方法: 
1、使用OpenOffice转PDF; 
2、使用MS Office的OLE自动化功能; 
OpenOffice的情况稍后补充,下面先说MS Office的转换情况。 

Office版本使用2007,因为2007提供了一个加载项:Microsoft Save as PDF 或 XPS,可将文档另存为PDF格式。下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=4D951911-3E7E-4AE6-B059-A2E79ED87041,安装即可使用。 

Office COM 组件调用使用jacob(Java COM Bridge) 
http://sourceforge.net/projects/jacob-project/ 
Jacob初次使用的人可能会感到比较困惑。题外话,jacob的API设计是有够别扭的,这儿就不多说了。下面说明一下: 

我们接触的jacob类主要就3个:ActiveXComponent、Variant、Dispatch; 
ActiveXComponent代表COM应用程序: 
 
初始化方法为: 
Java代码   收藏代码
  1. ActiveXComponent app = new ActiveXComponent("Word.Application");  

Variant 是与COM通讯的参数或者返回值; 
Dispatch代表一个可操作的自动化对象;如果确定返回值是自动化对象的话,可以调用Variant.toDispatch()转换成Dispatch。 
获取了Dispatch之后,即可调用该自动化对象的属性或方法,具体的属性和方法要看参考文档,比如:Word开发可在WORD帮助中查看“脱机开发人员帮助WORD对象模型”。 
Dispatch.get(dispatch, String name);获取对象属性; 
Dispatch.put(dispatch, String name, Object value);设置对象属性; 
Dispatch.call(dispatch, String name, Object… args);调用对象方法; 
以上都是Dispatch上的静态方法,所以需要传递dispatch本身。 

关于jacob-1.15-M4-x86.dll放置的位置,其实很简单,dll的放置位置就是系统参数 
Java代码   收藏代码
  1. System.getProperty("java.library.path");  
所指定的,放在路径里的任意一个目录即可,不想污染JDK目录或者windows/system32目录的话,放置项目启动目录下就可以了,Eclipse下我是放在项目目录下。 

下面看具体代码: 

Java代码   收藏代码
  1. public class Word2PDF {  
  2.   
  3. static final int wdDoNotSaveChanges = 0;// 不保存待定的更改。  
  4. static final int wdFormatPDF = 17;// PDF 格式  
  5.   
  6. public static void main(String[] args) {  
  7.   
  8.     String filename = "f:/temp/测试文档.docx";  
  9.     String toFilename = filename + ".pdf";  
  10.     System.out.println("启动Word...");  
  11.     long start = System.currentTimeMillis();  
  12.     ActiveXComponent app = null;  
  13.     try {  
  14.         app = new ActiveXComponent("Word.Application");  
  15.         app.setProperty("Visible"false);  
  16.   
  17.         Dispatch docs = app.getProperty("Documents").toDispatch();  
  18.         System.out.println("打开文档..." + filename);  
  19.         Dispatch doc = Dispatch.call(docs,//  
  20.                 "Open"//  
  21.                 filename,// FileName  
  22.                 false,// ConfirmConversions  
  23.                 true // ReadOnly  
  24.                 ).toDispatch();  
  25.   
  26.         System.out.println("转换文档到PDF..." + toFilename);  
  27.         File tofile = new File(toFilename);  
  28.         if (tofile.exists()) {  
  29.             tofile.delete();  
  30.         }  
  31.         Dispatch.call(doc,//  
  32.                 "SaveAs"//  
  33.                 toFilename, // FileName  
  34.                 wdFormatPDF);  
  35.   
  36.         Dispatch.call(doc, "Close"false);  
  37.         long end = System.currentTimeMillis();  
  38.         System.out.println("转换完成..用时:" + (end - start) + "ms.");  
  39.     } catch (Exception e) {  
  40.         System.out.println("========Error:文档转换失败:" + e.getMessage());  
  41.     } finally {  
  42.         if (app != null)  
  43.             app.invoke("Quit", wdDoNotSaveChanges);  
  44.     }  
  45. }  
  46. }  


已知的情况: 
1、转换效果好。(相对于OpenOffice) 
2、速度慢 
3、CPU占用率高 

待解决的问题: 
1、安全性问题:是否可禁用WORD宏,以及WORD文档中的ActiveX控件? 
这一点我不太清楚,但在WORD选项--安全性设置中看到的: 
 
2、微软知识库中的“服务器端 Office 自动化注意事项” 
http://support.microsoft.com/kb/257757/ 
文档似乎明确了 

Microsoft 目前建议不要从任何无人参与的、非交互式客户端应用程序或组件(包括 ASP、DCOM 和 NT Service)中进行 Microsoft Office 应用程序的“自动化”,也不为此提供支持,因为 Office 在这种环境中运行时可能会出现不稳定的现象并且/或者会死锁。 

转载地址:http://www.iteye.com/topic/1005741

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值