如何使用iTextSharp判断PDF解析文本块是否同时加粗并带下划线?
解决iTextSharp检测PDF中同时加粗和下划线文本的问题
刚好我之前也处理过类似的需求,用iTextSharp实现检测同时加粗+下划线的文本其实分两步走:先判断字体是否加粗,再判断是否有下划线装饰,下面给你详细的实现方案:
1. 判断文本是否加粗
PDF里的加粗通常体现在字体本身的属性或命名上,我们可以通过两种方式来判断(优先用更准确的字体描述符,兜底用字体名称匹配):
private bool IsBold(TextRenderInfo renderInfo) { var font = renderInfo.GetFont(); // 优先通过FontDescriptor判断:返回值>0表示字体是加粗样式 bool isBoldFromDescriptor = font.GetFontDescriptor(BaseFont.BOLD, 0) > 0; if (isBoldFromDescriptor) return true; // 兜底检查字体名称,兼容命名不规范的字体 var fontName = font.PostscriptFontName.ToLower(); return fontName.Contains("bold") || fontName.Contains("b") || fontName.Contains("heavy"); }
2. 判断文本是否带下划线
下划线属于文本的装饰属性,iTextSharp中可以直接从GraphicsState获取这个状态:
private bool IsUnderlined(TextRenderInfo renderInfo) { return renderInfo.GetGraphicsState().Underline; }
3. 自定义提取策略整合判断
继承LocationTextExtractionStrategy,重写RenderText方法,同时检测两个条件,把符合要求的文本记录下来:
using System.Collections.Generic; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; public class BoldUnderlineTextExtractionStrategy : LocationTextExtractionStrategy { private readonly List<string> _boldUnderlineTexts = new List<string>(); // 对外暴露提取到的符合条件的文本 public List<string> BoldUnderlineTexts => _boldUnderlineTexts; public override void RenderText(TextRenderInfo renderInfo) { // 先调用基类方法保证正常文本提取流程 base.RenderText(renderInfo); bool isBold = IsBold(renderInfo); bool isUnderlined = IsUnderlined(renderInfo); if (isBold && isUnderlined) { _boldUnderlineTexts.Add(renderInfo.GetText()); } } private bool IsBold(TextRenderInfo renderInfo) { var font = renderInfo.GetFont(); bool isBoldFromDescriptor = font.GetFontDescriptor(BaseFont.BOLD, 0) > 0; if (isBoldFromDescriptor) return true; var fontName = font.PostscriptFontName.ToLower(); return fontName.Contains("bold") || fontName.Contains("b") || fontName.Contains("heavy"); } private bool IsUnderlined(TextRenderInfo renderInfo) { return renderInfo.GetGraphicsState().Underline; } }
4. 使用示例
最后在主逻辑中调用自定义策略提取文本:
using (var pdfReader = new PdfReader("你的PDF文件路径.pdf")) { var extractionStrategy = new BoldUnderlineTextExtractionStrategy(); // 遍历所有页面提取文本 for (int pageNum = 1; pageNum <= pdfReader.NumberOfPages; pageNum++) { PdfTextExtractor.GetTextFromPage(pdfReader, pageNum, extractionStrategy); } // 输出结果 foreach (var targetText in extractionStrategy.BoldUnderlineTexts) { Console.WriteLine("找到同时加粗+下划线的文本:" + targetText); } }
注意事项
- 有些PDF的下划线不是通过文本装饰属性实现的,而是单独绘制的线条(比如用绘图指令画的横线),这种情况上面的方法无法检测到,需要额外解析页面的绘图路径来判断,复杂度会高一些。
- 部分自定义字体的命名可能比较特殊,你可以根据实际情况扩展
IsBold方法中的关键词集合。
内容的提问来源于stack exchange,提问作者SvdSinner
相关产品推荐
相关产品推荐

