欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DOC文档转PDF OfficeMicrosoftITeye应用服务器ASP.net 

程序员文章站 2024-02-22 09:16:16
...
最近项目中有用到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应用程序:
DOC文档转PDF
            
    
    
        OfficeMicrosoftITeye应用服务器ASP.net 
初始化方法为:
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的放置位置就是系统参数
System.getProperty("java.library.path");
所指定的,放在路径里的任意一个目录即可,不想污染JDK目录或者windows/system32目录的话,放置项目启动目录下就可以了,Eclipse下我是放在项目目录下。

下面看具体代码:

public class Word2PDF {

static final int wdDoNotSaveChanges = 0;// 不保存待定的更改。
static final int wdFormatPDF = 17;// PDF 格式

public static void main(String[] args) {

	String filename = "f:/temp/测试文档.docx";
	String toFilename = filename + ".pdf";
	System.out.println("启动Word...");
	long start = System.currentTimeMillis();
	ActiveXComponent app = null;
	try {
		app = new ActiveXComponent("Word.Application");
		app.setProperty("Visible", false);

		Dispatch docs = app.getProperty("Documents").toDispatch();
		System.out.println("打开文档..." + filename);
		Dispatch doc = Dispatch.call(docs,//
				"Open", //
				filename,// FileName
				false,// ConfirmConversions
				true // ReadOnly
				).toDispatch();

		System.out.println("转换文档到PDF..." + toFilename);
		File tofile = new File(toFilename);
		if (tofile.exists()) {
			tofile.delete();
		}
		Dispatch.call(doc,//
				"SaveAs", //
				toFilename, // FileName
				wdFormatPDF);

		Dispatch.call(doc, "Close", false);
		long end = System.currentTimeMillis();
		System.out.println("转换完成..用时:" + (end - start) + "ms.");
	} catch (Exception e) {
		System.out.println("========Error:文档转换失败:" + e.getMessage());
	} finally {
		if (app != null)
			app.invoke("Quit", wdDoNotSaveChanges);
	}
}
}


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

待解决的问题:
1、安全性问题:是否可禁用WORD宏,以及WORD文档中的ActiveX控件?
这一点我不太清楚,但在WORD选项--安全性设置中看到的:
DOC文档转PDF
            
    
    
        OfficeMicrosoftITeye应用服务器ASP.net 
2、微软知识库中的“服务器端 Office 自动化注意事项”
http://support.microsoft.com/kb/257757/
文档似乎明确了
Microsoft 目前建议不要从任何无人参与的、非交互式客户端应用程序或组件(包括 ASP、DCOM 和 NT Service)中进行 Microsoft Office 应用程序的“自动化”,也不为此提供支持,因为 Office 在这种环境中运行时可能会出现不稳定的现象并且/或者会死锁。

因为我主要的用途就是用来服务器端自动转换。
待仔细研读。
  • DOC文档转PDF
            
    
    
        OfficeMicrosoftITeye应用服务器ASP.net 
  • 大小: 23.2 KB
  • DOC文档转PDF
            
    
    
        OfficeMicrosoftITeye应用服务器ASP.net 
  • 大小: 41.5 KB