让Java与OpenOffice调情(转)

你在困扰于word文档,Excel文档,各种各样的Office文档处理么?
你在羡慕DotNet程序员可以自如操作MS Office底层接口么?
你在四处翻腾纯java的PDF文件转换方案么?

欢迎来到OpenOffice.Org的世界,在这儿,你能享受到VIP的待遇,通过标准的Java接口,你可以尽情享受OpenOffice的强大功能,而且,这一切,都是Free的!为自由软件运动欢呼吧。让上千元一套的MS Office见鬼去吧。Java世界也能拥有完备的,自由的Office解决方案。

来,让我们开启通向自由花园的大门。

首先,确保你的电脑中安装了openoffice,唔,放心,没有序列号,没有copyright,这是一个free software,接下来,推荐,但不是必须的,你可以安装一套OpenOffice的SDK,运行程序并不需要SDK,但是在SDK中你能找到大量的文档和示例,以及大量深层开发必须的东西。


你有两种调用OpenOffice的选择:

1.你可以在代码中直接启动OpenOffice,前提是你必须×直接×引用OpenOffice目录中的jar包(别试图直接copy它们到某个lib目录,你只会在个程序中收获一个错误信息),他们的位置是“安装目录”/program/classes/,你至少需要引用juh.jar,jurt.jar,ridl.jar,unoil.jar这四个jar。

然后写下如下的代码:
//============================
com.sun.star.uno.XComponentContext xContext = com.sun.star.comp.helper.Bootstrap.bootstrap();
log.info("Connected to a running office ...");

com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager();

Object oDesktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", Context);

com.sun.star.frame.XComponentLoader xCompLoader = (com.sun.star.frame.XComponentLoader)
UnoRuntime.queryInterface( com.sun.star.frame.XComponentLoader.class, oDesktop);

com.sun.star.lang.XComponent xComp = xCompLoader.loadComponentFromURL(
fileUrlPath, "_blank", 0, new com.sun.star.beans.PropertyValue[0]);
//=======================================

你也可以在SDK目录的examples/java/DocumentHandling/DocumentLoader.java中找到这段代码,唔,如果看不明白不用担心,你需要知道的就是一个对象创建了又一个对象直到你获得了一个xComponent对象为止。

提示1:这儿的fileUrlPath是一个指向需要操作的文件的url路径,也就是类似于File:///C:/document/mydoc.rtf,Http://192.168.5.3/files/abc.html之类的路径,在OpenOffice的API中,绝大多数路径都必须用这种方式来指定。

提示2:xComp会是我们实际工作的起点,后面很多很多操作都会基于它而工作。

如果这段代码执行正常,你会发现屏幕上弹出一个openoffice的启动窗口并且直接打开一个指定的文档。有些情况下,这是一个贴心的设计,但更多情况下,这是不太能忍受的,如果我们希望openoffice静默运行,我们必须给loadComponentFromURL()调用加上一个参数:hidden=true

需要指定参数,我们需要构建一个PropertyValue数组,包含一个PropertyValue对象,Name="Hidden",value=Boolean.True(注意,这儿必须传递一个Object),把它传递给loadCompeonentFromURL,你就不会看到OpenOffice的启动窗口了

提示3:openoffice的大多数API指定工作参数的方式只有一种,传递一个PropertyValue数组,每一个PropertyValue就是一个Name/Value对,所以,封装一个工具类处理它是一个好主意。而且,name只是一个简单的字符串,所以校对拼写是必须做的。而value只接受Object,所以你必须做很多原始类型的封装

这种调用模式是最基本的方式,不过隐藏有很多问题:
1。种种原因,在web容器内这种直接打开程序的方式无法使用。
2。它要求在本机必须安装openoffice程序,对于C/S模式这并不是一个很好的选择

于是,我们有了第二种模式:服务模式
用过JDBC的肯定对服务模式有所认识,一个地址,一个监听,一个端口,然后所有的一切都可以通过其进行。OpenOffice提供了类似的功能

首先,我们必须把OpenOffice以后台服务方式启动,这需要这么一串参数:
-invisible -accept=socket,host=0,port=2002;urp;
invisible表示静默方式运行,
后面一串东西基本的意思就是:openoffice会在你指定的端口(这儿用的是2002)
监听用户的请求。(该字符串更具体的含义和对应功能,自行查询开发文档相关章节)

然后,我们必须更动之前获取XComp对象的代码,精确的说,我们必须更动获取XComponentContext 对象的代码。不再有BoolStap,而代之以一串更长的东西,这段东西非常的长,幸好,你只要直接copy过来就好,你可以在SDK的examples/java/ConverterServlet.java中找到这串东西,(注意,原始示例中使用的端口号不是之前我们指定的2002)

获取到Context之后,我们的代码没有变化,其他的流程一切照旧,所有的参数也一模一样。

监听模式下,还有一个附带的好处:你可以放心的把那几个jar拷贝到你需要的任何地方,而用不着非要指向OpenOffice的原始安装目录了。

欧,现在我们已经成功的让java唤醒了OpenOffice,接下来,就可以让它和java眉来眼去了。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值