仿百度文库解决方案(二)——利用Jacob调用MS Office转换文档为PDF

目录

仿百度文库解决方案(一)——整体思路 html

仿百度文库解决方案(二)——利用Jacob调用MS Office转换文档为PDF 程序员

仿百度文库解决方案(三)——利用JCom调用MS Office或者Acrobat API转换文档为PDF 算法

仿百度文库解决方案(四)——利用JODConverter调用OpenOffice.org服务转换文档为PDF 编程

仿百度文库解决方案(五)——利用SWFTools转换PDF文档为SWF 服务器

仿百度文库解决方案(六)——利用FlexPaper显示Flash(SWF) 网络

 

Jacob简介

  Jacob是Java与COM组件桥接的缩写,即JAVA-COM Bridge。经过使用Jacob类库,咱们能够很方便地在Java程序中调用COM自动化组件。Jacob最初是由美国人Dan Alder在Inventure公司担任CTO时编写的,目的是为了方便众多的程序员在Java2虚拟机上,调用Win32平台上COM自动化服务器中的组件。当Jacob项目以开源的方式在网络上公布之后,愈来愈多的人开始参与项目的研发与改进中去。 数据结构

  Jacob类库中只有两个包:com.jacob.activex和com.jacob.com。com.jacob.activex包创建在com.jacob.com基础之上,主要包含了ActiveXComponent类。com.jacob.com中有一个很是基础的类JacobObject,该包中比较经常使用的两个类Dispatch和Variant即是继承自JacobObject。 app

  Dispatch类表明COM自动化组件中的对象,提供了访问COM对象的API。Dispatch类中经常使用的方法有: ui

  • call( )方法:调用COM对象的方法,返回Variant类型值。
  • invoke( )方法:和call方法做用相同,可是不返回值。
  • get( )方法:获取COM对象属性,返回variant类型值。
  • put( )方法:设置COM对象属性。

  ActiveXComponent类继承自Dispatch类,在内部封装了Dispatch对象,使用该类加载COM组件。 而且提供了访问COM组件对象的属性和方法的接口。ActiveXComponent类提供了比Dispatch类更方便的获取属性和设置属性的方法:getProperty( ),setProperty( )。 spa

  Variant类映射COM对象中的Variant数据结构,提供Java和COM的数据交互。其本质就是一种数据类型,能够被转换成任何数据类型,如int,String,甚至Dispatch对象。

MS Office COM 对象模型

  Microsoft Office2007以前的Office版本并无提供转换文档为PDF格式的支持,另外,Office2007还须要安装有Microsoft Save as PDF or XPS插件才支持PDF格式转换,而Office2010不须要安装插件则自带有转换Office文档为PDF格式的API。所以,建议使用Office 2010。

office2010自动集成PDF/XPS组件,主菜单下选择SaveAs,咱们能够在Saveastype下拉列表框中发现PDF,XPS的身影,也能够在Share子菜单下发现CreatePDF/XPSDocument。

  经过查询MSDN Office 2010开发人员手册,通过分析后得出图2-1所示的Office COM对象模型:

Office COM对象模型图2-1 Office COM对象模型

  Microsoft Office中每一个应用程序中都包含一个Application对象,可是每一个应用程序中的文档对象却不同,Word中Documents对象表明Word应用程序中全部打开的word文档集合,Document对象表明一篇word文档。详细的文档对象结构如图2-1所示。其中Document,Workbook,Presentation中的SaveAs或者ExportAsFixedFormat方法可用于将文档转换为PDF。

Jacob调用MS Office COM自动化组件转换Office文档为PDF

  算法流程图如2-2所示:

Jacob调用MS Office转换文档为PDF

图2-2 Jacob调用MS Office COM组件转换文档为PDF算法流程

  第一步,对于Office文档,不一样格式的文档须要加载不一样的COM组件,例如Word文件须要加载Word COM组件。Jacob中加载COM组件是利用ActiveXComponent类,例如,加载Word COM自动化组件:

//Word.Application表明COM OLE编程标识,可查询MSDN获得 ActiveXComponent app = new ActiveXComponent("Word.Application"); //设置Word不可见 app.setProperty("Visible",false);

  第二步,得到文档对象集合,Word中Documents对象表明Word应用程序中全部打开的Word文档,范例以下:

//调用Application对象的Documents属性,得到Documents对象 Dispatch docs = app.getProperty("Documents").toDispatch();

   第三步,打开文件,并执行转换。Word范例以下:

复制代码
Dispatch doc = Dispatch.call(docs, "Open",//调用Documents对象的Open方法 inputFile,// 输入文件路径全名 false, //ConfirmConversions,设置为false表示不显示转换框 true//ReadOnly );  Dispatch.call(doc,//要转换的文档 "SaveAS", pdfFile,//要保存的PDF文件名 wdFormatPDF//转换后的文件格式宏,值为17,可查询MSDN获得  );
复制代码

  第四步,关闭应用程序。Word范例:

//关闭打开的Word文件 Dispatch.call(doc, "Close", false//设置不保存改变); //关闭Word应用程序 app.invoke("Quit",0);

  转换Word文档为PDF格式的详细代码以下:

public static void word2PDF(String inputFile,String pdfFile){ //打开word应用程序 ActiveXComponent app = new ActiveXComponent("Word.Application"); //设置word不可见 app.setProperty("Visible", false); //得到word中全部打开的文档,返回Documents对象 Dispatch docs = app.getProperty("Documents").toDispatch(); //调用Documents对象中Open方法打开文档,并返回打开的文档对象Document Dispatch doc = Dispatch.call(docs, "Open", inputFile, false, true ).toDispatch(); //调用Document对象的SaveAs方法,将文档保存为pdf格式 /* Dispatch.call(doc, "SaveAs", pdfFile, wdFormatPDF //word保存为pdf格式宏,值为17 ); */ Dispatch.call(doc, "ExportAsFixedFormat", pdfFile, wdFormatPDF //word保存为pdf格式宏,值为17  ); //关闭文档 Dispatch.call(doc, "Close",false); //关闭word应用程序 app.invoke("Quit", 0); }
相关文章
相关标签/搜索