仿百度文庫解決方案(二)——利用Jacob調用MS Office轉換文檔為PDF


目錄

仿百度文庫解決方案(一)——總體思路

仿百度文庫解決方案(二)——利用Jacob調用MS Office轉換文檔為PDF

仿百度文庫解決方案(三)——利用JCom調用MS Office或者Acrobat API轉換文檔為PDF

仿百度文庫解決方案(四)——利用JODConverter調用OpenOffice.org服務轉換文檔為PDF

仿百度文庫解決方案(五)——利用SWFTools轉換PDF文檔為SWF

仿百度文庫解決方案(六)——利用FlexPaper顯示Flash(SWF)

 

Jacob簡介

  Jacob是Java與COM組件橋接的縮寫,即JAVA-COM Bridge。通過使用Jacob類庫,我們可以很方便地在Java程序中調用COM自動化組件。Jacob最初是由美國人Dan Alder在Inventure公司擔任CTO時編寫的,目的是為了方便眾多的程序員在Java2虛擬機上,調用Win32平台上COM自動化服務器中的組件。當Jacob項目以開源的方式在網絡上公布以后,越來越多的人開始參與項目的研發與改進中去。

  Jacob類庫中只有兩個包:com.jacob.activex和com.jacob.com。com.jacob.activex包建立在com.jacob.com基礎之上,主要包含了ActiveXComponent類。com.jacob.com中有一個非常基礎的類JacobObject,該包中比較常用的兩個類Dispatch和Variant便是繼承自JacobObject。

  Dispatch類代表COM自動化組件中的對象,提供了訪問COM對象的API。Dispatch類中常用的方法有:

  • call( )方法:調用COM對象的方法,返回Variant類型值。
  • invoke( )方法:和call方法作用相同,但是不返回值。
  • get( )方法:獲取COM對象屬性,返回variant類型值。
  • put( )方法:設置COM對象屬性。

  ActiveXComponent類繼承自Dispatch類,在內部封裝了Dispatch對象,使用該類加載COM組件。 並且提供了訪問COM組件對象的屬性和方法的接口。ActiveXComponent類提供了比Dispatch類更方便的獲取屬性和設置屬性的方法:getProperty( ),setProperty( )。

  Variant類映射COM對象中的Variant數據結構,提供Java和COM的數據交互。其本質就是一種數據類型,可以被轉換成任何數據類型,如int,String,甚至Dispatch對象。

MS Office COM 對象模型

  Microsoft Office2007之前的Office版本並沒有提供轉換文檔為PDF格式的支持,另外,Office2007還需要安裝有Microsoft Save as PDF or XPS插件才支持PDF格式轉換,而Office2010不需要安裝插件則自帶有轉換Office文檔為PDF格式的API。因此,建議使用Office 2010。

  通過查詢MSDN Office 2010開發人員手冊,經過分析后得出圖2-1所示的Office COM對象模型:

Office COM對象模型圖2-1 Office COM對象模型

  Microsoft Office中每個應用程序中都包含一個Application對象,但是每個應用程序中的文檔對象卻不一樣,Word中Documents對象代表Word應用程序中所有打開的word文檔集合,Document對象代表一篇word文檔。詳細的文檔對象結構如圖2-1所示。其中Document,Workbook,Presentation中的SaveAs或者ExportAsFixedFormat方法可用於將文檔轉換為PDF。

Jacob調用MS Office COM自動化組件轉換Office文檔為PDF

  算法流程圖如2-2所示:

Jacob調用MS Office轉換文檔為PDF

圖2-2 Jacob調用MS Office COM組件轉換文檔為PDF算法流程

  第一步,對於Office文檔,不同格式的文檔需要加載不同的COM組件,例如Word文件需要加載Word COM組件。Jacob中加載COM組件是利用ActiveXComponent類,例如,加載Word COM自動化組件:

//Word.Application代表COM OLE編程標識,可查詢MSDN得到
ActiveXComponent app = new ActiveXComponent("Word.Application");
//設置Word不可見
app.setProperty("Visible",false);

  第二步,獲得文檔對象集合,Word中Documents對象代表Word應用程序中所有打開的Word文檔,范例如下:

//調用Application對象的Documents屬性,獲得Documents對象
Dispatch docs = app.getProperty("Documents").toDispatch();

   第三步,打開文件,並執行轉換。Word范例如下:

Dispatch doc = Dispatch.call(docs,
                           "Open",//調用Documents對象的Open方法
                            inputFile,// 輸入文件路徑全名
                            false, //ConfirmConversions,設置為false表示不顯示轉換框
                             true//ReadOnly
); Dispatch.call(doc,//要轉換的文檔 "SaveAS", pdfFile,//要保存的PDF文件名 wdFormatPDF//轉換后的文件格式宏,值為17,可查詢MSDN得到
);

  第四步,關閉應用程序。Word范例:

//關閉打開的Word文件
Dispatch.call(doc,
              "Close",
               false//設置不保存改變);
//關閉Word應用程序
app.invoke("Quit",0);

  轉換Word文檔為PDF格式的詳細代碼如下:

word2PDF
public static void word2PDF(String inputFile,String pdfFile){
        //打開word應用程序
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        //設置word不可見
        app.setProperty("Visible", false);
        //獲得word中所有打開的文檔,返回Documents對象
        Dispatch docs = app.getProperty("Documents").toDispatch();
        //調用Documents對象中Open方法打開文檔,並返回打開的文檔對象Document
        Dispatch doc = Dispatch.call(docs,
                                    "Open",
                                    inputFile,
                                    false,
                                    true
                                    ).toDispatch();
        //調用Document對象的SaveAs方法,將文檔保存為pdf格式
        /*
        Dispatch.call(doc,
                    "SaveAs",
                    pdfFile,
                    wdFormatPDF        //word保存為pdf格式宏,值為17
                    );
                    */
        Dispatch.call(doc,
                "ExportAsFixedFormat",
                pdfFile,
                wdFormatPDF        //word保存為pdf格式宏,值為17
                );
        //關閉文檔
        Dispatch.call(doc, "Close",false);
        //關閉word應用程序
        app.invoke("Quit", 0);
        
    }

注:

  源代碼下載地址:DocConverter

   轉載說明本文系作者原創,轉載時請注明文章出處:肖恩也有夢想 博客園,請尊重作者的勞動成果,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM