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
相关产品推荐
相关产品推荐

