仿百度文庫解決方案之二:Jacob調(diào)用轉(zhuǎn)換
Jacob簡(jiǎn)介
Jacob是Java與COM組件橋接的縮寫,即JAVA-COM Bridge。通過使用Jacob類庫,我們可以很方便地在Java程序中調(diào)用COM自動(dòng)化組件。Jacob最初是由美國人Dan Alder在Inventure公司擔(dān)任CTO時(shí)編寫的,目的是為了方便眾多的程序員在Java2虛擬機(jī)上,調(diào)用Win32平臺(tái)上COM自動(dòng)化服務(wù)器中的組件。當(dāng)Jacob項(xiàng)目以開源的方式在網(wǎng)絡(luò)上公布以后,越來越多的人開始參與項(xiàng)目的研發(fā)與改進(jìn)中去。
Jacob類庫中只有兩個(gè)包:com.jacob.activex和com.jacob.com。com.jacob.activex包建立在com.jacob.com基礎(chǔ)之上,主要包含了ActiveXComponent類。com.jacob.com中有一個(gè)非?;A(chǔ)的類JacobObject,該包中比較常用的兩個(gè)類Dispatch和Variant便是繼承自JacobObject。
Dispatch類代表COM自動(dòng)化組件中的對(duì)象,提供了訪問COM對(duì)象的API。Dispatch類中常用的方法有:
call( )方法:調(diào)用COM對(duì)象的方法,返回Variant類型值。
invoke( )方法:和call方法作用相同,但是不返回值。
get( )方法:獲取COM對(duì)象屬性,返回variant類型值。
put( )方法:設(shè)置COM對(duì)象屬性。
ActiveXComponent類繼承自Dispatch類,在內(nèi)部封裝了Dispatch對(duì)象,使用該類加載COM組件。 并且提供了訪問COM組件對(duì)象的屬性和方法的接口。ActiveXComponent類提供了比Dispatch類更方便的獲取屬性和設(shè)置屬性的方法:getProperty( ),setProperty( )。
Variant類映射COM對(duì)象中的Variant數(shù)據(jù)結(jié)構(gòu),提供Java和COM的數(shù)據(jù)交互。其本質(zhì)就是一種數(shù)據(jù)類型,可以被轉(zhuǎn)換成任何數(shù)據(jù)類型,如int,String,甚至Dispatch對(duì)象。
MS Office COM 對(duì)象模型
Microsoft Office2007之前的Office版本并沒有提供轉(zhuǎn)換文檔為PDF格式的支持,另外,Office2007還需要安裝有Microsoft Save as PDF or XPS插件才支持PDF格式轉(zhuǎn)換,而Office2010不需要安裝插件則自帶有轉(zhuǎn)換Office文檔為PDF格式的API。因此,建議使用Office 2010。
通過查詢MSDN Office 2010開發(fā)人員手冊(cè),經(jīng)過分析后得出圖2-1所示的Office COM對(duì)象模型:
圖2-1 Office COM對(duì)象模型
Microsoft Office中每個(gè)應(yīng)用程序中都包含一個(gè)Application對(duì)象,但是每個(gè)應(yīng)用程序中的文檔對(duì)象卻不一樣,Word中Documents對(duì)象代表Word應(yīng)用程序中所有打開的word文檔集合,Document對(duì)象代表一篇word文檔。詳細(xì)的文檔對(duì)象結(jié)構(gòu)如圖2-1所示。其中Document,Workbook,Presentation中的SaveAs或者ExportAsFixedFormat方法可用于將文檔轉(zhuǎn)換為PDF。
Jacob調(diào)用MS Office COM自動(dòng)化組件轉(zhuǎn)換Office文檔為PDF
算法流程圖如2-2所示:
圖2-2 Jacob調(diào)用MS Office COM組件轉(zhuǎn)換文檔為PDF算法流程
接下來是代碼部分:
#p#
第一步,對(duì)于Office文檔,不同格式的文檔需要加載不同的COM組件,例如Word文件需要加載Word COM組件。Jacob中加載COM組件是利用ActiveXComponent類,例如,加載Word COM自動(dòng)化組件:
- //Word.Application代表COM OLE編程標(biāo)識(shí),可查詢MSDN得到
- ActiveXComponent app = new ActiveXComponent("Word.Application");
- //設(shè)置Word不可見
- app.setProperty("Visible",false);
第二步,獲得文檔對(duì)象集合,Word中Documents對(duì)象代表Word應(yīng)用程序中所有打開的Word文檔,范例如下:
- //調(diào)用Application對(duì)象的Documents屬性,獲得Documents對(duì)象
- Dispatch docs = app.getProperty("Documents").toDispatch();
第三步,打開文件,并執(zhí)行轉(zhuǎn)換。Word范例如下:
- Dispatch doc = Dispatch.call(docs,
- "Open",//調(diào)用Documents對(duì)象的Open方法
- inputFile,// 輸入文件路徑全名
- false, //ConfirmConversions,設(shè)置為false表示不顯示轉(zhuǎn)換框
- true//ReadOnly
- );
- Dispatch.call(doc,//要轉(zhuǎn)換的文檔
- "SaveAS",
- pdfFile,//要保存的PDF文件名
- wdFormatPDF//轉(zhuǎn)換后的文件格式宏,值為17,可查詢MSDN得到
- );
第四步,關(guān)閉應(yīng)用程序。Word范例:
- //關(guān)閉打開的Word文件
- Dispatch.call(doc,
- "Close",
- false//設(shè)置不保存改變);
- //關(guān)閉Word應(yīng)用程序
- app.invoke("Quit",0);
轉(zhuǎn)換Word文檔為PDF格式的詳細(xì)代碼如下:
- word2PDF
- public static void word2PDF(String inputFile,String pdfFile){
- //打開word應(yīng)用程序
- ActiveXComponent app = new ActiveXComponent("Word.Application");
- //設(shè)置word不可見
- app.setProperty("Visible", false);
- //獲得word中所有打開的文檔,返回Documents對(duì)象
- Dispatch docs = app.getProperty("Documents").toDispatch();
- //調(diào)用Documents對(duì)象中Open方法打開文檔,并返回打開的文檔對(duì)象Document
- Dispatch doc = Dispatch.call(docs,
- "Open",
- inputFile,
- false,
- true
- ).toDispatch();
- //調(diào)用Document對(duì)象的SaveAs方法,將文檔保存為pdf格式
- /*
- Dispatch.call(doc,
- "SaveAs",
- pdfFile,
- wdFormatPDF //word保存為pdf格式宏,值為17
- );
- */
- Dispatch.call(doc,
- "ExportAsFixedFormat",
- pdfFile,
- wdFormatPDF //word保存為pdf格式宏,值為17
- );
- //關(guān)閉文檔
- Dispatch.call(doc, "Close",false);
- //關(guān)閉word應(yīng)用程序
- app.invoke("Quit", 0);
- }
源代碼下載地址:DocConverter
原文鏈接:http://www.cnblogs.com/luckyxiaoxuan/archive/2012/06/13/2548355.html
【編輯推薦】