zoukankan      html  css  js  c++  java
  • 用Visual C++实现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 跳转到上一页
     
  • 相关阅读:
    poj 2584 T-Shirt Gumbo (二分匹配)
    hdu 1757 A Simple Math Problem (乘法矩阵)
    矩阵之矩阵乘法(转载)
    poj 2239 Selecting Courses (二分匹配)
    hdu 3661 Assignments (贪心)
    hdu 1348 Wall (凸包)
    poj 2060 Taxi Cab Scheme (二分匹配)
    hdu 2202 最大三角形 (凸包)
    hdu 1577 WisKey的眼神 (数学几何)
    poj 1719 Shooting Contest (二分匹配)
  • 原文地址:https://www.cnblogs.com/tyjsjl/p/2156131.html
Copyright © 2011-2022 走看看