http://jinzeyu.cn/index.php/archives/126/
以下链接都是我过去写的,第一个讨论加载,第二个解决了更多问题,这次我要简单分享一下如何写代码.
QT加载muPDF--静态库的问题和QT运行时库设定
QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)
这俩文的内容简单归纳就是要用extern "C"来包含include的头文件,通过将QT运行库修改为MT的方法正常导入.
QMAKE_CXXFLAGS_RELEASE = -O2 -MT -GL
QMAKE_CXXFLAGS_DEBUG = -Zi -MTd
后来发现主程序改MT影响太大产生的问题多,得不偿失.建议用一个动态库设置为MT去加载muPDF的lib.
muPDF是以C语言写成,比较有典型的C风格函数设定.首先我们要初始化"上下文",并以此打开一个"文档"
// Create a context to hold the exception stack and various caches.
mCtx = fz_new_context(NULL, NULL, FZ_STORE_UNLIMITED);
// Open the PDF, XPS or CBZ document. 除了pdf还支持xps和cbz
mDoc = fz_open_document(mCtx, filefullpath_utf8); //2参传入完整的文件路径(utf8编码)
马上就可以获得页数,如果解析失败,页数会是0
mPageCount = fz_count_pages(mDoc);
接下来就是主题,将PDF页渲染到图. 我们知道PDF是矢量格式,支持自由放大,要做的只是重新渲染而已.
fz_try(mCtx)//解析错误需要处理异常.通常不会异常
{
fz_page*page= fz_load_page(mDoc, index);//加载index页,index从0开始
fz_matrix transform;//一个转换矩阵,用于缩放旋转
fz_rotate(&transform,0);//旋转0°,不旋转
//fz_pre_scale(&transform, 1, 1); //2,3参设置宽,高俩方向的缩放比
fz_rect bounds;//下面,我要根据调用者设定的mPerfectSize计算缩放比
fz_bound_page(mDoc, page,&bounds);//拿到page 100%时的宽高
if(!mPerfectSize.isEmpty())
{//如果设置了最佳大小,计算和调整图片.
float scalew = mPerfectSize.width()/(bounds.x1-bounds.x0);
float scaleh = mPerfectSize.height()/(bounds.y1-bounds.y0);
float scalePerfect = qMin(scalew,scaleh);
fz_pre_scale(&transform, scalePerfect, scalePerfect);
//这个计算方法使图片保持宽高比撑大到PerfectSize不超出
}
fz_transform_rect(&bounds,&transform);//应用刚才的设置.1参可以改变它的bound,不过由于bound是取出来的,等于没变
fz_irect bbox;
fz_round_rect(&bbox,&bounds);//根据bound计算一个可以容纳它的bbox,且是整数,用于图片载体
fz_pixmap*pix= fz_new_pixmap_with_bbox(mCtx, fz_device_rgb(mCtx),&bbox);
fz_clear_pixmap_with_value(mCtx, pix,0xff);//创建图片载体并刷底色
fz_device*dev= fz_new_draw_device(mCtx, pix);//画图设备
fz_run_page(mDoc, page, dev,&transform, NULL);//画!
fz_free_device(dev);
fz_write_png(mCtx, pix, targetfilefullpath_utf8,0);//输出到文件
fz_drop_pixmap(mCtx, pix);
fz_free_page(mDoc, page);
//infoPage->load = true;
}
fz_catch(mCtx)
{
qDebug()<<"pdf fz_catch";
}