编译环境: vistual studio 2015 mupdf版本:1.12.0
- 通过图片路径新建image对象
image = fz_new_image_from_file(app->ctx, path);
- 将鼠标点击的坐标转换为pdf中的坐标
p.x = pt->x - app->panx + irect.x0;
p.y = pt->y - app->pany + irect.y0;
//转为当前视图的矩阵, 如放到1或缩小到0.5倍等情况
pdfapp_viewctm(&ctm, app);
//反转为当前矩阵为初始矩阵
fz_invert_matrix(&ctm, &ctm);
fz_transform_point(&p, &ctm);
- 在pdf中创建注释
annot = pdf_create_annot(app->ctx, page, PDF_ANNOT_SCREEN);
在PDF Reference 1.6: a screen annotation (PDF 1.5) specifies a region of a page upon which media clips may be played.
- 设置注释图片外观
dlist = fz_new_display_list(app->ctx, NULL);
dev = fz_new_list_device(app->ctx, dlist);
ctm.a = image->w;
ctm.b = 0;
ctm.c = 0;
ctm.d = image->h;
ctm.e = p.x;
ctm.f = p.y
/*
matrix : [ a b c d e f ]
坐标平移: [ 1 0 0 1 tx ty ] tx为p.x, ty为p.y即添加注释的坐标
缩放转换:[ sx 0 0 sy 0 0 ] sx为image->w, sy为image->h即图片尺寸
最终为: [ sx 0 0 sy tx ty ]
*/
fz_fill_image(app->ctx, dev, image, &ctm, 1.0, NULL);
pdf_set_annot_appearance(app->ctx, doc, annot, &rect,dlist);
ctm 矩阵转换可参考PDF Reference 1.6中 4.2 Coordinate Systems
完整代码如下:
//图片格式为png格式, 如果是图片中含有透明通道则必须添加smask字典
void pdfapp_add_image(pdfapp_t *app, const char * path, fz_point * pt)
{
fz_image * image = NULL;
fz_rect rect;
fz_point p;
fz_matrix ctm;
fz_display_list * dlist;
fz_device * dev;
pdf_document * doc;
pdf_page * page;
pdf_annot * annot;
fz_irect irect = { 0, 0, app->layout_w, app->layout_h };
image = fz_new_image_from_file(app->ctx, path);
p.x = pt->x - app->panx + irect.x0;
p.y = pt->y - app->pany + irect.y0;
pdfapp_viewctm(&ctm, app);
fz_invert_matrix(&ctm, &ctm);
fz_transform_point(&p, &ctm);
rect.x0 = p.x;
rect.x1 = rect.x0 + image->w;
rect.y0 = p.y;
rect.y1 = rect.y0 + image->h;
doc = pdf_specifics(app->ctx, app->doc);
page = pdf_load_page(app->ctx, doc, app->pageno - 1);
annot = pdf_create_annot(app->ctx, page, PDF_ANNOT_SCREEN);
pdf_set_annot_rect(app->ctx, annot, &rect);
dlist = fz_new_display_list(app->ctx, NULL);
dev = fz_new_list_device(app->ctx, dlist);
ctm.a = image->w;
ctm.b = 0;
ctm.c = 0;
ctm.d = image->h;
ctm.e = p.x;
ctm.f = p.y
fz_fill_image(app->ctx, dev, image, &ctm, 1.0, NULL);
pdf_set_annot_appearance(app->ctx, doc, annot, &rect,dlist);
fz_drop_display_list(app->ctx, dlist);
fz_drop_device(app->ctx, dev);
fz_drop_image(app->ctx, image);
pdfapp_showpage(app, 1, 1, 0, 0, 0);
}
如有错误或者有更好的实现方法,欢迎留言讨论!
网友评论