用Visual C++实现PDF文件的显示
发布时间:2008/8/23 0:00:00 访问次数:585
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添加两个数据成员:
对于acrobat(reader)7.x,实现步骤基本与上相同,区别在于:
(1) 使用acropdf.dll生成自动化组件驱动类,得到的类名为iacroaxdocshim,头文件为acropdf.h。
(2) 创建控件窗口时,类id为acropdf.pdf.1。
除了上面用到的loadfile外,控件还提供了许多有用的方法,常见的有:
print 打印文件
setzoom 设置页面的百分比
setshowtoolbar 显示/隐藏工具栏
gotofirstpage 跳转到第一页
gotolastpage 跳转到最后一页
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中插入下列语句:
class cviewpdfdlg : public cdialog
{
protected:
_dpdf m_drvpdf; // pdf组件驱动对象,_dpdf是我们刚生成的组件类
cwnd m_wndpdf; // pdf控件窗口
... ...
// 为主窗口添加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所示。
图1modifystyle(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(); // 退出
对于acrobat(reader)7.x,实现步骤基本与上相同,区别在于:
(1) 使用acropdf.dll生成自动化组件驱动类,得到的类名为iacroaxdocshim,头文件为acropdf.h。
(2) 创建控件窗口时,类id为acropdf.pdf.1。
除了上面用到的loadfile外,控件还提供了许多有用的方法,常见的有:
print 打印文件
setzoom 设置页面的百分比
setshowtoolbar 显示/隐藏工具栏
gotofirstpage 跳转到第一页
gotolastpage 跳转到最后一页
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添加两个数据成员:
对于acrobat(reader)7.x,实现步骤基本与上相同,区别在于:
(1) 使用acropdf.dll生成自动化组件驱动类,得到的类名为iacroaxdocshim,头文件为acropdf.h。
(2) 创建控件窗口时,类id为acropdf.pdf.1。
除了上面用到的loadfile外,控件还提供了许多有用的方法,常见的有:
print 打印文件
setzoom 设置页面的百分比
setshowtoolbar 显示/隐藏工具栏
gotofirstpage 跳转到第一页
gotolastpage 跳转到最后一页
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中插入下列语句:
class cviewpdfdlg : public cdialog
{
protected:
_dpdf m_drvpdf; // pdf组件驱动对象,_dpdf是我们刚生成的组件类
cwnd m_wndpdf; // pdf控件窗口
... ...
// 为主窗口添加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所示。
图1modifystyle(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(); // 退出
对于acrobat(reader)7.x,实现步骤基本与上相同,区别在于:
(1) 使用acropdf.dll生成自动化组件驱动类,得到的类名为iacroaxdocshim,头文件为acropdf.h。
(2) 创建控件窗口时,类id为acropdf.pdf.1。
除了上面用到的loadfile外,控件还提供了许多有用的方法,常见的有:
print 打印文件
setzoom 设置页面的百分比
setshowtoolbar 显示/隐藏工具栏
gotofirstpage 跳转到第一页
gotolastpage 跳转到最后一页
上一篇:vc中如何使用设备描述表