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

目錄

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

仿百度文庫解決方案(二)——利用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。 app

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

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

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

  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。

office2010自動集成PDF/XPS組件,主菜單下選擇SaveAs,咱們能夠在Saveastype下拉列表框中發現PDF,XPS的身影,也能夠在Share子菜單下發現CreatePDF/XPSDocument。

  經過查詢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格式的詳細代碼以下:

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); }
相關文章
相關標籤/搜索