本部落格 jacob 列文章導讀
Java操作Microsoft Word之jacob
jacob使用入門及問題解析
使用Jacob將Word轉為Html或txt
使用Jacob將Word轉為PDF
java通過jacob調用word (根據Word模板產生動態內容)
準備工作:
1. 安裝 "Adobe Acrobat 7.0 Professional" 並升級到"7.0.5"
2.安裝"gs811w32.rar" (預設安裝就可以了,它是一個PDF轉換時所需要的指令碼)
3.安裝"postscript.rar" (預設安裝就可以,它其實是個PDF虛擬印表機的驅動)
4.虛擬印表機配置,參考http://www.matrix.org.cn/thread.shtml;jsessionid=B1E4B57897D51B59802D353CB6B32ACC?topicId=29594&forumId=17
一點需要稍微留意:wordCom.setProperty("ActivePrinter", new Variant("MS Publisher Color Printer"));
這行代碼中的"MS Publisher Color Printer"對應安裝的虛擬印表機名稱,請用以下代碼測試。
1》要用到的軟體:
(1)Adobe Acrobat 8 Professional (最低版本7.03)
(個人非商業使用)8.0破解版: http://green.crsky.com/soft/2205.html (記得下載補丁)
安裝檔案 http://down1.greendown.cn//200611/AcroPro80_efg.rar
破解 http://soft.greendown.cn//200611/AcroPro80_Crack.rar
(2)gs811w32.rar (PDF轉換時所需要的指令碼ps)
http://www.allmail.com.cn/gs811w32.rar
(3)postscript.rar (PDF虛擬印表機的驅動)
http://www.pdfhome.com.cn/Resource/DownLoad/postscript.rar
(4)jacob.jar
jacob_1.9.zip
(5)office 2003
2》原理:
jacob.jar
doc --> ps --> pdf --> office 2003 --> gs811w32 -->Adobe Acrobat 8 --> postscript --> 印表機
(其中關於jacob,jar的安裝請看:jacob使用入門及問題解析)
3》安裝運行:
(1)安裝 Adobe Acrobat 8 Professional
(2)安裝 gs811w32.rar
(3)配置印表機(這裡不需要真實的印表機)
控制台》 印表機及其他硬體》印表機和傳真》添加印表機
(如果添加時顯示“操作無法完成。列印多工緩衝程式服務沒有運行。”
請開啟控制台》效能和維護》管理工具》服務》找到“Print Spooler”
》右擊屬性》啟動)》選擇本機印表機(如果沒有印表機請將“檢測並安裝
即插印表機”的鉤去掉)》下一步》選擇“使用以下連接埠”
(My Document/*.pdf (Adobe PDF Port))》下一步 選擇印表機》我選擇
的是Apple的 Color LaserWriter 12/600(工作後,有錢一定要買個Apple hp)
》下一步(記住印表機的名字:Apple Color LaserWriter 12/600)
》下一步(沒有印表機的朋友請選擇:不測試)
(4)安裝 postscript.rar (安裝時,注意每一步,選擇與前面設定相關的選項)
(5)設定Adobe Acrobat 8 Professional:選擇一個pdf檔案,右擊開啟檔案選擇
使用 開啟Adobe Acrobat 8 Professional》選擇file菜單》Print Setup...》列印選項
屬性“Apple Color LaserWriter 12/600”》確定
(6)運行下面的代碼:
/**<br /> * @author XuMing Li<br /> *<br /> * @version 1.00, 2007-4-9<br /> *<br /> */<br />import com.jacob.activeX.ActiveXComponent;<br />import com.jacob.com.ComThread;<br />import com.jacob.com.Dispatch;<br />import com.jacob.com.Variant;</p><p>public class D2P {<br />private ActiveXComponent wordCom = null;</p><p>private Object wordDoc = null;</p><p>private final Variant False = new Variant(false);</p><p>private final Variant True = new Variant(true);</p><p>/**<br /> * 開啟word文檔<br /> * @param filePath<br /> * word文檔<br /> * @return 返回word文檔對象<br /> */<br />public boolean openWord(String filePath) {<br />// 建立ActiveX組件<br />wordCom = new ActiveXComponent("Word.Application");<br />try {<br />// 返回wrdCom.Documents的Dispatch<br />Dispatch wrdDocs = wordCom.getProperty("Documents").toDispatch();<br />// 調用wrdCom.Documents.Open方法開啟指定的word文檔,返回wordDoc<br />wordDoc = Dispatch.invoke(wrdDocs, "Open", Dispatch.Method, new Object[] { filePath }, new int[1]).toDispatch();<br />return true;<br />} catch (Exception ex) {<br />ex.printStackTrace();<br />}<br />return false;<br />}</p><p>/**<br /> * 關閉word文檔<br /> */<br />public void closeWord() {<br />// 關閉word檔案<br />wordCom.invoke("Quit", new Variant[] {});<br />}</p><p>/**<br /> * * 將word文檔列印為PS檔案後,使用Distiller將PS檔案轉換為PDF檔案 *<br /> *<br /> * @param sourceFilePath<br /> * 源檔案路徑 *<br /> * @param destinPSFilePath<br /> * 首先產生的PS檔案路徑 *<br /> * @param destinPDFFilePath<br /> * 產生PDF檔案路徑<br /> */<br />public void docToPDF(String sourceFilePath, String destinPSFilePath,<br />String destinPDFFilePath) {<br />if (!openWord(sourceFilePath)) {<br />closeWord();<br />return;<br />}<br />// 建立Adobe Distiller的com對象<br />ActiveXComponent distiller = new ActiveXComponent("PDFDistiller.PDFDistiller.1");<br />try {<br />// 設定當前使用的印表機,我的Adobe Distiller印表機名字為"Adobe PDF"<br />wordCom.setProperty("ActivePrinter", new Variant("MS Publisher Color Printer"));<br />// 設定printout的參數,將word文檔列印為postscript文檔。目前只使用了前5個參數,如果要使用更多的話可以參考MSDN的office開發相關api<br />// 是否在後台運行<br />Variant Background = False;<br />// 是否追加列印<br />Variant Append = False;<br />// 列印所有文檔<br />int wdPrintAllDocument = 0;<br />Variant Range = new Variant(wdPrintAllDocument);<br />// 輸出的postscript檔案的路徑<br />Variant OutputFileName = new Variant(destinPSFilePath);</p><p>Dispatch.callN((Dispatch) wordDoc, "PrintOut", new Variant[] {Background, Append, Range, OutputFileName });<br />System.out.println("由word文檔列印為ps文檔成功!");<br />// 調用Distiller對象的FileToPDF方法所用的參數,詳細內容參考Distiller Api手冊作為輸入的ps文檔路徑<br />Variant inputPostScriptFilePath = new Variant(destinPSFilePath);<br />// 作為輸出的pdf文檔的路徑<br />Variant outputPDFFilePath = new Variant(destinPDFFilePath);<br />// 定義FileToPDF方法要使用adobe pdf設定檔案的路徑,在這裡沒有賦值表示並不使用pdf設定檔<br />Variant PDFOption = new Variant("");<br />// 調用FileToPDF方法將ps文檔轉換為pdf文檔<br />Dispatch.callN(distiller, "FileToPDF", new Variant[] {inputPostScriptFilePath, outputPDFFilePath, PDFOption });<br />System.out.println("由ps文檔轉換為pdf文檔成功!");<br />} catch (Exception ex) {<br />ex.printStackTrace();<br />} finally {<br />closeWord();<br />wordCom = null;<br />// 釋放在程式線程中引用的其它com,比如Adobe PDFDistiller<br />ComThread.Release();<br />}<br />}</p><p>public static void main(String[] argv) {<br />D2P d2p = new D2P();<br />d2p.docToPDF("d:/12.doc", "d:/1p.ps", "d:/1p.pdf");<br />// 這裡是你建一個叫12.doc的word文檔,產生的文檔將在D盤下<br />// 1p.ps和1p.pdf(這是我們要的)<br />}<br />}
博文來源:http://blog.csdn.net/gavin_sw/archive/2007/04/11/1561254.aspx