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显示相关推荐

  1. Linux下静态编译的一个TIP

    Linux下静态编译的一个TIP | 素包子 Linux下静态编译的一个TIP 2010年3月28日 baoz 阅读评论 linux下静态编译好处很多,一来是可以跨发行版(debian redhat ...

  2. MinGW下静态编译、链接Qt 5.0

    2019独角兽企业重金招聘Python工程师标准>>> 本文讨论的将是MinGW之上的静态编译 ,并且将抛开万年难伺候的QtWebkit进行编译. 一.编译Qt 5.0 与Qt 4. ...

  3. linux下静态编译mupdf,NDK编译mupdf1.1小记

    MuPDF是一个轻量级的简易版PDF阅读器,它的功能简单,启动快速,渲染效果不错.MuPDF是免费软件,并提供了Android下的源码. 下面就是mupdf最新版1.1的编译过程. 确保已经配置好An ...

  4. Qt中调用OpenCV函数库时Crashed问题的解决。

    这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...

  5. linux 动态库建立,浅析linux下静态库和动态库的建立和使用

    在粤嵌学了很多知识,我们把常用的公用函数放在一起做成一个函数库,可以供其他程序共同使用,函数库本质上说,是一个可执行代码的二进制形式,可被操作系统载入内存执行.linux下的库分为两种:静态库,后缀名 ...

  6. 从四个问题透析Linux下C++编译链接

    摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...

  7. 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用

    如有错误,欢迎大家指正,感谢! ​​​​​​​目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...

  8. 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 ...

  9. OpenCV在Linux下的编译安装(Ubuntu )

    OpenCV在Linux下的编译安装(Ubuntu ) 1.先安装相关的库: sudo apt-get install build-essential sudo apt-get install lib ...

最新文章

  1. ajax提交相对路径报错,ajax提交请求为啥url要用这个函数encodeURI
  2. 推断两条单链表是否相交
  3. 移动APP接口安全性设计
  4. thinkphp自定义标签库
  5. PHP中删除目录的三种方法
  6. jquery 表单验证
  7. 当年叱咤风云的框架Struts2,你可知Struts2内功如何修炼
  8. java中常用的类——Math类
  9. CCSK安全认证-M1-云计算概念和体系架构
  10. 红外通信红外编码—NEC协议
  11. 详解EMC测试国标GB/T 17626
  12. 腾讯产品经理能力模型!
  13. 迈普路由器访问控制列表配置命令_迈普路由器配置手册
  14. 初识python之概念认知篇
  15. Torvalds 拒绝接受 ZFS 文件系统
  16. [附源码]SSM计算机毕业设计高校奖学金评定管理系统JAVA
  17. Docker环境搭建和全终端无插件网页摄像机直播管理服务EasyNVS的部署方案详解
  18. 干货 !玩转Linux中的输入输出管理(1)
  19. 传输加载优化(资源压缩、资源缓存、HTTP2)
  20. OPNET导入STK轨道文件的问题

热门文章

  1. 无线网路不可用(hp4410s)
  2. 如何查看计算机的磁盘阵列类型,肿么查看RAID类型
  3. 高级Java工程师年薪有多少 需要具备哪些能力
  4. 自动泊车轨迹规划场景介绍
  5. 机器人方向的人工智能工具是助手还是平替
  6. 攻防世界Reverse(5)
  7. 将后缀名为DAT的数据文件转换为EXCEL表格形式的文件
  8. 标准型计算机窗口截图快捷键,如何快速打开电脑上的计算器
  9. 如何使用amplifycolor调色插件
  10. 离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)