mupdf中添加图片注释

编译环境: vistual studio 2015      mupdf版本:1.12.0

  1. 通过图片路径新建image对象
    image = fz_new_image_from_file(app->ctx, path);
  2. 将鼠标点击的坐标转换为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);
  1. 在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.

  1. 设置注释图片外观
    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);
}

如有错误或者有更好的实现方法,欢迎留言讨论!

你可能感兴趣的:(mupdf中添加图片注释)