EasyOCR提取文本无法正确添加换行符的问题求助
问题描述
- 核心代码:
import fitz import easyocr from PIL import Image def extract_text_from_pdf(pdf_path): reader = easyocr.Reader(['en'], download_enabled=False) extracted_text = "" for page_number in range(pdf_document.page_count): page = pdf_document[page_number] resolution = 300 zoomfactor = resolution/72.0 pixmap = page.get_pixmap(matrix=fitz.Matrix(zoomfactor, zoomfactor)) # 修正原代码语法错误:matrix-fitz → matrix= image = pixmap.tobytes() result = reader.readtext(image, paragraph=True) print(f"Page {page_number + 1} - OCR Result:") for detection in result: extracted_text += detection[1] pdf_document.close() return extracted_text
- 待识别内容:两行文本,第一行
account: 1234,第二行url: xyz - 实际提取结果:
"account: 1234url: xyz" - 预期结果:
account: 1234 url: xyz
- 问题根因:单行内单词间距过大,EasyOCR未按行识别,导致两行文本被无间隔拼接。
解决方案
针对该问题,可通过以下几种方式解决:
1. 调整EasyOCR识别参数
通过readtext方法的参数优化大间距文本的行识别逻辑:
# 修改readtext调用,增加参数控制 result = reader.readtext( image, paragraph=True, min_size=10, # 过滤过小的文本区域,减少误判 text_threshold=0.7, # 提高文本置信度阈值,强化行识别准确性 low_text=0.4 )
2. 基于检测框坐标手动判断换行
利用EasyOCR返回结果中的文本框坐标,通过垂直位置差异判断是否换行:
extracted_text = "" prev_y_center = None line_height_threshold = 20 # 根据实际文本高度调整阈值 for detection in result: text_box = detection[0] # 计算文本框垂直中心坐标 y_center = (text_box[0][1] + text_box[2][1]) / 2 text = detection[1] if prev_y_center is not None: # 垂直中心距离超过阈值则判定为新行,添加换行符 if abs(y_center - prev_y_center) > line_height_threshold: extracted_text += "\n" extracted_text += text prev_y_center = y_center
3. 图像预处理增强行特征
对PDF转成的图像做预处理,强化文本行的辨识度:
from PIL import Image # 将pixmap转为PIL图像 image = Image.frombytes("RGB", [pixmap.width, pixmap.height], pixmap.samples) # 提高图像对比度,增强文本与背景差异 image = image.point(lambda p: p * 1.5) # 转回字节格式供EasyOCR识别 image_bytes = image.tobytes() result = reader.readtext(image_bytes, paragraph=True)
4. 修正原代码语法错误
原代码中matrix-fitz.Matrix是语法错误,需改为matrix=fitz.Matrix,否则代码无法正常执行。
内容的提问来源于stack exchange,提问作者Foos
相关产品推荐
相关产品推荐

