最近在項目中遇到一個需求,是要將各類文檔轉(zhuǎn)換為PDF。這應(yīng)該是個很常見的工作,而且我也只需要支持MS Word,Excel,PowerPoint等常見的文檔格式就行了。于是有朋友就建議了,可以使用MS Office轉(zhuǎn)嘛。當(dāng)然也可以使用其他方法,例如裝一些PDF打印機(jī),把文檔打印成pdf文件。不過這些做法在“授權(quán)”方面似乎都有些問題。當(dāng)然,我也找了一些商業(yè)解決方案(如Aspose)保底,咋看之下它的授權(quán)方式也并不算貴。不過現(xiàn)在看來,OpenOffice.org已經(jīng)能夠滿足我的需求了。如果您有更好的做法也請告訴我。
OpenOffice.org是個開源的辦公套件,提供了與MS Word,Excel,PowerPoint等對應(yīng)的多個軟件,在很多時候倒也足夠使用。更重要的是,它支持包括MS Office 2007在內(nèi)的多種格式,并且能夠?qū)⑵鋵?dǎo)出為PDF文件,再加上它的授權(quán)方式是LGPL,在生產(chǎn)環(huán)境里使用自然也不會有什么明顯的限制了。此外,OOo本身也有相當(dāng)多的開發(fā)文檔,我對完成這個工作還是很有信心的——但我沒想到的是,這過程還真不如想象中那么順利。
編譯通過也不容易
首先,我安裝了OpenOffice.org主程序以及SDK。SDK隨帶一些示例代碼,其中DocumentHandling部分正好包含一個我需要的DocumentConverter功能。于是我打開Eclipse,倒入這個文件,很顯然會出現(xiàn)無數(shù)錯誤提示:還沒有引入合適的類庫嘛。那么我該引用哪些jar包呢?根據(jù)其他一些搜索到的零碎的資料提示,我該引入的是一些放在~\Basis\program\classes下的幾個jar包,比如unoil.jar、juh.jar……等等,這個包在什么地方?事實上,我在這么目錄下唯獨只找到unoil.jar這個獨苗。莫名之余,我一股腦的將目錄中的30多個jar包全部引入,可是錯誤依舊。
我就蒙了,在搜索引擎里不斷地用juh.jar相關(guān)的關(guān)鍵字進(jìn)行查詢,希望可以找到一些提示,一無所獲。然后我動用了系統(tǒng)中的文件搜索,在~/Basis目錄中查找*.jar,還是沒有發(fā)現(xiàn)juh.jar的蹤影。于是我很沮喪,怎么第一步也這么不順利。直到大約過了一個小時后,我才無意間在~\URE\java目錄下發(fā)現(xiàn)了那幾個關(guān)鍵的jar包。引入后我長吁一口氣:示例代碼終于編譯通過了。概括來說,如果需要讓DocumentConverter.java編譯通過,需要引入一下三個jar包:
~\URE\java\juh.jar
~\URE\java\jurt.jar
~\Basis\program\classes\unoil.jar
真是痛恨文檔和實際現(xiàn)象不符的情況,消耗時間不說,心情也變糟糕了。
整理示例代碼
不得不說,DocumentConverter.java真不能算是段優(yōu)秀的示例代碼。首先,它并沒有很好地起到示范的作用。我理想中的示例代碼應(yīng)該能夠清晰地說明工作的方式和步驟,而不會添加太多額外的內(nèi)容。這段示例代碼的效果是“轉(zhuǎn)化指定目錄中的所有文件”,還用到了遞歸。再加上它沒有import任何類型,每個類型在使用時都拖著長長的“com.sun.star”,這讓原本就十分冗余的Java代碼變得更為難以理解。更別說注釋與代碼本身的沖突,還有多余的類型強制轉(zhuǎn)換等問題。為此,我根據(jù)文檔說明,重新改寫了一下示例代碼,將整個過程拆分為多個步驟。
首先,我們打開并連接一個OOo程序,這需要創(chuàng)建一個XComponentContext對象:
private static XComponentContext createContext() throws Exception { // get the remote office component context return Bootstrap.bootstrap(); }
然后創(chuàng)建一個XComponentLoader對象:
private static XComponentLoader createLoader(XComponentContext context) throws Exception { // get the remote office service manager XMultiComponentFactory mcf = context.getServiceManager(); Object desktop = mcf.createInstanceWithContext("com.sun.star.frame.Desktop", context); return UnoRuntime.queryInterface(XComponentLoader.class, desktop); }
出處:老趙點滴
責(zé)任編輯:bluehearts
上一頁 下一頁 使用OpenOffice.org將各類文檔轉(zhuǎn)為PDF [2]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|