You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDFsharp如何实现鼠标悬停矩形任意区域弹出注释

问题原因

  • 你使用的PdfTextAnnotation属于笔记类注释,交互触发区域默认绑定内置图标位置,哪怕你手动设置了Rectangle属性,也不会扩大触发范围,只有图标所在的左上角位置可以触发弹窗
  • 部分情况下坐标转换逻辑有误,PDF规范要求注释的Rectangle参数顺序为[左下角x, 左下角y, 右上角x, 右上角y],坐标系以页面左下角为原点,若参数顺序或坐标计算错误,会导致实际生效的交互区域只有左上角一个小点

解决方法

改用PdfSquareAnnotation,同时关闭边框显示、开启内容悬停提示即可实现全矩形区域触发,修改你的AddAnnotation方法如下:

private static void AddAnnotation(XGraphics graphics, PdfPage page, double x, double y, double height, double width)
{
    // 先把绘图用的左上角坐标系转换为PDF页面的左下角坐标系
    double pageHeight = page.Height.Point;
    double llx = x;
    double lly = pageHeight - y - height; // 左下角y坐标 = 页面总高度 - 左上角y - 矩形高度
    double urx = x + width;
    double ury = pageHeight - y; // 右上角y坐标 = 页面总高度 - 左上角y

    PdfSquareAnnotation squareAnnot = new PdfSquareAnnotation();
    squareAnnot.Title = "这是标题";
    squareAnnot.Subject = "这是主题";
    squareAnnot.Contents = "这是注释内容,\r第二行内容";
    // 设置注释交互区域为完整矩形
    squareAnnot.Rectangle = new PdfSharp.Pdf.PdfRectangle(llx, lly, urx, ury);
    // 关闭矩形边框,和你自己绘制的高亮矩形样式对齐
    squareAnnot.Color = XColors.Transparent;
    squareAnnot.Border.Style = PdfBorderStyle.Solid;
    squareAnnot.Border.Width = 0;

    page.Annotations.Add(squareAnnot);
}

如果你需要和高亮效果完全绑定,可以直接用PdfTextMarkupAnnotation,设置类型为Highlight,不需要额外自己绘制矩形:

private static void AddHighlightAnnotation(PdfPage page, double x, double y, double height, double width)
{
    double pageHeight = page.Height.Point;
    double llx = x;
    double lly = pageHeight - y - height;
    double urx = x + width;
    double ury = pageHeight - y;

    PdfTextMarkupAnnotation highlightAnnot = new PdfTextMarkupAnnotation();
    highlightAnnot.Title = "高亮注释";
    highlightAnnot.Contents = "悬停显示的注释内容";
    highlightAnnot.MarkupType = PdfTextMarkupType.Highlight;
    highlightAnnot.Rectangle = new PdfSharp.Pdf.PdfRectangle(llx, lly, urx, ury);
    // 设置高亮颜色和透明度
    highlightAnnot.Color = XColor.FromArgb(128, 168, 216, 239);
    // 设置高亮区域的 quad points,确保交互区域完全匹配高亮范围
    highlightAnnot.QuadPoints = new PdfSharp.Pdf.PdfArray(
        new PdfReal(llx), new PdfReal(ury),
        new PdfReal(urx), new PdfReal(ury),
        new PdfReal(llx), new PdfReal(lly),
        new PdfReal(urx), new PdfReal(lly)
    );

    page.Annotations.Add(highlightAnnot);
}

注意事项

  • 不需要再保留你原来自己绘制矩形的DrawRectangle方法,使用高亮注释会自动绘制半透明高亮效果
  • 所有PDF阅读器都遵循该注释规范,修改后悬停在整个高亮矩形范围内都会弹出注释内容

内容的提问来源于stack exchange,提问作者Dangerous Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:57:00