程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 用Visual C++實現PDF文件的顯示

用Visual C++實現PDF文件的顯示

編輯:vc教程
  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文件。

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

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

  (2) 創建控件窗口時,類ID為AcroPDF.PDF.1。

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

  Print 打印文件
  setZoom 設置頁面的百分比
  setShowToolbar 顯示/隱藏工具欄
  gotoFirstPage 跳轉到第一頁
  gotoLastPage 跳轉到最後一頁
  gotoNextPage 跳轉到下一頁
  gotoPreviousPage 跳轉到上一頁

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

  本文例程在Visual C++ 6、Acrobat(Reader)5.x/6.x/7.x上調試通過,為方便讀者,已經把例程放在互聯網上。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved