PDF介紹
PDF是“Portable Document Format 可移植文檔格式”的縮寫,它是Adobe公司開發的一種電子文檔格式,已經成為國際通用的電子文檔交換事實標準。PDF檔案可以在各種平台下閱讀、編輯、發布。該檔案格式支援字型、映像、甚至任何附件的嵌入。
Adobe公司提供了兩種軟體用於處理PDF文檔,分別是Acrobat及Acrobat Reader:前者功能強大,不僅能閱讀,還可以建立或編輯PDF文檔,但要收費;後者只具備閱讀功能,為免費軟體。
用ActiveX控制項顯示PDF檔案
Acrobat(Reader)提供了一個ActiveX控制項pdf.ocx(7.x版本為AcroPDF.dll),可以在使用者程式中實現PDF檔案的顯示。對於老版本的軟體(4.x及以前的版本),只需按照ActiveX控制項的標準編程步驟即可:
(1)把控制項pdf.ocx加入VC項目,並產生控制項類
(2)把控制項放置在對話方塊上,或者調用控制項類的成員函數Create建立控制項對象
(3)調用控制項的屬性或方法開啟PDF檔案
由於這不屬於本文要討論的內容,詳情請參考《Visual C++技術內幕》中“使用ActiveX控制項”一章,這裡不再贅述。
但是對於新版軟體(5.x/6.x/7.x),上述方法不再適用:新版控制項不是一個完整意義上的ActiveX控制項,它缺少產生控制項類所必需的類型庫資訊,無法把控制項加入VC項目。
在這種情況下,需要調用函數CWnd::CreateControl來建立控制項對象,然後擷取控制項的IDispatch介面指標,通過該指標訪問控制項的屬性及方法。
直接用IDispatch指標調用控制項的屬性及方法是一件極其繁瑣的工作,好在新版軟體提供了類型庫,可以用它產生一個自動化組件驅動類(從COleDispatchDriver派生)。藉助該類,可以大大簡化對控制項屬性及方法的調用。
雖然可以用控制項顯示PDF檔案,但它只是一個代理,真正的工作還是由Acrobat(Reader)完成的,因此必須安裝這兩種軟體中的一個。
實現步驟
以下以Acrobat(Reader)5.x/6.x為例,介紹如何用新版控制項實現PDF檔案的顯示。
運行VC,建立一個基於對話方塊的MFC應用程式ViewPDF,在設定產生選項時,選中“ActiveX Controls”,其餘使用預設值即可。產生後,刪除對話方塊中的所有控制項。
接下來建立自動化組件驅動類:開啟類嚮導,點擊“Add Class”按鈕,在彈出的菜單中選擇“From a type library”,用類型庫檔案pdf.tlb產生所需的組件類,該檔案位於Acrobat軟體安裝目錄下的ActiveX子目錄。
編輯ViewPDFDlg.h,為類CViewPDFDlg添加兩個資料成員:
#include "pdf.h" // 組件類的標頭檔 class CViewPDFDlg : public CDialog { protected: _DPdf m_drvPDF; // PDF組件驅動對象,_DPdf是我們剛產生的組件類 CWnd m_wndPDF; // PDF控制項視窗 ... ... |
在類成員函數CViewPDFDlg::OnInitDialog中插入下列語句:
// 為主視窗添加WS_CLIPCHILDREN風格,否則控制項顯示不正常 ModifyStyle(0, WS_CLIPCHILDREN); // 擷取對話方塊的客戶區矩形 CRect rt; GetClientRect(&rt); // 利用CWnd::CreateControl建立PDF控制項視窗 // Acrobat (Reader) 5.x/6.x的控制項類ID為"PDF.PdfCtrl.5",7.x為"AcroPDF.PDF.1" m_wndPDF.CreateControl("PDF.PdfCtrl.5", NULL, WS_CHILD | WS_VISIBLE, rt, this, 0); // 擷取IDispatch介面指標 LPUNKNOWN lpUnknown = m_wndPDF.GetControl Unknown(); LPDISPATCH lpDispatch; lpUnknown->QueryInterface(IID_IDispatch, (void**)&lpDispatch); // 把獲得的介面指標傳遞給組件驅動對象m_drvPDF,通過它調用控制項的屬性和方法 // 當m_drvPDF銷毀時,會自動釋放介面指標 m_drvPDF.AttachDispatch(lpDispatch); // 彈出一個“開啟”對話方塊,選擇要顯示的PDF檔案 CFileDialog dlg(TRUE); if (dlg.DoModal() == IDOK) // 利用控制項的方法LoadFile讀取並顯示PDF檔案 m_drvPDF.LoadFile(dlg.GetPathName()); else OnCancel(); // 退出 |
編譯運行程式,選擇要顯示的PDF檔案,效果1所示。
對於Acrobat(Reader)7.x,實現步驟基本與上相同,區別在於:
(1) 使用AcroPDF.dll產生自動化組件驅動類,得到的類名為IAcroAXDocShim,標頭檔為acropdf.h。
(2) 建立控制項視窗時,類ID為AcroPDF.PDF.1。
除了上面用到的LoadFile外,控制項還提供了許多有用的方法,常見的有:
Print 列印檔案
setZoom 設定頁面的百分比
setShowToolbar 顯示/隱藏工具列
gotoFirstPage 跳轉到第一頁
gotoLastPage 跳轉到最後一頁
gotoNextPage 跳轉到下一頁
gotoPreviousPage 跳轉到上一頁
由於用法很簡單,這裡不再一一敘述。