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

