如何避免PyMuPDF(Fitz)将单词间大间距识别为换行符?
解决PyMuPDF提取PDF文本时单词被错误换行的问题
你的问题核心是PyMuPDF默认根据字符间距阈值判断换行/空格,当单词间空白过大时会误判为换行。TEXT_INHIBIT_SPACES标志的作用是抑制自动插入空格,并不针对这种误换行场景,所以无效。以下是两种可行的解决方案:
方案一:通过提取单词位置自定义拼接文本
这种方法直接获取每个单词的坐标信息,通过计算单词间的位置关系来决定添加空格还是换行,完全可控:
def get_text(pdf_path): doc = fitz.open(pdf_path) text = "" for page in doc: # 提取带位置信息的单词列表,按阅读顺序排序 words = page.get_text("words", sort=True) prev_x_end = prev_y_end = None for word in words: x0, y0, x1, y1, word_str = word[:5] font_height = y1 - y0 # 估算当前单词的字体高度 if prev_x_end is not None: # 判断是否为同一行:垂直方向偏差小于字体高度的1/3 is_same_line = abs(y0 - prev_y_end) < font_height / 3 if is_same_line: # 水平间距小于字体高度的一半,视为空格;否则视为换行 if x0 - prev_x_end < font_height / 2: text += " " else: text += "\n" else: text += "\n" text += word_str prev_x_end, prev_y_end = x1, y1 text += "\n" # 每页结束添加换行分隔 return text
方案二:尝试调整文本提取标志
可以尝试使用TEXT_PRESERVE_WHITESPACE保留PDF原始空白,同时结合TEXT_SORT保证阅读顺序:
def get_text(pdf_path): doc = fitz.open(pdf_path) text = "" for page in doc: flags = fitz.TEXT_PRESERVE_WHITESPACE | fitz.TEXT_SORT text += page.get_text("text", flags=flags) return text
如果方案二无效,方案一的自定义处理是更可靠的选择,它完全绕过PyMuPDF的默认换行判断逻辑,精准控制文本拼接规则。
内容的提问来源于stack exchange,提问作者pedmacedo
相关产品推荐
相关产品推荐

