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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:03:55