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

news/2025/3/15 21:49:45/

基于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的工程。
资源工程下载
pdfreader


http://www.ppmy.cn/news/478536.html

相关文章

qt 实现PDF阅读器 (一)

1、前言 查阅资料可发现,网上的几种pdf阅读器的实现,几乎大多依赖的第三方库,这里就不做介绍了。 qt 自带的关于pdf的显示:pdfwriter、printpreviewwidget,分别为创建pdf 和 打印预览pdf。由此,后者似乎满足…

vscode远程连接linux服务器

Linux服务器(或虚拟机)条件: 开启ssh服务 客户端: vscode 1.服务端 服务端需要开启ssh服务vscode才能连接,首先检验linux是否开启了ssh服务 systemctl status sshd servie sshd status 运行命令,如果可…

JavaScript的数学计算库:decimal.js

An arbitrary-precision Decimal type for JavaScript. 功能 整数和浮点数简单但功能齐全的 API复制 JavaScript 和对象的许多方法Number.prototype Math还处理十六进制、二进制和八进制值比 Java 的 BigDecimal JavaScript 版本更快,更小,也许更容易使…

【最新版】腾X软件管理电脑管家提取免安装绿色版,比官方软件好用很多!

很多人说下载软件直接上官网下载,卸载软件直接用控制面板里的“程序和功能”就好了。但如果需要安装的软件很多,还是需要一款可以下载、升级、卸载软件的工具。纵观全网,针对软件管理的工具大多集成在某安全卫士、某电脑管家里面,…

软件管理和电脑管家打不开

错误: 应用程序无法启动,因为应用程序的并行配置不正确。请参阅应用程序事件日志,或使用命令行sxstrace.exe工具”问题的处理方法。 方法一: 开始 - 运行(输入services.msc)- 确定或回车,打开&…

感受一下卸载“腾讯电脑管家”的痛

人们说企鹅管家比三七二一的后爹流氓,我不行,我装了个搜狗输入法,一不小心它还真来了,那就卸载了吧。开始: 1、应用和功能中赶紧找到他,迫不及待点卸载 2、Windows会善意的提醒一下,真的要卸载…

电脑管家

电脑管家是一款很好的加速软件。 首页体检(所有问题查找(主要是清理垃圾,偶尔也会有进木马)): 病毒查杀(下面的六边形和盾牌是强力查杀): 垃圾清理(这个就不…

软件安装管家

原文链接 http://t.csdn.cn/aGyhL 一、电脑系统 1)安装环境: ① PE工具箱 ② VMware虚拟机 2)win10系列: ① U盘安装win10 ② 直接安装win10 ③ 虚拟机安装win10 ④ win10官方镜像文件 3&#x…