用Visual C++實現PDF檔案的顯示

來源:互聯網
上載者:User
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所示。


圖1

  對於Acrobat(Reader)7.x,實現步驟基本與上相同,區別在於:

  (1) 使用AcroPDF.dll產生自動化組件驅動類,得到的類名為IAcroAXDocShim,標頭檔為acropdf.h。

  (2) 建立控制項視窗時,類ID為AcroPDF.PDF.1。

  除了上面用到的LoadFile外,控制項還提供了許多有用的方法,常見的有:

  Print 列印檔案
  setZoom 設定頁面的百分比
  setShowToolbar 顯示/隱藏工具列
  gotoFirstPage 跳轉到第一頁
  gotoLastPage 跳轉到最後一頁
  gotoNextPage 跳轉到下一頁
  gotoPreviousPage 跳轉到上一頁

  由於用法很簡單,這裡不再一一敘述。

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.