基于MuPDF和Qt的PDF阅读器的开发

一、引言

设备上要渲染显示PDF文档,类似Adobe Reader、福昕阅读器等软件。如何去实现?Handling PDF这篇文档讨论介绍了在Qt应用程序中各种操作PDF的资料。从资料中看出,我们是要阅读渲染PDF文档到我们的设备中,关键还要能交叉编译移植到我们的设备上。在渲染显示方面整体给出三种方案:
- QtPDF(基于PDFium),不太好交叉编译。
- poppler-qt,与我们设备操作系统版本匹配的版本bug太多。
- muPDF,非常成熟,很多产品上都已使用,格式支持丰富,方便交叉编译。

最终选muPDF库来实现。

二、muPDF下载和编译

muPDF官网,muPDF-1.12.0源码下载。

1、交叉编译iMX6-ARM版本

修改Makerules

...
157:
158: ifeq "$(OS)" "imx6-linux"
159: CCPATH = /opt/linaro-14.04/gcc-linaro-arm-linux-gnueabihf-4.8/bin
160: CC = $(CCPATH)/arm-linux-gnueabihf-gcc
161: LD = $(CCPATH)/arm-linux-gnueabihf-gcc
162: AR = $(CCPATH)/arm-linux-gnueabihf-ar
163: CROSSCOMPILE=yes
164: HAVE_GLUT := no
165: HAVE_PTHREAD := yes
166: SYS_PTHREAD_CFLAGS :=
167: SYS_PTHREAD_LIBS := -lpthread
168: HAVE_X11 := yes
169: SYS_X11_CFLAGS += -I/opt/linaro-14.04/usr/include
170: SYS_X11_LIBS += -L/opt/linaro-14.04/usr/lib/arm-linux-gnueabihf -lX11 -lXext -lxcb -lXau -lXdmcp -lpthread
171: endif
172:
...

执行命令:make generate && make OS=imx6-linux HAVE_GLUT=no -j32
最后源码目录的build/release/下生成四个库文件和多个二进制程序工具。libcurl.a libmupdf.a libmupdfthird.a libmuthreads.a mjsgen mujstest mupdf-x11 mupdf-x11-curl muraster mutool

使用的时候把四个库放到Qt工程里面使用,curl又依赖libcrypto.a库,所以去交叉编译工具链下找到libcrypto.a放进去。

2、编译win版本

用VS打开源码目录下的platform/win32/mupdf.sln,把所有工程中的属性--配置属性--C/C++--代码生成--运行库改为多线程调试DLL(/MDd)
编译mupdf生成三个库libmupdf.lib、libthirdparty.lib,编译libresources工程,生成libresources.lib,目前项目需要这三个库就够了。

三、使用muPDF库

其实重点在于如何使用muPDF库,这个库的API实在是难用,也没有帮助文档,只能看它提供的例子或这小工具的源码来学习。
先看工程目录结构:

main.cpp
mainwindow.h
mainwindow.cpp
mupdfdocument.h
mupdfdocument_p.h
mupdfdocument.cpp
mupdfpage.h
mupdfpage_p.h
mupdfpage.cpp
pagerender.h
pagerender.cpp
sequentialpagewidget.h
sequentialpagewidget.cpp

mupdfdocument:主要实现加载文档,提供文档信息功能。对mupdf接口封装主要实现在mupdfdocument_p里面;
mupdfpage和mupdfpage_p:主要实现渲染单个页面,输出QImage。主要难度在reanderImage函数;
pagerender:主要是借助QThread线程来渲染单个PDF页面;
sequentialpagewidget:实现对PDF文件显示的封装,如何做到高效显示,而又不占用太多资源?如何实现跳页?放大?缩小?滚动页面?非常小的屏幕下实现页码的正确显示?这里面都有所体现。

整个工程,都是短时间完成的,并且没有时间对muPDF做深入研究,所以肯定还有很多不足之处,还请见谅。整个工程代码没什么大的难度,难点在如何封装使用muPDF的API,以及如何使用Qt的控件更有效率的显示出来。

这是基于VS2013的PDFReader的工程。
资源工程下载

基于MuPDF和Qt的PDF阅读器的开发相关推荐

  1. QT开发的pdf阅读器资料

    详细说明:基于QT的一款建议pdf阅读器,可以进行移植,可以再pc上运行.-Recommendations based on QT' s a pdf reader, can be transplant ...

  2. Qt 使用Poppler实现pdf阅读器

    开发环境 Qt5.5.1.Qt Creator 3.5.1 Qt实现pdf阅读器和MFC实现pdf阅读器,其实原理都是差不多的. 需要用到Poppler开源库,下载地址如下 https://poppl ...

  3. 新版超简单的PDF阅读器

    原文地址:http://blog.csdn.net/BingHongChaZuoAn/article/details/52213611 本PDF阅读器的开发是基于android23版本的,其他版本暂时 ...

  4. 基于qt与mupdf库的pdf阅读器开发

    pdf阅读器 下载mupdf源码 编译mupdf源码 qt工程链接mupdf源码静态库 参照 mupdf/docs/examples/example.c 开发 mainwindows.ui mainw ...

  5. 【Qt】有一种Bug叫“麻烦制造者——福昕PDF阅读器”

    使用Qt的QAxObject类基于"Microsoft Excel 2007"和"WPS表格"做二次开发(以下将两者称为Excel).以下代码在基于" ...

  6. iOS 中使用Mupdf教程 pdf阅读器

    转载注明出处:http://blog.csdn.net/hongqifeiwu/article/details/46009095 浩宇提供:若有疑问可以相互探讨,邮箱1223556769@qq.com ...

  7. chrome pdf android,Android PDF阅读器 (基于谷歌平台的Adobe Reader)

    Android PDF阅读器 (基于谷歌平台的Adobe Reader):Adobe Reader 是用于打开和使用在 Adobe Acrobat 中创建的 Adobe PDF 的工具. 虽然无法在 ...

  8. 基于pyQt5的pdf阅读器

    主要基于import fitz模块 一定是操作pip install PyMuPDF不是安装fitz 主要代码: def generatePDFView(self):self.doc = fitz.o ...

  9. android 使用mupdf,如何在android上嵌入mupdf作为pdf阅读器

    android 阅读器 调研pdf阅读器效果对比阅读器:有道词典网易云阅读多看阅读iReader智器阅读PDF专业阅读器Foxit PDFFBreader android 阅读器 调研 pdf阅读器效 ...

最新文章

  1. linux 本机内存型号,linux怎么看存储空间型号
  2. 高分辨率下IE浏览器缩放导致出现右侧滚动条问题的解决
  3. python 交互图形 bokeh学习总结
  4. 为什么在64位系统中指针的大小是8,而32位系统中却是4?
  5. 面试还在被红-黑树虐?看完这篇动图文章轻松反虐面试官
  6. mybatis 大于_酸爽!IDEA 中这么玩 MyBatis,让编码速度飞起!
  7. JavaScript 事件:Web 表单如何实现禁用右键、复制粘贴/剪切和输入框自动填充?
  8. class DELPHICLASS TObject
  9. 计算机三级嵌入式试题讲解,计算机三级嵌入式系统操作题及解析.docx
  10. 【知识图谱】一文全览,ICLR 2020 上的知识图谱研究
  11. JavaScript:三大家族
  12. 人工智能(第一章 绪论)
  13. python爬虫: 爬一个英语学习网站
  14. matlab 命令文件转成函数文件,科学网—[转载]利用MATLAB将nc文件转成tif - 张乐乐的博文...
  15. Kinect-Fusion解读
  16. 创维linux进入工厂模式,彩色电视机进入工厂模式后数据调乱了,如何恢复默认?-创维电视8TTN工厂模式数据怎么调...
  17. 【图像检测】基于Itti模型实现图像显著性检测附matlab代码
  18. 考研秘籍——考研流程及初试备战
  19. 在Anaconda3下安装tensorflow-gpu库的经验之谈
  20. C语言游戏必备:光标定位和颜色设置

热门文章

  1. 微信不用绑定银行卡、没零钱也一样可以支付,特别适合孩子
  2. 智能家居系统开发框架
  3. win7和win10 java性能_win10的高性能模式和卓越模式区别
  4. IT软件测试 怎么样?
  5. 计算机网络4小时速成:如何根据IP地址和子网掩码计算自己的网段和ip可用范围?
  6. linux telnet命令怎么算端口通,telnet命令怎么看端口通不通
  7. ubuntu20.04开启SSH远程登录
  8. 干货:QQ聊天记录数据分析
  9. Mac下设置Redis密码
  10. Vue 中利用 template标签遍历多维数组