linux下静态编译mupdf,在Qt中调用Mupdf库进行pdf显示
2018.5.10 更新内存对齐说明
感谢知乎网友@孤独子狮指出QImage处需要考虑内存对齐的问题。因为本人缺乏跨平台、图形库开发经验,所以在调试成功后就没有深入探究。
主要修改了QImage的构造方式,使用了指定bytesPerLine的构造函数,具体原因参见
孤独子狮的回答 - 知乎 https://www.zhihu.com/question/38594052/answer/387891545
前言
最近有个pdf的需求,Qt竟然没有显示pdf的api,着实令人郁闷。之后我尝试用了poppler,但是光配置编译工程就相当麻烦了,没有cmake等开源项目编译经验的人完全一脸懵逼。PDFium也是同理(手头上没有vpn也无法尝试)。感觉Mupdf编译器起来比较简单,所以就来用了一下。不过这个库有个缺点就是编译出来的文件太大了。
本人使用的版本是Mupdf1.12.0+Qt5.9.3+vs2015
下载Mupdf库
https://mupdf.com/downloads/
编译Mupdf
在mupdf-1.12.0-source\platform\win32目录下就有现成的mupdf.sln。
这里需要注意:这个工程默认使用的是/MT,而Qt MSVC默认用的是/MD,所以需要修改编译工程设置。我们这里只需要在编译工程中修改就可以了。
以下是一些有关QMake中设置运行库属性 /md /md /mt /mtd 的相关参考
http://blog.csdn.net/caoshangpa/article/details/51416077
http://www.cnblogs.com/codingmylife/archive/2010/05/08/1730832.html
http://www.voidcn.com/article/p-hhosrsia-hq.html
工程里默认生成的是都是静态库,请注意!
根据测试需要的分别是libmupdf.lib、libresources.lib、libthirdparty.lib这三个库(只使用了docs\examples\example.c的代码,使用别的函数可能需要再编译别的工程)
分别修改解决方案中的libmupdf、libthirdparty、libresources这三个工程,将debug下改成/MDd,release下改成/MD,编译即可得到这3个文件。其中libresources只有release版本的,所以debug模式下,我也引用这个文件。
当然你嫌麻烦或者还是不知道该怎么编译,可以去我的github直接下载编译好的静态库。
在Qt工程中引入Mupdf静态库
引入lib文件
新建一个工程,在工程的图标上右键——添加库——外部库。平台只勾选windows,链接选择静态,之后选择对应的库就可以了。(本人将debug与release编译的分别放在debug与release文件夹中)
添加包含目录
将Mupdf目录中的include复制到工程目录下(本人又新建了一个mupdf,将所有文件都放在里面了)
本人是这么写的,具体可以参考源代码:
INCLUDEPATH += $$PWD/mupdf/include/
之后运行QMake。
编写代码进行测试
代码是根据Mupdf中的案例文件example.c中的代码改写
#include "widget.h"#include"ui_widget.h"#include#include#include#include#include#include"mupdf/fitz.h"#include"mupdf/pdf.h"Widget::Widget(QWidget*parent) :
QWidget(parent),
ui(newUi::Widget)
{
ui->setupUi(this);char *input = const_cast< char* >("document.pdf");floatzoom, rotate;intpage_number, page_count;
fz_context*ctx;
fz_document*doc;
fz_pixmap*pix;
fz_matrix ctm;//第一页为0
page_number=0;//100%缩放比
zoom=100;//旋转为0
rotate=0;//创建上下文
ctx =fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);if (!ctx)
{
qDebug()<
}//注册文档控制
fz_try(ctx)
fz_register_document_handlers(ctx);
fz_catch(ctx)
{
qDebug()<
fz_drop_context(ctx);return;
}//打开文档
fz_try(ctx)
doc=fz_open_document(ctx, input);
fz_catch(ctx)
{
qDebug()<
fz_drop_context(ctx);return;
}//取得总的页数
fz_try(ctx)
page_count=fz_count_pages(ctx, doc);
fz_catch(ctx)
{
qDebug()<
fz_drop_document(ctx, doc);
fz_drop_context(ctx);return;
}if (page_number < 0 || page_number >=page_count)
{
qDebug()<
fz_drop_document(ctx, doc);
fz_drop_context(ctx);return;
}//计算缩放以及旋转
fz_scale(&ctm, zoom / 100, zoom / 100);
fz_pre_rotate(&ctm, rotate);//渲染pixmap
fz_try(ctx)
pix= fz_new_pixmap_from_page_number(ctx, doc, page_number, &ctm, fz_device_rgb(ctx), 0);
fz_catch(ctx)
{
qDebug()<
fz_drop_document(ctx, doc);
fz_drop_context(ctx);return;
}//渲染成图片//unsigned char *samples = fz_pixmap_samples(ctx, pix);
unsigned char *samples = pix->samples;int width =fz_pixmap_width(ctx, pix);int height =fz_pixmap_height(ctx, pix);
QImage image(samples, width, height,pix->stride,QImage::Format_RGB888); QLabel*label=newQLabel; label->setPixmap(QPixmap::fromImage(image)); ui->layout->addWidget(label);//if (!image.save("a.png")) {//return;//}//回收内存 fz_drop_pixmap(ctx, pix); fz_drop_document(ctx, doc); fz_drop_context(ctx); } Widget::~Widget() {deleteui; }
参考代码
https://github.com/blueroseslol/QtMupdf
找到一个之前有人封装的库,不过经过测试是无法成功编译的,不过可以参考一下mupdf库的用法。
https://github.com/xiangxw/mupdf-qt
别的参考:
http://blog.csdn.net/chenyijun/article/details/42582977
linux下静态编译mupdf,在Qt中调用Mupdf库进行pdf显示相关推荐
- Linux下静态编译的一个TIP
Linux下静态编译的一个TIP | 素包子 Linux下静态编译的一个TIP 2010年3月28日 baoz 阅读评论 linux下静态编译好处很多,一来是可以跨发行版(debian redhat ...
- MinGW下静态编译、链接Qt 5.0
2019独角兽企业重金招聘Python工程师标准>>> 本文讨论的将是MinGW之上的静态编译 ,并且将抛开万年难伺候的QtWebkit进行编译. 一.编译Qt 5.0 与Qt 4. ...
- linux下静态编译mupdf,NDK编译mupdf1.1小记
MuPDF是一个轻量级的简易版PDF阅读器,它的功能简单,启动快速,渲染效果不错.MuPDF是免费软件,并提供了Android下的源码. 下面就是mupdf最新版1.1的编译过程. 确保已经配置好An ...
- Qt中调用OpenCV函数库时Crashed问题的解决。
这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...
- linux 动态库建立,浅析linux下静态库和动态库的建立和使用
在粤嵌学了很多知识,我们把常用的公用函数放在一起做成一个函数库,可以供其他程序共同使用,函数库本质上说,是一个可执行代码的二进制形式,可被操作系统载入内存执行.linux下的库分为两种:静态库,后缀名 ...
- 从四个问题透析Linux下C++编译链接
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...
- 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用
如有错误,欢迎大家指正,感谢! 目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...
- Linux下的编译(环境是centos6.8 gcc 4.4.7)
Linux下的编译(环境是centos6.8 gcc 4.4.7) 1. 运行命令:yum install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs Pytho ...
- OpenCV在Linux下的编译安装(Ubuntu )
OpenCV在Linux下的编译安装(Ubuntu ) 1.先安装相关的库: sudo apt-get install build-essential sudo apt-get install lib ...
最新文章
- ajax提交相对路径报错,ajax提交请求为啥url要用这个函数encodeURI
- 推断两条单链表是否相交
- 移动APP接口安全性设计
- thinkphp自定义标签库
- PHP中删除目录的三种方法
- jquery 表单验证
- 当年叱咤风云的框架Struts2,你可知Struts2内功如何修炼
- java中常用的类——Math类
- CCSK安全认证-M1-云计算概念和体系架构
- 红外通信红外编码—NEC协议
- 详解EMC测试国标GB/T 17626
- 腾讯产品经理能力模型!
- 迈普路由器访问控制列表配置命令_迈普路由器配置手册
- 初识python之概念认知篇
- Torvalds 拒绝接受 ZFS 文件系统
- [附源码]SSM计算机毕业设计高校奖学金评定管理系统JAVA
- Docker环境搭建和全终端无插件网页摄像机直播管理服务EasyNVS的部署方案详解
- 干货 !玩转Linux中的输入输出管理(1)
- 传输加载优化(资源压缩、资源缓存、HTTP2)
- OPNET导入STK轨道文件的问题