当前位置:首页 > 工业控制 > 电子设计自动化
[导读]PDF介绍PDF是“Portable Document Format 可移植文档格式”的缩写,它是Adobe公司开发的一种电子文档格式,已经成为国际通用的电子文档交换事实标准。PDF文件可以在各种平台下阅读、编辑、发布。该文件格式支持字体、

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 跳转到上一页



来源:ks991次

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

会话层(Session)是建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。

关键字: 会话层 传输层 文件

摘要:针对信息系统自身安全需求及威胁行为特征,提出了基于云架构的分级威胁防御机制。该机制将信息系统作为一个整体进行威胁防护,将文件访问异常行为作为判断威胁的依据,并针对信息系统终端安全分级设计了不同的文件访问行为模型,然...

关键字: 信息系统 威胁 文件 云架构 分级

Linux一个重要的哲学是:一切皆文件。而文件与文件系统是密切相关的,本篇笔记我们来一起学习、理清那些令我们眼花缭乱的文件系统。

关键字: Linux 文件系统 文件

Visual Studio Code在开发人员中非常受欢迎,当然也包括在RTI公司工作的许多人。然而,DDS开发人员一直期待拥有一项极有价值的功能特性,这就是——精准地高亮(Highlight)数据类型。毫无疑问,这是很...

关键字: visual tudio rti

密码这东西真是让人又爱又恨,你的东西传到别人手里的时候,你恨不得密码让人破解一万年,别人的东西到你手里的时候,你巴不得他只会设个123456,比如我们经常会遇到加了密的PDF文件……

关键字: pdf 软件

我们在使用linux时,提示 Could not get lock /var/lib/dpkg/lock 报错?

关键字: Linux 文件

从Visual Studio 2019 v16.8 Preview 3开始,我们在WSL(Linux的Windows子系统)或远程Linux系统上添加了对Linux Core Dump的调试支持。 此支持仅适用于非托管代...

关键字: visual studio Linux core dump

  在Windows中打开一个文件时,系统会自动调用相应的程序来打开它。但有时我们不想用这个程序来打开这个文件,这就得改变文件和程序的关联,《电脑报》上有一些改动关联的方法,但通过修改注册表,也可以找

关键字: 文件 程序 关联方法

Android上可能有很多文件浏览器,但是对于应用程序,没有太多选择。 由于用户使用同一类型应用程序的方式可能非常不同,因此在对书签问题进行故障排除时,只有一项额外功能或缺少功能会中断交易。 如果您有一个新的文件浏览器,...

关键字: Android 文件 ultra explorer

Visual Studio Code 1.48 稳定版(即 2020 年 7 月更新)已发布。此版本更新亮点包括:同步设置到稳定版 - 现在可以在稳定版中预览同步设置更新扩展视图菜单 - 简化菜单,附

关键字: code studio visual
关闭
关闭