用Visual C++實現(xiàn)PDF文件的顯示
發(fā)布時間:2008/8/23 0:00:00 訪問次數(shù):590
pdf介紹
pdf是“portable document format 可移植文檔格式”的縮寫,它是adobe公司開發(fā)的一種電子文檔格式,已經(jīng)成為國際通用的電子文檔交換事實標(biāo)準(zhǔn)。pdf文件可以在各種平臺下閱讀、編輯、發(fā)布。該文件格式支持字體、圖像、甚至任何附件的嵌入。
adobe公司提供了兩種軟件用于處理pdf文檔,分別是acrobat及acrobat reader:前者功能強大,不僅能閱讀,還可以創(chuàng)建或編輯pdf文檔,但要收費;后者只具備閱讀功能,為免費軟件。
用activex控件顯示pdf文件
acrobat(reader)提供了一個activex控件pdf.ocx(7.x版本為acropdf.dll),可以在用戶程序中實現(xiàn)pdf文件的顯示。對于老版本的軟件(4.x及以前的版本),只需按照activex控件的標(biāo)準(zhǔn)編程步驟即可:
(1)把控件pdf.ocx加入vc項目,并生成控件類
(2)把控件放置在對話框上,或者調(diào)用控件類的成員函數(shù)create創(chuàng)建控件對象
(3)調(diào)用控件的屬性或方法打開pdf文件
由于這不屬于本文要討論的內(nèi)容,詳情請參考《visual c++技術(shù)內(nèi)幕》中“使用activex控件”一章,這里不再贅述。
但是對于新版軟件(5.x/6.x/7.x),上述方法不再適用:新版控件不是一個完整意義上的activex控件,它缺少生成控件類所必需的類型庫信息,無法把控件加入vc項目。
在這種情況下,需要調(diào)用函數(shù)cwnd::createcontrol來創(chuàng)建控件對象,然后獲取控件的idispatch接口指針,通過該指針訪問控件的屬性及方法。
直接用idispatch指針調(diào)用控件的屬性及方法是一件極其繁瑣的工作,好在新版軟件提供了類型庫,可以用它生成一個自動化組件驅(qū)動類(從coledispatchdriver派生)。借助該類,可以大大簡化對控件屬性及方法的調(diào)用。
雖然可以用控件顯示pdf文件,但它只是一個代理,真正的工作還是由acrobat(reader)完成的,因此必須安裝這兩種軟件中的一個。
實現(xiàn)步驟
以下以acrobat(reader)5.x/6.x為例,介紹如何用新版控件實現(xiàn)pdf文件的顯示。
運行vc,新建一個基于對話框的mfc應(yīng)用程序viewpdf,在設(shè)置生成選項時,選中“activex controls”,其余使用缺省值即可。生成后,刪除對話框中的所有控件。
接下來創(chuàng)建自動化組件驅(qū)動類:打開類向?qū)Вc擊“add class”按鈕,在彈出的菜單中選擇“from a type library”,用類型庫文件pdf.tlb產(chǎn)生所需的組件類,該文件位于acrobat軟件安裝目錄下的activex子目錄。
編輯viewpdfdlg.h,為類cviewpdfdlg添加兩個數(shù)據(jù)成員:
對于acrobat(reader)7.x,實現(xiàn)步驟基本與上相同,區(qū)別在于:
(1) 使用acropdf.dll生成自動化組件驅(qū)動類,得到的類名為iacroaxdocshim,頭文件為acropdf.h。
(2) 創(chuàng)建控件窗口時,類id為acropdf.pdf.1。
除了上面用到的loadfile外,控件還提供了許多有用的方法,常見的有:
print 打印文件
setzoom 設(shè)置頁面的百分比
setshowtoolbar 顯示/隱藏工具欄
gotofirstpage 跳轉(zhuǎn)到第一頁
gotolastpage 跳轉(zhuǎn)到最后一頁
pdf是“portable document format 可移植文檔格式”的縮寫,它是adobe公司開發(fā)的一種電子文檔格式,已經(jīng)成為國際通用的電子文檔交換事實標(biāo)準(zhǔn)。pdf文件可以在各種平臺下閱讀、編輯、發(fā)布。該文件格式支持字體、圖像、甚至任何附件的嵌入。
adobe公司提供了兩種軟件用于處理pdf文檔,分別是acrobat及acrobat reader:前者功能強大,不僅能閱讀,還可以創(chuàng)建或編輯pdf文檔,但要收費;后者只具備閱讀功能,為免費軟件。
用activex控件顯示pdf文件
acrobat(reader)提供了一個activex控件pdf.ocx(7.x版本為acropdf.dll),可以在用戶程序中實現(xiàn)pdf文件的顯示。對于老版本的軟件(4.x及以前的版本),只需按照activex控件的標(biāo)準(zhǔn)編程步驟即可:
(1)把控件pdf.ocx加入vc項目,并生成控件類
(2)把控件放置在對話框上,或者調(diào)用控件類的成員函數(shù)create創(chuàng)建控件對象
(3)調(diào)用控件的屬性或方法打開pdf文件
由于這不屬于本文要討論的內(nèi)容,詳情請參考《visual c++技術(shù)內(nèi)幕》中“使用activex控件”一章,這里不再贅述。
但是對于新版軟件(5.x/6.x/7.x),上述方法不再適用:新版控件不是一個完整意義上的activex控件,它缺少生成控件類所必需的類型庫信息,無法把控件加入vc項目。
在這種情況下,需要調(diào)用函數(shù)cwnd::createcontrol來創(chuàng)建控件對象,然后獲取控件的idispatch接口指針,通過該指針訪問控件的屬性及方法。
直接用idispatch指針調(diào)用控件的屬性及方法是一件極其繁瑣的工作,好在新版軟件提供了類型庫,可以用它生成一個自動化組件驅(qū)動類(從coledispatchdriver派生)。借助該類,可以大大簡化對控件屬性及方法的調(diào)用。
雖然可以用控件顯示pdf文件,但它只是一個代理,真正的工作還是由acrobat(reader)完成的,因此必須安裝這兩種軟件中的一個。
實現(xiàn)步驟
以下以acrobat(reader)5.x/6.x為例,介紹如何用新版控件實現(xiàn)pdf文件的顯示。
運行vc,新建一個基于對話框的mfc應(yīng)用程序viewpdf,在設(shè)置生成選項時,選中“activex controls”,其余使用缺省值即可。生成后,刪除對話框中的所有控件。
接下來創(chuàng)建自動化組件驅(qū)動類:打開類向?qū)Вc擊“add class”按鈕,在彈出的菜單中選擇“from a type library”,用類型庫文件pdf.tlb產(chǎn)生所需的組件類,該文件位于acrobat軟件安裝目錄下的activex子目錄。
編輯viewpdfdlg.h,為類cviewpdfdlg添加兩個數(shù)據(jù)成員:
#include "pdf.h" // 組件類的頭文件
class cviewpdfdlg : public cdialog
{
protected:
_dpdf m_drvpdf; // pdf組件驅(qū)動對象,_dpdf是我們剛生成的組件類
cwnd m_wndpdf; // pdf控件窗口
... ...
在類成員函數(shù)cviewpdfdlg::oninitdialog中插入下列語句:
class cviewpdfdlg : public cdialog
{
protected:
_dpdf m_drvpdf; // pdf組件驅(qū)動對象,_dpdf是我們剛生成的組件類
cwnd m_wndpdf; // pdf控件窗口
... ...
// 為主窗口添加ws_clipchildren風(fēng)格,否則控件顯示不正常
modifystyle(0, ws_clipchildren);
// 獲取對話框的客戶區(qū)矩形
crect rt;
getclientrect(&rt);
// 利用cwnd::createcontrol創(chuàng)建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);
// 把獲得的接口指針傳遞給組件驅(qū)動對象m_drvpdf,通過它調(diào)用控件的屬性和方法
// 當(dāng)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所示。
圖1modifystyle(0, ws_clipchildren);
// 獲取對話框的客戶區(qū)矩形
crect rt;
getclientrect(&rt);
// 利用cwnd::createcontrol創(chuàng)建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);
// 把獲得的接口指針傳遞給組件驅(qū)動對象m_drvpdf,通過它調(diào)用控件的屬性和方法
// 當(dāng)m_drvpdf銷毀時,會自動釋放接口指針
m_drvpdf.attachdispatch(lpdispatch);
// 彈出一個“打開”對話框,選擇要顯示的pdf文件
cfiledialog dlg(true);
if (dlg.domodal() == idok)
// 利用控件的方法loadfile讀取并顯示pdf文件
m_drvpdf.loadfile(dlg.getpathname());
else
oncancel(); // 退出
對于acrobat(reader)7.x,實現(xiàn)步驟基本與上相同,區(qū)別在于:
(1) 使用acropdf.dll生成自動化組件驅(qū)動類,得到的類名為iacroaxdocshim,頭文件為acropdf.h。
(2) 創(chuàng)建控件窗口時,類id為acropdf.pdf.1。
除了上面用到的loadfile外,控件還提供了許多有用的方法,常見的有:
print 打印文件
setzoom 設(shè)置頁面的百分比
setshowtoolbar 顯示/隱藏工具欄
gotofirstpage 跳轉(zhuǎn)到第一頁
gotolastpage 跳轉(zhuǎn)到最后一頁
pdf介紹
pdf是“portable document format 可移植文檔格式”的縮寫,它是adobe公司開發(fā)的一種電子文檔格式,已經(jīng)成為國際通用的電子文檔交換事實標(biāo)準(zhǔn)。pdf文件可以在各種平臺下閱讀、編輯、發(fā)布。該文件格式支持字體、圖像、甚至任何附件的嵌入。
adobe公司提供了兩種軟件用于處理pdf文檔,分別是acrobat及acrobat reader:前者功能強大,不僅能閱讀,還可以創(chuàng)建或編輯pdf文檔,但要收費;后者只具備閱讀功能,為免費軟件。
用activex控件顯示pdf文件
acrobat(reader)提供了一個activex控件pdf.ocx(7.x版本為acropdf.dll),可以在用戶程序中實現(xiàn)pdf文件的顯示。對于老版本的軟件(4.x及以前的版本),只需按照activex控件的標(biāo)準(zhǔn)編程步驟即可:
(1)把控件pdf.ocx加入vc項目,并生成控件類
(2)把控件放置在對話框上,或者調(diào)用控件類的成員函數(shù)create創(chuàng)建控件對象
(3)調(diào)用控件的屬性或方法打開pdf文件
由于這不屬于本文要討論的內(nèi)容,詳情請參考《visual c++技術(shù)內(nèi)幕》中“使用activex控件”一章,這里不再贅述。
但是對于新版軟件(5.x/6.x/7.x),上述方法不再適用:新版控件不是一個完整意義上的activex控件,它缺少生成控件類所必需的類型庫信息,無法把控件加入vc項目。
在這種情況下,需要調(diào)用函數(shù)cwnd::createcontrol來創(chuàng)建控件對象,然后獲取控件的idispatch接口指針,通過該指針訪問控件的屬性及方法。
直接用idispatch指針調(diào)用控件的屬性及方法是一件極其繁瑣的工作,好在新版軟件提供了類型庫,可以用它生成一個自動化組件驅(qū)動類(從coledispatchdriver派生)。借助該類,可以大大簡化對控件屬性及方法的調(diào)用。
雖然可以用控件顯示pdf文件,但它只是一個代理,真正的工作還是由acrobat(reader)完成的,因此必須安裝這兩種軟件中的一個。
實現(xiàn)步驟
以下以acrobat(reader)5.x/6.x為例,介紹如何用新版控件實現(xiàn)pdf文件的顯示。
運行vc,新建一個基于對話框的mfc應(yīng)用程序viewpdf,在設(shè)置生成選項時,選中“activex controls”,其余使用缺省值即可。生成后,刪除對話框中的所有控件。
接下來創(chuàng)建自動化組件驅(qū)動類:打開類向?qū),點擊“add class”按鈕,在彈出的菜單中選擇“from a type library”,用類型庫文件pdf.tlb產(chǎn)生所需的組件類,該文件位于acrobat軟件安裝目錄下的activex子目錄。
編輯viewpdfdlg.h,為類cviewpdfdlg添加兩個數(shù)據(jù)成員:
對于acrobat(reader)7.x,實現(xiàn)步驟基本與上相同,區(qū)別在于:
(1) 使用acropdf.dll生成自動化組件驅(qū)動類,得到的類名為iacroaxdocshim,頭文件為acropdf.h。
(2) 創(chuàng)建控件窗口時,類id為acropdf.pdf.1。
除了上面用到的loadfile外,控件還提供了許多有用的方法,常見的有:
print 打印文件
setzoom 設(shè)置頁面的百分比
setshowtoolbar 顯示/隱藏工具欄
gotofirstpage 跳轉(zhuǎn)到第一頁
gotolastpage 跳轉(zhuǎn)到最后一頁
pdf是“portable document format 可移植文檔格式”的縮寫,它是adobe公司開發(fā)的一種電子文檔格式,已經(jīng)成為國際通用的電子文檔交換事實標(biāo)準(zhǔn)。pdf文件可以在各種平臺下閱讀、編輯、發(fā)布。該文件格式支持字體、圖像、甚至任何附件的嵌入。
adobe公司提供了兩種軟件用于處理pdf文檔,分別是acrobat及acrobat reader:前者功能強大,不僅能閱讀,還可以創(chuàng)建或編輯pdf文檔,但要收費;后者只具備閱讀功能,為免費軟件。
用activex控件顯示pdf文件
acrobat(reader)提供了一個activex控件pdf.ocx(7.x版本為acropdf.dll),可以在用戶程序中實現(xiàn)pdf文件的顯示。對于老版本的軟件(4.x及以前的版本),只需按照activex控件的標(biāo)準(zhǔn)編程步驟即可:
(1)把控件pdf.ocx加入vc項目,并生成控件類
(2)把控件放置在對話框上,或者調(diào)用控件類的成員函數(shù)create創(chuàng)建控件對象
(3)調(diào)用控件的屬性或方法打開pdf文件
由于這不屬于本文要討論的內(nèi)容,詳情請參考《visual c++技術(shù)內(nèi)幕》中“使用activex控件”一章,這里不再贅述。
但是對于新版軟件(5.x/6.x/7.x),上述方法不再適用:新版控件不是一個完整意義上的activex控件,它缺少生成控件類所必需的類型庫信息,無法把控件加入vc項目。
在這種情況下,需要調(diào)用函數(shù)cwnd::createcontrol來創(chuàng)建控件對象,然后獲取控件的idispatch接口指針,通過該指針訪問控件的屬性及方法。
直接用idispatch指針調(diào)用控件的屬性及方法是一件極其繁瑣的工作,好在新版軟件提供了類型庫,可以用它生成一個自動化組件驅(qū)動類(從coledispatchdriver派生)。借助該類,可以大大簡化對控件屬性及方法的調(diào)用。
雖然可以用控件顯示pdf文件,但它只是一個代理,真正的工作還是由acrobat(reader)完成的,因此必須安裝這兩種軟件中的一個。
實現(xiàn)步驟
以下以acrobat(reader)5.x/6.x為例,介紹如何用新版控件實現(xiàn)pdf文件的顯示。
運行vc,新建一個基于對話框的mfc應(yīng)用程序viewpdf,在設(shè)置生成選項時,選中“activex controls”,其余使用缺省值即可。生成后,刪除對話框中的所有控件。
接下來創(chuàng)建自動化組件驅(qū)動類:打開類向?qū),點擊“add class”按鈕,在彈出的菜單中選擇“from a type library”,用類型庫文件pdf.tlb產(chǎn)生所需的組件類,該文件位于acrobat軟件安裝目錄下的activex子目錄。
編輯viewpdfdlg.h,為類cviewpdfdlg添加兩個數(shù)據(jù)成員:
#include "pdf.h" // 組件類的頭文件
class cviewpdfdlg : public cdialog
{
protected:
_dpdf m_drvpdf; // pdf組件驅(qū)動對象,_dpdf是我們剛生成的組件類
cwnd m_wndpdf; // pdf控件窗口
... ...
在類成員函數(shù)cviewpdfdlg::oninitdialog中插入下列語句:
class cviewpdfdlg : public cdialog
{
protected:
_dpdf m_drvpdf; // pdf組件驅(qū)動對象,_dpdf是我們剛生成的組件類
cwnd m_wndpdf; // pdf控件窗口
... ...
// 為主窗口添加ws_clipchildren風(fēng)格,否則控件顯示不正常
modifystyle(0, ws_clipchildren);
// 獲取對話框的客戶區(qū)矩形
crect rt;
getclientrect(&rt);
// 利用cwnd::createcontrol創(chuàng)建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);
// 把獲得的接口指針傳遞給組件驅(qū)動對象m_drvpdf,通過它調(diào)用控件的屬性和方法
// 當(dāng)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所示。
圖1modifystyle(0, ws_clipchildren);
// 獲取對話框的客戶區(qū)矩形
crect rt;
getclientrect(&rt);
// 利用cwnd::createcontrol創(chuàng)建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);
// 把獲得的接口指針傳遞給組件驅(qū)動對象m_drvpdf,通過它調(diào)用控件的屬性和方法
// 當(dāng)m_drvpdf銷毀時,會自動釋放接口指針
m_drvpdf.attachdispatch(lpdispatch);
// 彈出一個“打開”對話框,選擇要顯示的pdf文件
cfiledialog dlg(true);
if (dlg.domodal() == idok)
// 利用控件的方法loadfile讀取并顯示pdf文件
m_drvpdf.loadfile(dlg.getpathname());
else
oncancel(); // 退出
對于acrobat(reader)7.x,實現(xiàn)步驟基本與上相同,區(qū)別在于:
(1) 使用acropdf.dll生成自動化組件驅(qū)動類,得到的類名為iacroaxdocshim,頭文件為acropdf.h。
(2) 創(chuàng)建控件窗口時,類id為acropdf.pdf.1。
除了上面用到的loadfile外,控件還提供了許多有用的方法,常見的有:
print 打印文件
setzoom 設(shè)置頁面的百分比
setshowtoolbar 顯示/隱藏工具欄
gotofirstpage 跳轉(zhuǎn)到第一頁
gotolastpage 跳轉(zhuǎn)到最后一頁
熱門點擊
- CPLD開發(fā)板和FPGA開發(fā)板的區(qū)別
- 基于FPGA和AD1836的I2S接口設(shè)計
- vc中如何使用設(shè)備描述表
- Visual C++中調(diào)用DLL實現(xiàn)數(shù)據(jù)加密
- Visual C++6.0 API函數(shù)操作技
- JavaCard CPU的設(shè)計與FPGA實現(xiàn)
- VC++中進程與多進程管理的方法
- 如何用C語言開發(fā)DSP嵌入式系統(tǒng)
- C和C++ 字符串字面量的比較
- Xilinx針對Virtex-5 FXT F
推薦技術(shù)資料
- 聲道前級設(shè)計特點
- 與通常的Hi-Fi前級不同,EP9307-CRZ這臺分... [詳細(xì)]
- 扇出型面板級封裝(FOPLP)
- 全球首款無掩模光刻系統(tǒng)—DSP
- 紫光閃存E5200 PCIe 5.0 企業(yè)級
- NAND Flash 技術(shù)和系
- 高性能DIMM 內(nèi)存數(shù)據(jù)技術(shù)封
- PCIe Gen4 SSD主控
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究