说明:例程是在WIN7旗舰版32位系统上用VS2010编译运行; 习惯用VC6.0开发工控软件,所以也用VS2010封闭了一个动态库(在文尾供会员下载),方便VC6.0 调用
一获取头文件及静态库文件. 从官网下载开源项目mupdf-1.9a-source.tar.gz ,下载于2016 10月12日, 防止以后官网变更,项目源码mupdf-1.9a-source.zip分享在文尾 百度网盘 为以后提供方便. mupdf-1.9a-source\platform\x11为win32工程源文件存放片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.以默认设置新建一对话框程序,在主对话框包含头文件及库文件 - #pragma once
- #include "mupdf/fitz.h"
- #include "mupdf/pdf.h"
- #pragma comment(lib,"_lib/mupdf/libmupdf.lib")
- #pragma comment(lib,"_lib/mupdf/libthirdparty.lib")
- #pragma comment(lib,"_lib/mupdf/libfonts.lib")
- #pragma comment(lib,"_lib/mupdf/libglfw.lib")
复制代码
2.复制根目录的PDF头文件及库文件的文件夹_include, _lib到自己工程根目录 3.设置PDF头文件目录->定位到文件夹_include 4.设置运行库为MTD, 因为例程4个静态库是基于mtd生成(也可自己再生成其他格式) 5.设置在静态库中使用MFC 6.添加一自定义函数 - char* GetMyPath()
- {
- charMyPath[_MAX_PATH];
- GetModuleFileNameA(NULL,MyPath,_MAX_PATH);
- CStringA sPath(MyPath);
- sPath=sPath.Left(sPath.ReverseFind('\\')+1);
- strcpy(MyPath,sPath.GetBuffer(0) );
- return MyPath;
- }
复制代码
再添加一按钮<转换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也少;
再进行设置忽略特定默认库,编译通过!! 7.执行程序,提示不能打开文件,我们在例程程序的根目录准备一文件 1.pdf, 根目录在这里是指exe文件所在的Debug,或Release文件夹,再次执行程序,点击按钮会在根目录生成图片; 例程工程ForTest.zip 在文尾百度网盘 下载;
三.功能齐全PDF阅读软件源代码(在文尾百度网盘 下载) 效果展示 : 当前例程实现PDF阅读器功能,文档操作通过鼠标及一系列快捷键完成,效果如图
PDF阅读软件的实现非常简单,仅需调用CPDF类的几个函数就可 - class CPDF
- {
- public:
- void SetShowFrame(HWND hWnd,RECT &rc);//在指定窗口的指定矩形显示文档
- void OpenFile(char *FilePathName);//打开文档
- void ClosePdf();//关闭PDF文档
- void OnSize(UINT nType, int cx, int cy);//窗口消息WM_SIZE处理函数调用;
- void OnPaint();//窗口绘制OnPaint,OnDraw()中调用
- void OnMouse(ONMOUSE OnMouse,CPoint pt,short zDelta=0);//处理各种鼠标事件
- void OnKey(int c);//键盘事件处理
- char * GetUsage();//获取使用快捷键
- GETINPUTPASS *pGetInpuPass;//用户输入密码函数,外部初始化使用
- }
复制代码
例程根目录有 '例程操作快捷键' 及 一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() 实现用鼠标对文档的平移翻页,缩放等各种操作 - void CWrapDlg::OnLButtonDown(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(LButtonDown,point);
- CDialogEx::OnLButtonDown(nFlags, point);
- }
- void CWrapDlg::OnLButtonUp(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(LButtonUp,point);
- CDialogEx::OnLButtonUp(nFlags, point);
- }
- void CWrapDlg::OnMButtonDown(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(MButtonDown,point);
- CDialogEx::OnMButtonDown(nFlags, point);
- }
- void CWrapDlg::OnMButtonUp(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(MButtonUp,point);
- CDialogEx::OnMButtonUp(nFlags, point);
- }
- void CWrapDlg::OnRButtonDown(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(RButtonDown,point);
- CDialogEx::OnRButtonDown(nFlags, point);
- }
- void CWrapDlg::OnRButtonUp(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(RButtonUp,point);
- CDialogEx::OnRButtonUp(nFlags, point);
- }
- BOOLCWrapDlg::OnMouseWheel(UINT nFlags, short zDelta, CPointpt)
- {
- m_PDF.OnMouse(MouseWheel,pt,zDelta);
- return CDialogEx::OnMouseWheel(nFlags,zDelta, pt);
- }
- void CWrapDlg::OnMouseMove(UINT nFlags,CPoint point)
- {
- m_PDF.OnMouse(MouseMove,point);
- CDialogEx::OnMouseMove(nFlags, point);
- }
复制代码
7.例程还可以使用过键盘,通过 快捷键对文档进行查找,旋转,等各种操作 添加对话框的PreTranslateMessage()函数,在函数体内获取系统键,及字符 - BOOL CWrapDlg::PreTranslateMessage(MSG* pMsg)
- {
- if(pMsg->message== WM_KEYDOWN)
- {
- switch(pMsg->wParam)
- {
- caseVK_LEFT:
- caseVK_UP:
- caseVK_RIGHT:
- caseVK_DOWN:
- caseVK_PRIOR:
- caseVK_NEXT:
- caseVK_F1:
- caseVK_ESCAPE:
- case VK_RETURN:
- caseVK_HOME:
- caseVK_END:
- m_PDF.OnKey(pMsg->wParam+ 256);
- returnTRUE;
- }
- }
- elseif(pMsg->message == WM_CHAR)
- {
- if(pMsg->wParam<256) {
- m_PDF.OnKey(pMsg->wParam);
- returnTRUE;
- }
- }
- if(pMsg->message== WM_KEYDOWN && pMsg->wParam==VK_RETURN )
- returnTRUE;
- returnCDialogEx::PreTranslateMessage(pMsg);
- }
复制代码
8.对加密的文档,例程还会弹出密码输入框,供用户输入密码,具体参考例程主对话框中的函数 - int GetInputPassWord(char *pChar)
- {
- CPassDlg dlg;
- int nReturn;
- nReturn = dlg.DoModal();
- if( IDOK == nReturn)
- {
- WideCharToMultiByte(CP_UTF8, 0,dlg.m_sPassword.GetBuffer(0), -1, pChar, _MAX_PATH, NULL, NULL);
- return IDOK;
- }
- return nReturn;
- }
复制代码 如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料! 下载地址:
|