通过agent获知pymupdf中对docx文件抓取图片信息的一些理解
2026/7/24 21:57:24 网站建设 项目流程

最近在学习的过程中看到了这样一个库,pymupdf,是一个可以用于解析pdf中的一些文本、图片等一些基本信息的一个库。

然后让ai帮我生成了两个用于解析简历的函数:

def_read_docx_images(path):try:importpymupdfexceptImportErrorasexc:raiseImportError("请先安装 PyMuPDF:pip install pymupdf")fromexc image_candidates=[]withZipFile(path)asarchive:fornameinarchive.namelist():ifnotname.startswith("word/media/")orname.endswith("/"):continueimage_bytes=archive.read(name)try:pixmap=pymupdf.Pixmap(image_bytes)exceptException:continuewidth,height=pixmap.width,pixmap.heightifwidth>=60andheight>=60:image_candidates.append((width*height,image_bytes,Path(name).suffix[1:]or"png"))returnimage_candidatesdef_read_with_pymupdf(file_path):try:importpymupdfexceptImportErrorasexc:raiseImportError("请先安装 PyMuPDF:pip install pymupdf")fromexc texts=[]image_candidates=[]withpymupdf.open(file_path)asdocument:forpage_number,pageinenumerate(document):page_text=page.get_text("text",sort=True).strip()ifpage_text:texts.append(page_text)# 简历头像通常位于第一页,优先从第一页内嵌图片中选择。ifpage_number==0:forimage_infoinpage.get_images(full=True):xref=image_info[0]image=document.extract_image(xref)width=image.get("width",0)height=image.get("height",0)ifwidth>=60andheight>=60:image_candidates.append((width*height,image["image"],image.get("ext","png")))iffile_path.suffix.lower()==".docx":image_candidates.extend(_read_docx_images(file_path))avatar=max(image_candidates,default=None,key=lambdaitem:item[0])return"\n".join(texts),avatar

提示词非常简单,大概就是让其帮我用pymupdf的某个版本生成用于解析pdf的函数。
后面又做了一些简单的改动,允许解析pymupdf支持的各个类型的文件,其中包含pdf、xps、image、docx等等。

然后开始阅读函数大概的内容,基本上也能看的懂,大致是提取文本,并获取PDF中图像的属性(如宽度、高度)等。

首先,我注意到有两个函数:
_read_docx_images
_read_with_pymupdf

第一个疑问是:
为什么是两个函数

然后在读第二个函数的时候发现了这两行代码:

iffile_path.suffix.lower()==".docx":image_candidates.extend(_read_docx_images(file_path))

也就是文件扩展名为docx的时候调用这个函数并对返回结果进行追加。
这时候问题就又来了:
为什么要加这两行,我通过前面直接open打开对应的文件抓取文本和图像信息不可以吗

然后AI是这样给我解释的

意思就是通过pymupdf.open打开docx文件,只能通过get_text抓取文本,不能通过get_image拿到图像信息。
于是做了个实验,
在函数体里打印get_image

print(page.get_images(full=True))

结果是空

去掉那两行代码,打印image_candidates

print(image_candidates)


image_candidates也是空

因此得出结论:对于docx文件想要抓取图像就要单独做一次处理。

然而,为什么pymupdf通过open打开docx抓不到图像呢?

ai是这样解释的:

DOCX / XLSX / PPTX 这类 Office 文件可以被 PyMuPDF 加载成 Document 对象, 但有 caveats,比如会转换成 HTML 来布局,原始分页会丢失, 主要适合文本提取; 如果要更忠实的版式,应考虑 PyMuPDF Pro。

为什么原始分页会丢失?

因为 .docx 和 .pdf 的文档模型不一样。 PDF 更像“固定版式”: 第1页有哪些文字、哪些图片、坐标在哪里 第2页有哪些文字、哪些图片、坐标在哪里 PDF 本身就强依赖页面。 DOCX 更像“流式文档”: 一段文字 一个标题 一个表格 一张图片 再一段文字 它不是天然固定在某一页上的。 你在 Word 里看到的“第几页”, 很多时候是 Word 根据纸张大小、字体、页边距、行距、 分页符、渲染环境动态排版出来的结果。

意思就是,docx的文档模型更像是html类型,内容都是流式形式的,而pdf的模型的各个内容更像是在一个坐标上,很容易读取,不管是文本,图像,都可以以坐标的形式读取,因此docx的模型在读取时会先转换成类似html的布局再读取对应文本内容

这个pymupdf的官方文档也有解释
https://pymupdf.readthedocs.io/en/latest/about.html#note

总的来说:
使用pymupdf对docx文件抓取文本可以直接使用open方法的get_text抓取文本信息,图像需要单独处理(这里是通过zipFile对图片进行处理的)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询