如何定位iTextSharp在PDF中检测到的不可见Annotation/Link的位置与内容
问题根因
你当前获取标注属性的方法存在类型匹配错误,Link类型标注的大部分核心属性都不是字符串类型,你统一调用GetAsString()读取自然会返回空值:
Rect是PdfArray类型,存储标注在页面上的坐标值,格式为[左下x, 左下y, 右上x, 右上y],可以直接定位标注位置A是PdfDictionary类型,存储链接对应的动作(跳转页面、打开URL、执行脚本等),就是你要的标注内容Border/BS是PdfArray或PdfDictionary类型,存储标注的边框样式,如果边框宽度为0,标注就不会在页面上显示,就是你手动找不到的核心原因C是PdfArray类型,存储标注的颜色值,如果设为和页面背景一致也会导致肉眼不可见
修正后的读取代码示例
替换你原有代码中读取属性的部分即可:
// 读取标注位置坐标 PdfArray rectArr = annotationDic.GetAsArray(PdfName.RECT); if (rectArr != null && rectArr.Size >=4) { float leftX = rectArr.GetAsNumber(0).FloatValue; float bottomY = rectArr.GetAsNumber(1).FloatValue; float rightX = rectArr.GetAsNumber(2).FloatValue; float topY = rectArr.GetAsNumber(3).FloatValue; // 注:PDF页面坐标原点在左下角,可根据页面高度换算为常用的左上角坐标 } // 读取链接动作内容 PdfDictionary actionDict = annotationDic.GetAsDict(PdfName.A); if (actionDict != null) { PdfName actionType = actionDict.GetAsName(PdfName.S); if (actionType.Equals(PdfName.URI)) { // 外部URL链接 PdfString uriStr = actionDict.GetAsString(PdfName.URI); string linkUrl = uriStr?.ToString(); } else if (actionType.Equals(PdfName.GOTO)) { // 文档内页跳转,可继续读取目标页码信息 PdfObject jumpTarget = actionDict.Get(PdfName.D); } } // 读取边框判断是否可见 PdfArray borderArr = annotationDic.GetAsArray(PdfName.BORDER); if (borderArr != null && borderArr.Size >= 3) { float borderWidth = borderArr.GetAsNumber(2).FloatValue; if (borderWidth == 0) { // 边框完全不可见 } }
手动找不到标注的原因
绝大多数不可见Link标注都是PDF导出工具生成的残留数据,或是生成时特意设置了边框宽度为0、矩形区域极小,普通PDF阅读器默认不会显示无样式、无有效动作的空标注,所以你在标注面板和页面上都找不到痕迹。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

