1 PDF介绍
       PDF是“Portable Document Format 可移植文档格式”的缩写,它是Adobe公司开发的一种电子文档格式,已经成为国际通用的电子文档交换事实标准。PDF文件可以在各种平台下阅读、编辑、发布。该文件格式支持字体、图像、甚至任何附件的嵌入。
       Adobe公司提供了两种软件用于处理PDF文档,分别是Acrobat及Acrobat Reader:前者功能强大,不仅能阅读,还可以创建或编辑PDF文档,但要收费;后者只具备阅读功能,为免费软件。
2 用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)完成的,因此必须安装这两种软件中的一个。
3 实现步骤
       以下以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();        // 退出对于Acrobat(Reader)7.x,实现步骤基本与上相同,区别在于:
      (1) 使用AcroPDF.dll生成自动化组件驱动类,得到的类名为IAcroAXDocShim,头文件为acropdf.h。
      (2) 创建控件窗口时,类ID为AcroPDF.PDF.1。
       除了上面用到的LoadFile外,控件还提供了许多有用的方法,常见的有:
                   Print                             打印文件
                   setZoom                       设置页面的百分比
                   setShowToolbar       显示/隐藏工具栏
                   gotoFirstPage               跳转到第一页
                   gotoLastPage                跳转到最后一页
                   gotoNextPage              跳转到下一页
                   gotoPreviousPage              跳转到上一页
       由于用法很简单,这里不再一一叙述。

解决方案 »

  1.   

    pdf转图片,  .net版本的 很多vc的少用管道通信, 和.net的通信
      

  2.   

    1楼的没用,那个是很简单,只是控件编程而已,所有任务还是交给Adobe的软件(Acrobat或者reader)去完成。也可以用FoxitReader写,还是需要控件。我和楼主的想法一样,需要自己写一个读取PDF文件的程序。我目前的列子VC++6.0写的:
    1.对话框上放置一个Eidt控件,用于显示读取的PDF内容,并添加控件变量:CEdit m_editShowPDF;
    2.相应IDOK的消息处理函数
    CFileDialog lv_fileDialog(true,"pdf","PDF",OFN_HIDEREADONLY |   OFN_OVERWRITEPROMPT,_TEXT("PDF(*.pdf)|*.pdf||"),0);
    if(IDOK!=lv_fileDialog.DoModal())
    {
    return ;
    } CString lv_fileName=lv_fileDialog.GetPathName();
    //m_editShowPDF.SetWindowText(lv_fileName);
    ifstream f1(lv_fileName);           //打开文件用于写,若文件不存在就创建它
    if(!f1)
    {
    MessageBox("打开失败!");
    return ;
    }
    char buf[100];
    memset(buf,0,100);
    f1.read(buf,strlen(buf));
    CString str;
    str.Format("%d",buf);
    m_editShowPDF.SetWindowText(str);
    f1.close();
    }
    3.添加头文件#include<fstream.h>
    4.自己写两个Word文件,用Acrobat9.0转化为PDF文件。比如第一个文件内容为Test File;第二个内容为123456789;问题是读出的数据都是1242000.
    那个大神帮忙解疑?谢谢!
      

  3.   

    pdf parse 不是很难,难的是 pdf 里 用的压缩方法 太多。不容易 搞定。
      

  4.   

    有方便的控件还是使用控件。这样方便安全!!!
    不然pdf的算法就够你受到!!
      

  5.   

    PDF有开源的代码你可以找找看
      

  6.   

    对于这种连提问都抄袭别人的人,最好的办法就是不要理他。
    http://bbs.csdn.net/topics/320198723
      

  7.   

    我用pdf转图片的动态库,要的留个邮箱
      

  8.   

    是他抄袭我 邮箱[email protected]