PyMuPDF提取文本返回空字符串主因是PDF为扫描件(图片型),page.get_text()仅提取向量文本;此外自定义编码、隐藏文字图层或文本被路径遮盖也会导致失败。

PyMuPDF提取文本时为什么有些页面返回空字符串?
常见原因是PDF内容是扫描件(即图片型PDF),page.get_text() 默认只提取向量文本,对图像中嵌入的文字无能为力。另外,部分PDF使用了自定义编码、隐藏文字图层或文本被路径遮盖,也会导致提取失败。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
page.is_text()判断该页是否含可提取文本,返回False就别硬调get_text() - 对扫描件,需配合 OCR 工具(如
pytesseract)——PyMuPDF 本身不带 OCR 功能 - 尝试不同输出格式参数:
page.get_text("text")(默认)、"blocks"(分块)、"dict"(带位置信息),有时"blocks"能绕过某些字体映射问题 - 若文本存在但乱码,检查是否缺失内嵌字体:用
page.get_fonts()查看字体列表,再用page.get_text("text", encoding="utf-8")强制指定编码(虽不一定生效,但值得一试)
如何用PyMuPDF可靠地提取PDF中的所有图片?
PyMuPDF 的图片提取逻辑是“找页面上的图像 XObject”,不是“识别截图内容”。这意味着它只提取 PDF 规范中明确定义为图像的对象(如 JPEG/PNG/JBIG2 流),不提取用矢量路径模拟的伪图、或文本转曲后生成的图形。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
page.get_images(full=True)获取图像元数据列表,每个元素是长度为 11 的元组,关键字段:索引位置[0]、宽度[2]、高度[3]、颜色空间[6]、滤镜类型[8] - 逐个用
doc.extract_image(xref)提取原始字节,再用PIL.Image.open(io.BytesIO(...))加载验证;注意xref是间接对象引用号,不是列表下标 - 警惕重复提取:同一张图可能被多个页面引用,
xref相同说明是同一个图像对象 - 某些 PDF 把图标存为 SVG 或字体图标(如 IconFont),这类不会出现在
get_images()结果里,得另寻方案(如解析page.get_drawings()或字体映射)
提取图文混合内容时,怎样保持原始位置与顺序?
PDF 没有天然的“阅读顺序”,PyMuPDF 的 get_text("dict") 和 get_text("blocks") 返回结构化数据,但块顺序不等于视觉流顺序——尤其遇到多栏、浮动图注、页眉页脚时容易错乱。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先用
page.get_text("dict"),它返回含"x0","y0","x1","y1"的字典,可按y0分组再按x0排序模拟阅读流 - 避免直接拼接
get_text("text"),它会丢弃坐标信息,且自动合并换行,破坏原文段落结构 - 图片位置需单独获取:用
page.get_image_info()(PyMuPDF 1.19+)或遍历page.get_images()后查doc.xref_object(xref)解析 bbox,再与文本块做空间重叠判断 - 复杂版式(如新闻排版)建议导出为 JSON + 坐标,交由下游做 layout analysis,别强求单次提取还原 Word 效果
PyMuPDF在Windows上提取中文PDF为何常报UnicodeDecodeError?
本质是底层 MuPDF 库加载中文字体时,对 CMap 或 ToUnicode 表解析失败,触发 Python 字节解码异常。错误通常发生在 page.get_text() 内部,而非用户代码显式解码处。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 升级到 PyMuPDF ≥ 1.23.0,旧版本对 GBK/GB2312 编码支持极弱
- 临时绕过:捕获
UnicodeDecodeError后,改用page.get_text("rawdict")获取未解码的原始字节流,再手动按page.attrs.get("Resources",{}).get("Font",{})查字体编码线索 - 更稳做法:用
fitz.TOOLS.set_small_glyph_heights(True)(1.22+)缓解部分中文字体渲染异常引发的文本提取中断 - 确认 PDF 是否损坏:用 Adobe Acrobat 打开并“另存为”一次,常能修复缺失的 ToUnicode 映射



















