7.4 使用Jacob來處理Word文檔
Word或Excel程序是以一種COM組件形式存在的。如果能夠在Java中調用Word的COM組件,就能使用它的方法來獲取Word文檔中的文本信息。目前網上有許多提供這樣的工具。
7.4.1 Jacob的下載
Jacob 是Java-COM Bridge的縮寫,它在Java與微軟的COM組件之間構建一座橋樑。使用Jacob自帶的DLL動態鏈接庫,並通過JNI的方式實現了在Java平臺上對COM程序的調用。Jacob下載的地址爲:
http://sourceforge.net/project/showfiles.php? group_id=109543&package_id=118368。本書採用的是jacob_1.11_zip。解壓下載的 Jacob_1.11_zip文件後,如圖7-17所示。
圖7-17 Jacob包解壓後的內容
7.4.2 在Eclipse中配置
(1)將jacob.jar導入工程的Build Path,然後確認自己機器的CPU類型(X86或AMD64),並選擇不同目錄下的jacob.dll文件。
(2)將jacob.dll放到% JAVA_HOME%/jre/bin目錄下,其中,%JAVA_HOME%就是JDK的安裝目錄。注意這個的jre目錄必須是Eclipse當前正在使 用的目錄,在Eclipse中選擇“window->Preferences”菜單,在彈出的對話框中選擇“Java->Installed JREs”項,如圖7-18所示。
圖7-18 Eclipse中JRE設置的對話框
(3)當前選擇的JRE是“C:/Program Files/Java/jdk1.5.0_07/jre”目錄下的,所以需要把jacob.dll複製到“C:/Program Files/Java/jdk1.5.0_07/jre/bin”目錄下面。
(4)在工程中新建一個ch7.jacob包, 並在包中創建WordReader類。該類將提供一個靜態的extractDoc()方法。它接收兩個參數,一個是要處理的DOC文件名,另一個則是輸出 的文件名,然後通過JNI調用Word的API轉換內容,該函數的代碼如下。
代碼7.10
public static void extractDoc(String inputFIle, String outputFile) {
boolean flag = false;
// 打開Word應用程序
ActiveXComponent app = new ActiveXComponent("Word.Application");
try {
// 設置word不可見
app.setProperty("Visible", new Variant(false));
// 打開word文件
Dispatch doc1 = app.getProperty("Documents").toDispatch();
Dispatch doc2 = Dispatch.invoke(
doc1,
"Open",
Dispatch.Method,
new Object[] { inputFIle, new Variant(false),
new Variant(true) }, new int[1]).toDispatch();
// 作爲txt格式保存到臨時文件
Dispatch.invoke(doc2, "SaveAs", Dispatch.Method, new Object[] {
outputFile, new Variant(7) }, new int[1]);
// 關閉word
Variant f = new Variant(false);
Dispatch.call(doc2, "Close", f);
flag = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
app.invoke("Quit", new Variant[] {});
}
if (flag == true) {
System.out.println("Transformed Successfully");
} else {
System.out.println("Transform Failed");
}
}
(5)創建一個main函數來測試WordReader類,該main函數代碼如下。
public static void main(String[] args) {
WordReader.extractDoc("c:/test.doc","c:/jacob.txt");
}
(6)新生成的txt文件被保存到c:/jacob.txt下,如圖7-19所示。
圖7-19 使用Jacob處理的效果
在使用Jacob時,很重要的一點是,用戶本地系統中必須安裝有Word的應用程序。否則也就無法建立Java-COM橋,進而無法解析了。