PyMuPDF提取PDF文本时空格丢失及乱码问题求助
PyMuPDF提取PDF文本:空格丢失与乱码问题修复
问题现象
处理目标PDF时出现两类异常:
- 调用
page.get_text()提取文本,空格保留但部分内容被未知字符“�”替换; - 使用
page.get_text("dict", flags=11)遍历span,大量空格丢失(如闭括号后的空格消失)。
解决方案
1. 乱码(“�”)问题处理
这类字符通常是PDF中特殊字符编码未被正确识别,或字体嵌入不完整导致,可通过以下方式修复:
- 调整提取flags:使用
fitz.TEXTFLAGS_TEXT(值为2)基础flag,结合fitz.TEXT_PRESERVE_LIGATURES保留连字结构,避免编码解析错误。示例:print(page.get_text(flags=fitz.TEXTFLAGS_TEXT | fitz.TEXT_PRESERVE_LIGATURES)) - 更新PyMuPDF版本:新版本对非嵌入字体、特殊字符的兼容性更好,能减少此类乱码问题。
2. dict模式下空格丢失问题
dict模式中,span文本本身不会包含span间的空格,空格是通过span的位置间距体现的,加上你使用的flags=11参数组合未正确启用空格保留,修复方式如下:
- 修正flags参数:明确指定
fitz.TEXT_PRESERVE_WHITESPACE(值为8)和fitz.TEXT_DEHYPHENATE(值为4),替代flags=11:blocks = page.get_text("dict", flags=fitz.TEXT_PRESERVE_WHITESPACE | fitz.TEXT_DEHYPHENATE)["blocks"] - 手动补充span间空格:遍历span时,通过对比前后span的边界坐标判断是否需要添加空格,示例代码:
doc = fitz.open("40337_02.pdf") page = doc[3] blocks = page.get_text("dict", flags=fitz.TEXT_PRESERVE_WHITESPACE | fitz.TEXT_DEHYPHENATE)["blocks"] for block in blocks: for line in block["lines"]: last_span_right = None for span in line["spans"]: if last_span_right is not None: # 计算两个span的间距,超过阈值则添加空格 gap = span["bbox"][0] - last_span_right if gap > 1.5: # 阈值可根据PDF实际排版调整 print(" ", end="") print(span["text"], end="") last_span_right = span["bbox"][2] print()
3. 通用优化建议
- 优先使用
page.get_text("text")提取完整文本,这种模式下PyMuPDF会自动处理大部分空格和排版,再针对乱码做局部修复; - 若需结构化提取(dict模式),务必依赖span的位置信息补充空格,不要仅依赖span文本内容;
- 检查PDF本身的字体嵌入情况,若核心字体未嵌入,可尝试使用OCR模式提取(需额外依赖Tesseract)。
内容的提问来源于stack exchange,提问作者Gabriel Marquetto
相关产品推荐
相关产品推荐

