1. JODConverter簡介
JODConverter,是一個Java的OpenDocument文件轉換器,可以進行許多文件格式的轉換。它依賴於OpenOffice.org或者LibreOffice提供的服務來進行轉換,它能將Microsoft Office文檔(Word,Excel,PowerPoint)轉換為PDF格式。
你可以將JODConverter內嵌在Java應用程序里,也可以單獨作為命令行由腳本調用,更可以應用為網頁程序或者Web Service以供網絡應用。
(1) 轉換文檔范例:
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接口的實體類,其提供了相關方法配置OpenOffice.org,比如:
public DefaultOfficeManagerConfiguration setOfficeHome(String officeHome)設置OpenOffice.org或者LibreOffice安裝目錄,windows下默認值為” C:\Program Files\OpenOffice.org 3”(LibreOffice進行相應更改),因此如果OpenOffice.org安裝在別的目錄,必須設置此項。
public DefaultOfficeManagerConfiguration setConnectionProtocol(OfficeConnectionProtocol conn)設置連接協議,確定使用管道通信,還是socekt通信。
pubcli DefaultOfficeManagerConfiguration setTemplateProfileDir(File templateProfileDir)設定臨時目錄。
除以上幾個方法之外,DefaultOfficeManagerConfiguration還提供了別的配置OpenOffice.org的方法,具體方法可以查詢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平台。其基於OpenOffice.org或者LibreOffice。因此,文檔轉換服務器上必須安裝有OpenOffice或者LibreOffice。
目前最新版本的JODConverter為JODConverter3.0,它要求JDK1.5以上的Java環境,同時還需要OpenOffice.org 3.x版本。本文基於最新版本3.0設計實現,如果是版本為2,則有不同的實現。(版本2需要手動啟動OpenOffice.org服務,或者創建Windows服務設置為開機啟動,而版本3提供了開啟服務的接口,因此筆者用的是版本3)
2.3 實現代碼
package com.converter.pdfConverter; import java.io.File; import java.io.FileNotFoundException; import org.artofsolving.jodconverter.OfficeDocumentConverter; import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.OfficeManager; import com.converter.utils.FileUtils; public class OpenOfficePDFConverter implements PDFConverter{ private static OfficeManager officeManager; private static String OFFICE_HOME = "D:\\Program Files\\OpenOffice.org 3"; private static int port[] = {8100}; public void convert2PDF(String inputFile, String pdfFile) { if(inputFile.endsWith(".txt")){ String odtFile = FileUtils.getFilePrefix(inputFile)+".odt"; if(new File(odtFile).exists()){ System.out.println("odt文件已存在!"); inputFile = odtFile; } else{ try { FileUtils.copyFile(inputFile,odtFile); inputFile = odtFile; } catch(FileNotFoundException e) { System.out.println("文檔不存在!"); e.printStackTrace(); } } } startService(); System.out.println("進行文檔轉換轉換:" + inputFile + " --> " +pdfFile); OfficeDocumentConverter converter = newOfficeDocumentConverter(officeManager); converter.convert(new File(inputFile),newFile(pdfFile)); stopService(); System.out.println(); } public void convert2PDF(String inputFile) { String pdfFile = FileUtils.getFilePrefix(inputFile)+".pdf"; convert2PDF(inputFile,pdfFile); } public static void startService(){ DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); try { System.out.println("准備啟動服務...."); configuration.setOfficeHome(OFFICE_HOME); //設置OpenOffice.org安裝目錄 configuration.setPortNumbers(port); //設置轉換端口,默認為8100 configuration.setTaskExecutionTimeout(1000 * 60 * 5L); //設置任務執行超時為5分鍾 configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L); //設置任務隊列超時為24小時 officeManager = configuration.buildOfficeManager(); officeManager.start(); //啟動服務 System.out.println("office轉換服務啟動成功!"); } catch (Exception ce) { System.out.println("office轉換服務啟動失敗!詳細信息:" + ce); } } public static voidstopService(){ System.out.println("關閉office轉換服務...."); if (officeManager != null) { officeManager.stop(); } System.out.println("關閉office轉換成功!"); } }
轉自新浪微博: http://blog.sina.com.cn/s/blog_6d762c870101avdu.html
其他參考材料:
http://nopainnogain.iteye.com/blog/819432
http://www.bitsandpix.com/entry/java-jodconverter-3x-getting-started/