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

如何在C#中读取带有行号的PDF文件?

行号与正文分离的可行方案
  • 靠排版位置区分(最可靠):带行号的PDF通常会把行号放在左侧固定宽度的区域,和正文的x坐标范围完全分开。用PyMuPDF(fitz)或PyPDF2这类库提取文本块的位置信息,设定一个x坐标阈值就能区分两边内容:

    import fitz
    
    doc = fitz.open("目标文档.pdf")
    for page in doc:
        # 获取页面所有文本块,每个块包含坐标和文本内容
        blocks = page.get_text("blocks")
        # 根据实际文档调整行号区域的x坐标上限
        line_num_x_limit = 50
        for block in blocks:
            x0, y0, x1, y1, text, _, _ = block
            if x0 < line_num_x_limit:
                line_number = text.strip()
                # 这里可以把行号存入数据库
            else:
                content = text.strip()
                # 这里处理正文内容并存库
    

    这种方法完全不受正文里的数字影响,只要排版规则就有效。

  • 解析PDF结构标签:如果你的PDF是从Word等结构化文档导出的,可能带有内置标签。用pdfminer.six可以解析这些标签,通常行号对应<Lbl>标签,正文对应<LBody>标签,直接提取对应标签的内容即可。

  • OCR+位置识别(针对扫描版PDF):如果是扫描生成的PDF(纯图片),先要用Tesseract等OCR工具提取文本,同时获取每个字符的位置坐标,再通过左侧固定区域识别行号,匹配对应行的正文内容。

  • 正则+上下文规则(备选方案):如果前几种方法都用不了,观察行号的格式规律——比如行号是开头的连续数字,后面跟着至少两个空格,且行号是连续递增的。可以用正则匹配结合递增验证来区分:

    import re
    
    # 假设已提取到整页纯文本
    raw_text = "1            It is agreed on...\n2            The party named..."
    lines = raw_text.split("\n")
    last_line_num = 0
    for line in lines:
        # 匹配开头数字+至少两个空格的格式
        match_result = re.match(r"^(\d+)\s{2,}(.*)", line.strip())
        if match_result:
            current_num = int(match_result.group(1))
            # 验证行号是否连续递增,排除正文中的数字
            if current_num == last_line_num + 1 or last_line_num == 0:
                line_num = current_num
                content = match_result.group(2)
                last_line_num = current_num
                # 这里执行存库操作
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:27:15