QQ登录

只需一步,快速开始

开源PDF阅读软件源代码VC2010编写基于MFC无需额外DLL几行代码直接使用

[ 复制链接 ]
说明:例程是在WIN7旗舰版32位系统上用VS2010编译运行;
习惯用VC6.0开发工控软件,所以也用VS2010封闭了一个动态库(在文尾供会员下载),方便VC6.0 调用
可以下载测试 VC6.0生成的例程 百度云附件:PDF阅读器(使用VC6.0基于MFC创建.zip   

一获取头文件及静态库文件.
从官网下载开源项目mupdf-1.9a-source.tar.gz ,下载于2016 1012, 防止以后官网变更,项目源码mupdf-1.9a-source.zip分享在文尾 百度网盘 为以后提供方便.
mupdf-1.9a-source\platform\x11win32工程源文件存放片mupdf-1.9a-source\platform\win32为项目工程文件存放处,.
双击文件libmupdf.vcxproj(工程转换所得),编译就可得到四个LIB文件,4个静态库文件结合mupdf-1.9a-source\include\mupdf下头文件就可编写PDF相关程序
为学习方便,整理出win32 阅读器源代码’win32  PDF阅读器.zip’ 在文尾 百度网盘 下载,附带快捷键.txt ‘  效果可打开文件夹Release下程序123.exe,结合 快捷键 操作.阅读器代码可打开文件pdfapp.cpp, pdfapp.h, win_main.cpp学习
.简单使用(打开PDF文件,将指定页面保存为png图片)
1.以默认设置新建一对话框程序,在主对话框包含头文件及库文件
  1. #pragma once
  2. #include "mupdf/fitz.h"
  3. #include "mupdf/pdf.h"
  4. #pragma comment(lib,"_lib/mupdf/libmupdf.lib")
  5. #pragma comment(lib,"_lib/mupdf/libthirdparty.lib")
  6. #pragma comment(lib,"_lib/mupdf/libfonts.lib")
  7. #pragma comment(lib,"_lib/mupdf/libglfw.lib")
复制代码

2.复制根目录的PDF头文件及库文件的文件夹_include,  _lib到自己工程根目录
3.设置PDF头文件目录->定位到文件夹_include
1.jpg
4.设置运行库为MTD, 因为例程4个静态库是基于mtd生成(也可自己再生成其他格式)
2.jpg
5.设置在静态库中使用MFC
1.jpg
6.添加一自定义函数
  1. char* GetMyPath()
  2. {
  3.        charMyPath[_MAX_PATH];
  4.        GetModuleFileNameA(NULL,MyPath,_MAX_PATH);
  5.        CStringA sPath(MyPath);
  6.        sPath=sPath.Left(sPath.ReverseFind('\\')+1);
  7.        strcpy(MyPath,sPath.GetBuffer(0) );
  8.        return MyPath;
  9. }
复制代码

再添加一按钮<转换PDF页面为PNG图片>关联点击函数,编译运行.
出现一箩筐重复定义错误, LNK2005: __set_invalid_parameter_handler 已经在libcmtd.lib(invarg.obj) 中定义        
C:\Users\baikhgmv\Desktop\ForTest\libcmt.lib(invarg.obj)  ForTest
相比还是VC6.0好,  VC6.0在简洁,速度,占用磁盘大小各方面都胜出很多,bug也少;

再进行设置忽略特定默认库,编译通过!!
1.jpg
7.执行程序,提示不能打开文件,我们在例程程序的根目录准备一文件 1.pdf, 根目录在这里是指exe文件所在的Debug,Release文件夹,再次执行程序,点击按钮会在根目录生成图片;
例程工程ForTest.zip 在文尾百度网盘 下载;



.功能齐全PDF阅读软件源代码(在文尾百度网盘 下载)
效果展示 :
当前例程实现PDF阅读器功能,文档操作通过鼠标及一系列快捷键完成,效果如图
1.jpg

PDF阅读软件的实现非常简单,仅需调用CPDF类的几个函数就可
  1. class CPDF
  2. {
  3. public:
  4.         void    SetShowFrame(HWND hWnd,RECT &rc);//在指定窗口的指定矩形显示文档
  5.         void    OpenFile(char *FilePathName);//打开文档
  6.         void    ClosePdf();//关闭PDF文档
  7.         void    OnSize(UINT nType, int cx, int cy);//窗口消息WM_SIZE处理函数调用;
  8.         void    OnPaint();//窗口绘制OnPaint,OnDraw()中调用
  9.         void    OnMouse(ONMOUSE OnMouse,CPoint pt,short zDelta=0);//处理各种鼠标事件
  10.         void    OnKey(int c);//键盘事件处理
  11.         char *  GetUsage();//获取使用快捷键
  12.         GETINPUTPASS    *pGetInpuPass;//用户输入密码函数,外部初始化使用
  13. }
复制代码



例程根目录有 '例程操作快捷键'
PDF测试文档,  其加密密码为11。

快捷键操作为:
文件操作:
========================
q          关闭文档
r          重新打开当前文档
S(大写)     保存当前打开文档
p          单击下翻页(浏览展示)
页面操作:

========================
+=        放大页面
-          缩小页面
W(大写)     水平匹配页面与窗口宽
H          垂直匹配页面与窗口高
Z          页面与窗口大小匹配
L          顺时针90度旋转页面
R          逆时针90度旋转页面
a          逆时针15度旋转页面
s           顺时针15度旋转页面(调试版)
f          窗口全屏
w          调窗口大小为页面大小
c          页面颜色黑白转换
i          页面颜色反转
C(大写)     色彩加深(效果不明显)
[          字体减小(效果不明显)
]          字体加大
移动操作:
========================
h<Left>   滚左
j<Down>   滚下
k<Up>     滚上
l<Right>  滚右
.                                   下页(展示页底)
,                                   前页(展示页头)
<ageDown><Space>(空格)          下页
b<Backspace><ageUp>            前页
>                                   10(展示页头)
<                                   10(展示页头)
g<Home>   首页
G<End>    尾页
123g       定位到123
123<回车>   定位到123
查询:
========================
/          向后查询
? F1      向前查询
n          往前查看查询结果
N          往后查看查询结果
<ESC>       退出查找
鼠标操作:
========================
鼠标左键:         点住 任意手动文档,点击链接
鼠标中键:          上下滚动
Shift+鼠标中键:    左右滚动
Ctrl+ 鼠标中键:    放大缩小
书签:
========================
m          标记页面,用快捷键 t 访问,例程共 255
t          往前逐个访问标记页面
1m         设置当前页为书签1,例程书签共10 0--9
1t         打开书签1指向的页面1


实现过程:
1.新建一基于对话框的工程;
2.例程集成一个PDF文档操作类CPDF ,其对应文件为PDF.cpp,PDF.h, 将其复制到自己工程根目录,且载入到工程中.  
依照前面介绍将,复制例程根目录文件夹_include,   _lib到自己工程根目录,设置PDF头文件目录->定位到文件夹_include
3.在主对话框头文件中包含#include "DF.h"
且添加一CPDF文档操作类的实例CPDF m_PDF;
4.在不对话框中初始化函数OnInitDialog()中添加m_PDF.SetShowFrame(m_hWnd,CRect(0,0,0,0)); 设置一下PDF文件显示的窗口,后面打开的PDF文档就会在此对话框上显示;
5.后面就可调用m_PDF.OpenFile(“文件绝对路径” );m_PDF.ClosePdf();
进行文档的打开及关闭操作了,记得在对话框OnPaint()函数中调用
m_PDF.OnPaint();将打开的文档显示出来
6.文档打开后肯定要对文档进行平移,翻页,调节页面大小等操作,所以我们再进一步下面操作
添加对话框WM_SIZE处理函数OnSize(),里面调用m_PDF.OnSize(nType,cx, cy);
实现窗口调节大小时,PDF文档也随之调节大小;
添加对话框鼠标右键点击,放开, 左键点击,放开,中键点击,放开,鼠标滚轮,鼠标移动和消息处理函数,在函数内调用m_PDF.OnMouse() 实现用鼠标对文档的平移翻页,缩放等各种操作
  1. void CWrapDlg::OnLButtonDown(UINT nFlags,CPoint point)
  2. {
  3.        m_PDF.OnMouse(LButtonDown,point);
  4.        CDialogEx::OnLButtonDown(nFlags, point);
  5. }
  6. void CWrapDlg::OnLButtonUp(UINT nFlags,CPoint point)
  7. {
  8.        m_PDF.OnMouse(LButtonUp,point);
  9.        CDialogEx::OnLButtonUp(nFlags, point);
  10. }
  11. void CWrapDlg::OnMButtonDown(UINT nFlags,CPoint point)
  12. {
  13.        m_PDF.OnMouse(MButtonDown,point);
  14.        CDialogEx::OnMButtonDown(nFlags, point);
  15. }
  16. void CWrapDlg::OnMButtonUp(UINT nFlags,CPoint point)
  17. {
  18.        m_PDF.OnMouse(MButtonUp,point);
  19.        CDialogEx::OnMButtonUp(nFlags, point);
  20. }
  21. void CWrapDlg::OnRButtonDown(UINT nFlags,CPoint point)
  22. {
  23.        m_PDF.OnMouse(RButtonDown,point);
  24.        CDialogEx::OnRButtonDown(nFlags, point);
  25. }
  26. void CWrapDlg::OnRButtonUp(UINT nFlags,CPoint point)
  27. {
  28.        m_PDF.OnMouse(RButtonUp,point);
  29.        CDialogEx::OnRButtonUp(nFlags, point);
  30. }
  31. BOOLCWrapDlg::OnMouseWheel(UINT nFlags, short zDelta, CPointpt)
  32. {
  33.        m_PDF.OnMouse(MouseWheel,pt,zDelta);
  34.        return CDialogEx::OnMouseWheel(nFlags,zDelta, pt);
  35. }
  36. void CWrapDlg::OnMouseMove(UINT nFlags,CPoint point)
  37. {
  38.        m_PDF.OnMouse(MouseMove,point);
  39.        CDialogEx::OnMouseMove(nFlags, point);
  40. }
复制代码

7.例程还可以使用过键盘,通过 快捷键对文档进行查找,旋转,等各种操作
添加对话框的PreTranslateMessage()函数,在函数体内获取系统键,及字符
  1. BOOL CWrapDlg::PreTranslateMessage(MSG* pMsg)
  2. {
  3.        if(pMsg->message== WM_KEYDOWN)
  4.        {
  5.               switch(pMsg->wParam)
  6.               {
  7.               caseVK_LEFT:
  8.               caseVK_UP:
  9.               caseVK_RIGHT:
  10.               caseVK_DOWN:
  11.               caseVK_PRIOR:
  12.               caseVK_NEXT:
  13.               caseVK_F1:
  14.               caseVK_ESCAPE:
  15.               case VK_RETURN:
  16.               caseVK_HOME:
  17.               caseVK_END:
  18.                      m_PDF.OnKey(pMsg->wParam+ 256);
  19.                      returnTRUE;
  20.               }
  21.        }
  22.        elseif(pMsg->message == WM_CHAR)
  23.        {
  24.               if(pMsg->wParam<256)         {
  25.                      m_PDF.OnKey(pMsg->wParam);
  26.                      returnTRUE;
  27.               }
  28.        }
  29.        if(pMsg->message== WM_KEYDOWN && pMsg->wParam==VK_RETURN )
  30.                      returnTRUE;
  31.        returnCDialogEx::PreTranslateMessage(pMsg);
  32. }
复制代码

8.对加密的文档,例程还会弹出密码输入框,供用户输入密码,具体参考例程主对话框中的函数
  1. int GetInputPassWord(char *pChar)
  2. {
  3.        CPassDlg dlg;
  4.        int nReturn;
  5.        nReturn = dlg.DoModal();
  6.        if( IDOK ==  nReturn)
  7.        {
  8.               WideCharToMultiByte(CP_UTF8, 0,dlg.m_sPassword.GetBuffer(0), -1, pChar, _MAX_PATH, NULL, NULL);
  9.               return IDOK;
  10.        }
  11.        return nReturn;
  12. }
复制代码
  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  
下载地址:
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:开源PDF阅读软件源代码VC2010编写基于MFC无需额外DLL几行代码直接使用.txt 
文件大小:50 Bytes  售价:48金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

回复

使用道具 举报

快速回复 返回列表 客服中心 搜索