如何使用jacob將word轉換為PDF
一、程式碼實現功能介紹:
word文件轉換為PDF檔案的功能。
二、使用的環境條件:
正是由於jacob的jni這種特性,所以執行jacob的機器上必須要有jacob.dll在系統的path中,而且還要有相應的被呼叫的com元件存在。
下面列表說明了本專案使用的軟體環境和一些注意事項:
1.Word2003、Adobe Acrobat 8.0 Professional(注:也可以使用7.5以上版本,我在做的時候,7.0版本有一些BUG,後又重新安裝了8.0版本,安裝地址及破解地址分別為:
http://down1.greendown.cn//200611/AcroPro80_efg.rar
http://soft.greendown.cn//200611/AcroPro80_Crack.rar
2.並且關閉了Adobe PDF印表機屬性->Adobe PDF Setting中的“do not send fonts to PDF”選項(注:此屬性在Adobe Reader中的檔案->列印的屬性中進行設定。如果使用7.5以下版本可能會不好用,無法進行設定);
3.安裝了gs811w32.rar(PDF轉換時所需要的指令碼ps),地址為:
http://www.allmail.com.cn/gs811w32.rar
4.安裝了postscript.rar(PDF虛擬印表機的驅動),地址為:
http://www.pdfhome.com.cn/Resource/DownLoad/postscript.rar
虛擬印表機安裝完成之後,控制面板》印表機及其他硬體》印表機和傳真》新增印表機(如果新增時顯示“操作無法完成。列印後臺程式服務沒有執行。”請開啟控制面板》效能和維護》管理工具》服務》找到“Print Spooler”》右擊屬性》啟動)》選擇本地印表機(如果沒有印表機請將“檢測並安裝即插印表機”的鉤去掉)》下一步》選擇“使用以下埠”(My Document/*.pdf (Adobe PDF Port))》下一步,記住印表機的名字:Adobe PDF)》下一步(印表機請選擇:不測試)
5.下載得到了jacob.jar。地址為:
http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368
將解壓後的原始碼包中jacob.dll存放到system32目錄下。(注:目前比較穩定的版本分別為1.7、1.8、1.9,我用的是1.8版本)
注意:
第1、2個條件是必須的。不然會可能出現下面的錯誤:
三、原理:
doc -> ps ->pdf >>>> office 2003 ->gs811w32->Adobe Acrobat 8->postscript->印表機
四、原始碼:
package com.bjinfotech.practice.jacob;
import com.jacob.com.*;
import com.jacob.activeX.*;
public class Dispatch_MSWord {
private ActiveXComponent wordCom=null;
private Object wordDoc=null;
private final Variant False=new Variant(false);
private final Variant True=new Variant(true);
/**
* 開啟word文件
* @param filePath word文件
* @return 返回word文件物件
*/
public boolean openWord(String filePath){
//建立ActiveX部件
wordCom=new ActiveXComponent("Word.Application");
try{
//返回wrdCom.Documents的Dispatch
Object wrdDocs=wordCom.getProperty("Documents").toDispatch();
//呼叫wrdCom.Documents.Open方法開啟指定的word文件,返回wordDoc
wordDoc=Dispatch.invoke(wrdDocs,"Open",Dispatch.Method,new Object[]{filePath},new int[1]).toDispatch();
return true;
}
catch(Exception ex){
ex.printStackTrace();
}
return false;
}
/**
* 關閉word文件
*/
public void closeWord(){
//關閉word檔案
if (wordCom!=null){
int save = 0;
Variant doNotSaveChanges = new Variant(save);
wordCom.invoke("Quit",new Variant[]{doNotSaveChanges});
wordCom=null;
ComThread.Release();
}
}
/**
* 將word文件列印為PS檔案後,使用Distiller將PS檔案轉換為PDF檔案
* @param sourceFilePath 原始檔路徑
* @param destinPSFilePath 首先生成的PS檔案路徑
* @param destinPDFFilePath 生成PDF檔案路徑
*/
public void docToPDF(String sourceFilePath,String destinPSFilePath,String destinPDFFilePath){
if (!openWord(sourceFilePath)){
closeWord();
return;
}
//建立Adobe Distiller的com物件
ActiveXComponent distiller=new ActiveXComponent("PDFDistiller.PDFDistiller.1");
try{
//設定當前使用的印表機,我的Adobe Distiller印表機名字為"Adobe PDF"
wordCom.setProperty("ActivePrinter",new Variant("Adobe PDF"));
//是否在後臺執行
Variant Background=False;
//是否追加列印
Variant Append =False;
//列印所有文件
int wdPrintAllDocument=0;
Variant Range =new Variant(wdPrintAllDocument);
//輸出的postscript檔案的路徑
Variant OutputFileName =new Variant(destinPSFilePath);
//呼叫word文件物件的PrintOut方法:將word文件列印為postscript文件,簡稱ps文件
Dispatch.callN(wordDoc, "PrintOut", new Variant[]{Background,Append,Range,OutputFileName}) ;
System.out.println("由word文件列印為ps文件成功!");
//呼叫Distiller物件的FileToPDF方法所用的引數,詳細內容參考Distiller Api手冊
//作為輸入的ps文件路徑
Variant inputPostScriptFilePath=new Variant(destinPSFilePath);
//作為輸出的pdf文件的路徑
Variant outputPDFFilePath=new Variant(destinPDFFilePath);
//定義FileToPDF方法要使用adobe pdf設定檔案的路徑,在這裡沒有賦值表示並不使用pdf配置檔案
Variant PDFOption=new Variant("");
//呼叫FileToPDF方法將ps文件轉換為pdf文件
Dispatch.callN(distiller,"FileToPDF",new Variant[]{inputPostScriptFilePath,outputPDFFilePath,PDFOption});
System.out.println("由ps文件轉換為pdf文件成功!");
}
catch(Exception ex){
ex.printStackTrace();
}
finally{
closeWord();
}
}
public static void main(String[] argv){
Dispatch_MSWord d=new Dispatch_MSWord();
d.docToPDF("c:/MacroTest.doc","c:/1p.ps","c:/1p.pdf");
}
}
五、參考資源: