QT加载muPDF库和对muPDF的调用

来源:互联网 发布:日本it公司知乎 编辑:程序博客网 时间:2024/04/29 20:31

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计算,封面会特别突兀的微缩在那里.
0 0
原创粉丝点击