http://jinzeyu.cn/index.php/archives/126/

 以下链接都是我过去写的,第一个讨论加载,第二个解决了更多问题,这次我要简单分享一下如何写代码.
 QT加载muPDF--静态库的问题和QT运行时库设定
 QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)

 这俩文的内容简单归纳就是要用extern "C"来包含include的头文件,通过将QT运行库修改为MT的方法正常导入.

  1. QMAKE_CXXFLAGS_RELEASE = -O2 -MT -GL
  2. QMAKE_CXXFLAGS_DEBUG = -Zi -MTd

 后来发现主程序改MT影响太大产生的问题多,得不偿失.建议用一个动态库设置为MT去加载muPDF的lib.

 muPDF是以C语言写成,比较有典型的C风格函数设定.首先我们要初始化"上下文",并以此打开一个"文档"

  1. // Create a context to hold the exception stack and various caches.
  2. mCtx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
  3. // Open the PDF, XPS or CBZ document. 除了pdf还支持xps和cbz
  4. mDoc = fz_open_document(mCtx, filefullpath_utf8); //2参传入完整的文件路径(utf8编码)

马上就可以获得页数,如果解析失败,页数会是0

  1. mPageCount = fz_count_pages(mDoc);

 接下来就是主题,将PDF页渲染到图. 我们知道PDF是矢量格式,支持自由放大,要做的只是重新渲染而已.

  1. fz_try(mCtx)//解析错误需要处理异常.通常不会异常
  2. {
  3. fz_page*page= fz_load_page(mDoc, index);//加载index页,index从0开始
  4. fz_matrix transform;//一个转换矩阵,用于缩放旋转
  5. fz_rotate(&transform,0);//旋转0°,不旋转
  6. //fz_pre_scale(&transform, 1, 1); //2,3参设置宽,高俩方向的缩放比
  7. fz_rect bounds;//下面,我要根据调用者设定的mPerfectSize计算缩放比
  8. fz_bound_page(mDoc, page,&bounds);//拿到page 100%时的宽高
  9. if(!mPerfectSize.isEmpty())
  10. {//如果设置了最佳大小,计算和调整图片.
  11. float scalew = mPerfectSize.width()/(bounds.x1-bounds.x0);
  12. float scaleh = mPerfectSize.height()/(bounds.y1-bounds.y0);
  13. float scalePerfect = qMin(scalew,scaleh);
  14. fz_pre_scale(&transform, scalePerfect, scalePerfect);
  15. //这个计算方法使图片保持宽高比撑大到PerfectSize不超出
  16. }
  17. fz_transform_rect(&bounds,&transform);//应用刚才的设置.1参可以改变它的bound,不过由于bound是取出来的,等于没变
  18. fz_irect bbox;
  19. fz_round_rect(&bbox,&bounds);//根据bound计算一个可以容纳它的bbox,且是整数,用于图片载体
  20. fz_pixmap*pix= fz_new_pixmap_with_bbox(mCtx, fz_device_rgb(mCtx),&bbox);
  21. fz_clear_pixmap_with_value(mCtx, pix,0xff);//创建图片载体并刷底色
  22. fz_device*dev= fz_new_draw_device(mCtx, pix);//画图设备
  23. fz_run_page(mDoc, page, dev,&transform, NULL);//画!
  24. fz_free_device(dev);
  25. fz_write_png(mCtx, pix, targetfilefullpath_utf8,0);//输出到文件
  26. fz_drop_pixmap(mCtx, pix);
  27. fz_free_page(mDoc, page);
  28. //infoPage->load = true;
  29. }
  30. fz_catch(mCtx)
  31. {
  32. qDebug()<<"pdf fz_catch";
  33. }

 我有下载有一本Oreilly.XMPP.The.Definitive.Guide.May.2009.pdf的电子书,它的第一页取得的bound非常小,如果不做scalePerfect计算,封面会特别突兀的微缩在那里.

QT加载muPDF库和对muPDF的调用相关推荐

  1. QLibrary Class Reference(qt加载外部库)

    QLibrary Class Reference [QtCore module] 该类加载分享的库在运行时. #include <QLibrary> 继承QObject 注意:所有函数是可 ...

  2. qt 加载winPcap库

    安装exe,一定要安装o 下载地址 winPCap下载 winPcap开发包下载地址 解压缩包 <

  3. 动态加载so库的实现方法与问题处理

    前一阵项目上要求实现App的so库动态加载功能,因为这块本来就有成熟的方案,所以一般的实现没什么难度.可是到项目测试中,才发现有不少意料之外的情况,需要一一针对处理,故此记录一下具体的解决办法,以供后 ...

  4. Qt笔记-桌面应用程序加载字体库(ttf)

    首先将下载好的字体库放到资源文件中: 设置相关代码如下: #include "Widget.h"#include <QApplication> #include < ...

  5. 解决QT加载dll失败问题

    1.dll源码如下(使用vs2015编译): // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法.此 DLL 中的所有文件都是用命令行上定义的 SUM_EXPORTS // ...

  6. 关于Qt 加载网页(二) QWebenginePage和QWebengineView傻傻分不清楚

    书接上回,关于Qt加载网页(一)末尾提到一个createWindows用法的问题,并且提供了两个参考博文.本人在初次使用createWindows的时候产生了一个疑问,如果在函数中直接返回this,是 ...

  7. Linux系统程序运行时加载动态库路径顺序

    程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...

  8. php无法加载dll插件,php无法加载动态库怎么办

    php无法加载动态库的解决办法:1.将PHP的集成包里的"libmySQL.dll"复制到system32目录下:2.将PHP的解压目录添加到PATH里:3.在Apache的配置文 ...

  9. Linux动态加载共享库,Linux共享库的动态加载(附测试案例)

    共享库的动态加载是指可以在程序运行的过程中去加载所需的共享库.常用于某些系统或者应用程序的自动升级. 在C语言的源程序动态加载共享库,需要调用一组特殊的函数,它们被声明于一个专门的头文件dlfcn.h ...

最新文章

  1. JS数组去重,JS根据数组里面的对象属性值去重
  2. 用Opengl实现骨骼系统
  3. Cascader 级联选择器
  4. 名为 cursor_jinserted 的游标不存在_质量工程师必须了解的测量常识,你不知道怎么行...
  5. org.xml.sax.SAXParseException: Failed to read schema document错误的完美解决方法 以及 Spring如何加载XSD文件
  6. 扎心!全国6.5亿网民月收入不足5000元
  7. 我是新来的,希望大家以后能多指教.
  8. 误删除MySQL数据库表的ibd文件怎么办
  9. java堆内存与栈内存
  10. ueditor 禁止编辑_织梦ueditor百度编辑器div style被过滤解决办法
  11. 什么是CMPP、SGIP、SMGP三大运营商接口协议
  12. dem数据(dem数据格式)
  13. 网吧电脑怎么学一级计算机,如何关掉网吧电脑上的防火墙系统-电脑自学网
  14. 鸿蒙和小米哪个值得入手,鸿蒙系统能够吸引小米的优势是什么
  15. win10下VS2008提示试用期过期解决办法
  16. WordPress建站主机推荐
  17. 服务器虚拟化 魔力象限,Magic Quadrant for x86 Server Virtualization (魔力象限x86服务器虚拟化).pdf...
  18. 相机标定(三)——手眼标定
  19. Azure Key Vault 简介
  20. 游戏服务器技能系统,MMORPG游戏服务器技能系统设计【上篇】 - 踏踏实实,认真工作 - CSDN博客...

热门文章

  1. Python_捕获未知错误代码
  2. postman测试java后端接口
  3. 倍福TwinCAT(贝福Beckhoff)应用教程12.2 TwinCAT控制松下伺服 NC初步
  4. Windows下编程--模拟时钟的实现
  5. SpringMVC项目升级SpringBoot项目参考
  6. 制造商零件编号(MPN)
  7. 视频教程-【吴刚】iOS原生图标设计原理与绘制技巧标准教程-UI
  8. gh-ost和pt-osc性能对比
  9. 3月28日服务器维护,神武3月28日维护公告:新场景地图开放
  10. mysql5.7 树遍历_Mysql5.7 存储过程 遍历select结果集并进行其他操作