利用JCom调用MSOffice或者AcrobatAPI转.doc_第1页
利用JCom调用MSOffice或者AcrobatAPI转.doc_第2页
利用JCom调用MSOffice或者AcrobatAPI转.doc_第3页
利用JCom调用MSOffice或者AcrobatAPI转.doc_第4页
利用JCom调用MSOffice或者AcrobatAPI转.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

当下国内外文档分享平台成为热门应用,其中文档在线浏览几乎成为文档分享平台必备功能,本文针对类似百度文库的多种文档在线浏览技术提出了三种解决方案。文档在线浏览本质上是将多种可在线预览文档转换成Flash(SWF)格式,再通过Flash Player播放器播放SWF文件。Flexpaper是一个开源的在线文档显示组件,可以播放SWF文件。因此,下面先分析如何将文档转换为SWF。 SWFTools是一种与Adobe Flash(swf)文件工作的实用工具包,主要包括用于读取、编译以及生成swf文件的程序。 其中,PDF2SWF工具,可以将PDF文件转换成SWF文件。那么只需要将文档转换成PDF,再利用PDF2SWF转换PDF为SWF则解决问题。 转换常用Office文档为PDF格式,目前主要有三种方案:利用Jacob或者JCom调用MS Office或者WPS Office API,利用JODConverter调用OpenO服务,调用虚拟打印机转换文档为PDF。由于笔者目前没有实现Java下调用虚拟打印打印文件为PDF格式的方法,因此在这里不做介绍。图1-1显示了笔者实现的三种方案:图1-1 文档转换总体方案Jacob简介Jacob是Java与COM组件桥接的缩写,即JAVA-COM Bridge。通过使用Jacob类库,我们可以很方便地在Java程序中调用COM自动化组件。Jacob最初是由美国人Dan Alder在Inventure公司担任CTO时编写的,目的是为了方便众多的程序员在Java2虚拟机上,调用Win32平台上COM自动化服务器中的组件。当Jacob项目以开源的方式在网络上公布以后,越来越多的人开始参与项目的研发与改进中去。Jacob类库中只有两个包:com.jacob.activex和.jacob.activex包建立在基础之上, 主要包含了ActiveXComponent类。中有一个非常基础的类JacobObject,该包中比较常用的两个类Dispatch和Variant便是继承自JacobObject。Dispatch类代表COM自动化组件中的对象,提供了访问COM对象的API。Dispatch类中常用的方法有: call( )方法:调用COM对象的方法,返回Variant类型值。 invoke( )方法:和call方法作用相同,但是不返回值。 get( )方法:获取COM对象属性,返回variant类型值。 put( )方法:设置COM对象属性。 ActiveXComponent类继承自Dispatch类,在内部封装了Dispatch对象,使用该类加载COM组件。 并且提供了访问COM组件对象的属性和方法的接口。ActiveXComponent类提供了比Dispatch类更方便的获取属性和设置属性的方法:getProperty( ),setProperty( )。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。通过查询MSDN Office 2010开发人员手册,经过分析后得出图2-1所示的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所示:图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格式的详细代码如下:word2PDF 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); 1.JCom简介JCom是日本的一个开源项目,其目的同前面介绍的Jacob一样也是为了让Java程序能够访问Windows平台上的COM组件。利用JCom,可以在Java中控制几乎所有的COM对象,而且它还带有一些用于Excel操作的强大的辅助类。使用Jcom主要用到ReleaseManager和IDispatch类。ReleaseManager类相当于一个容器,管理机器上的COM组件。配合IDispatch类可以创建COM组件对象。例如创建Excel应用程序的COM对象:ReleaseManager rmExcel = new ReleaseManager( );IDispatch excelApp = new IDispatch(rmExcel,”Excel.Application”);另外,在程序结束的最后阶段需要调用ReleaseManager类中的release( )方法对创建的ReleaseManager进行资源释放,以免内存溢出。IDispatch类和Jacob中的Dispatch类相似,代表着COM组件对象,提供了访问微软COM组件对象的属性和方法的接口。IDispatch类中常用的方法如下:get( )方法:获取COM组件对象的属性,返回一个java.lang.Object类型值。put( )方法:设置COM组件对象的属性,不返回值。invoke( )方法:调用COM组件对象的方法,返回一个java.lang.Object类型值。不推荐使用,建议使用method方法。method( )方法:和invoke( )方法功能一样。2.JCom调用MS Office COM组件转换Office文档为PDF2.1前提条件JCom是日本人开发的一个开源项目,和Jacob类似,其也是用来调用COM自动化组件。自然JDK的运行环境也是必不可少。JCom也可以利用Microsoft Office API转换文档,那么需要安装Microsoft Office2007或者以上版本,同时Office2007仍需要安装有Microsoft Save as PDF or XPS插件。JCom除了调用Microsoft Office API转换文档为PDF格式的方法之外,还可以利用Adobe Acrobat软件的CreatePDF函数直接将Office格式的文档转换为PDF。因此,如果需要使用Adobe Acrobat转换文档,需要再安装有Adobe Acrobat软件。2.2安装配置下载JCom包,将其解压缩后,提取其中的jcom.jar包配置到Java项目的类路径中,同时也需要将其中的jcom.dll文件放置到windows系统System32目录下,如果不想污染System32目录中的dll文件,也可以将其放置到本机JDK安装目录下的bin文件夹中。2.3实现类似Jacob转换文档为PDF,转换Word为PDF格式的代码如下:JCom调用MS Office转换word为PDF源代码 public static void word2PDF(String inputFile,String pdfFile) ReleaseManager rm = null; IDispatch app = null; try rm = new ReleaseManager(); app = new IDispatch(rm, Word.Application);/启动word app.put(Visible, false); /设置word不可见 IDispatch docs = (IDispatch) app.get(Documents); /获得word中所有打开的文档 IDispatch doc = (IDispatch) docs.method(Open, new ObjectinputFile,false,true);/打开文档 doc.method(SaveAs, new ObjectpdfFile,17);/转换文档为pdf格式 doc.method(Close, new Objectfalse); app.method(Quit, null); catch (Exception e) e.printStackTrace(); finally try app=null; rm.release(); rm = null; catch (Exception e) e.printStackTrace(); 3.JCom调用Acrobat转换Office文档为PDF格式除了调用MS Office转换文档为PDF的方法之外,还可以调用Adobe Acrobat API转换Office文档为PDF格式,下面是JCom的实现方法,当然也可以用Jacob实现,这里就不做研究了。JCom调用Acrobat转换Office文档为PDF 1 public void convert2PDF(String inputFile, String pdfFile) 2 3 4 ReleaseManager rm = new ReleaseManager(); 5 IDispatch app; 6 try 7 app = new IDispatch(rm, PDFMakerAPI.PDFMakerApp); 8 app.method(CreatePDF,new ObjectinputFile,pdfFile); 9 System.out.println(conversion completed!);10 catch (JComException e) 11 e.printStackTrace();12 finally13 app=null;14 rm.release();15 rm = null;16 17 18 1.JODConverter简介JODConverter,是一个Java的OpenDocument文件转换器,可以进行许多文件格式的转换。它依赖于OpenO或者LibreOffice提供的服务来进行转换,它能将Microsoft Office文档(Word,Excel,PowerPoint)转换为PDF格式。你可以将JODConverter内嵌在Java应用程序里,也可以单独作为命令行由脚本调用,更可以应用为网页程序或者Web Service以供网络应用。(1) 转换文档范例:View Code OfficeManager officeManager = new DefaultOfficeManagerConfiguration( ).buildOfficeManager( );/启动OpenOffice服务officeManager.start( );/执行转换OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);converter.convert(new File(“test.odt”), new File(“test.pdf”);/停止服务officeManager.stop( );(2) 主要类说明:OfficeManager是一个接口,主要定义了三个方法: public void start( )启动OpenOffice服务 public void stop( )停止OpenOffice服务 public void execute(OfficeTask task)执行转换任务 DefaultOfficeManagerConfiguration是一个实现了OfficeManager接口的实体类,其提供了相关方法配置OpenO,比如:public DefaultOfficeManagerConfiguration setOfficeHome(String officeHome)设置OpenO或者LibreOffice安装目录,windows下默认值为” C:Program FilesOpenO 3”(LibreOffice进行相应更改),因此如果OpenO安装在别的目录,必须设置此项。public DefaultOfficeManagerConfiguration setConnectionProtocol(OfficeConnectionProtocol conn)设置连接协议,确定使用管道通信,还是socekt通信。pubcli DefaultOfficeManagerConfiguration setTemplateProfileDir(File templateProfileDir)设定临时目录。除以上几个方法之外,DefaultOfficeManagerConfiguration还提供了别的配置OpenO的方法,具体方法可以查询JODConverter API手册。配置完之后,必须要执行方法buildOfficeManager(),实现真正的配置。OfficeDocumentConverter中主要包含convert方法,该方法实际上调用的是实现OfficeManager接口的类中的execute方法。2.利用JODConverter转化文档为PDF格式实现2.1算法设计算法流程图如图4-1所示:图4-1 JODConverter调用OpenOffice服务转换文档为PDF算法第一步,启动OpenOffice服务。例如,首先设定DefaultOfficeManagerConfiguration相关参数来配置OpenOffice,并得到OfficeManager。调用OfficeManager实现类的start方法启动服务。第二步,转换文档。例如,初始化OfficeDocumentConverter,调用其convert方法执行转换。第三步,停止OpenOffice服务。例如,调用OfficeManager实现类的stop方法停止方法。2.2安装配置JODConverter是一个开源文档转换工具,既可以应用于Linux平台,也可其应用于Windows平台。其基于OpenO或者LibreOffice。因此,文档转换服务器上必须安装有OpenOffice或者LibreOffice。目前最新版本的JODConverter为JODConverter3.0,它要求JDK1.5以上的Java环境,同时还需要OpenO 3.x版本。本文基于最新版本3.0设计实现,如果是版本为2,则有不同的实现。(版本2需要手动启动OpenO服务,或者创建Windows服务设置为开机启动,而版本3提供了开启服务的接口,因此笔者用的是版本3)2.3实现代码View Code 1 package com.converter.pdfConverter; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 6 import org.artofsolving.jodconverter.OfficeDocumentConverter; 7 import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; 8 import org.artofsolving.jodconverter.office.OfficeManager; 9 10 import com.converter.utils.FileUtils;11 12 public class OpenOfficePDFConverter 13 14 private static OfficeManager officeManager;15 private static String OFFICE_HOME = D:Program FilesOpenO 3;16 private static int port = 8100;17 18 public void convert2PDF(String inputFile, String pdfFile) 19 20 if(inputFile.endsWith(.txt)21 String odtFile = FileUtils.getFilePrefix(inputFile)+.odt;22 if(new File(odtFile).exists()23 System.out.println(odt文件已存在!);24 inputFile = odtFile;25 else26 try 27 FileUtils.copyFile(inputFile,odtFile);28 inputFile = odtFile;29 catch (FileNotFoundException e) 30 System.out.println(文档不存在!);31 e.printStackTrace();32 33 34 35 36 startService();37 System.out.println(进行文档转换转换: + inputFile + - + pdfFile);38 OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);39 converter.convert(new File(inputFile),new File

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论