1. 程式人生 > >如何使用jacob將word轉換為PDF

如何使用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");
        }
}

 
五、參考資源: