一键提取 Word 里的所有图片
Vibe Coding 100 天挑战 · Day 18
一键提取 Word 里的所有图片
你有没有遇到过这种文件:一份 Word 里塞了十几张流程图、截图、产品图,真正要用的时候却只能一张张右键另存。
如果图片不多,手动保存还能忍;如果是一份几十页的方案、一份活动复盘、一份供应商素材包,另存图片就会变成一件很不值但很耗人的事。
今天做的工具叫 word-image-exporter。它只解决一个很具体的问题:从 .docx 文件里批量导出所有原始图片。

为什么 Word 里的图片可以直接提取?
.docx 不是一个神秘的二进制文件。
更准确地说,它本质上是一个压缩包。里面有文档正文、样式、关系文件,也有一个很关键的目录:
word/media/
你插入到 Word 里的图片,很多时候就原样放在这个目录里。只要把 .docx 当成 zip 包打开,就可以把这些图片批量拿出来。
这也是今天这个 MVP 的核心思路:不模拟 Word,不截图,不重新压缩图片,只提取文档包里的原始媒体文件。
这次 MVP 做了什么?
word-image-exporter 现在支持:
-
读取单个 .docx文件。 -
读取一个目录下的多个 .docx文件。 -
批量导出 word/media/里的图片。 -
保留图片原始格式,例如 PNG、JPG、GIF、SVG、TIFF、WMF、WEBP。 -
默认不覆盖已有文件,遇到重名会自动追加序号。 -
自定义导出文件名前缀。 -
生成 CSV 或 JSON 清单。 -
在清单里记录来源 Word、原始文件名、导出文件名、大小、扩展名和关系 ID。 -
只依赖 Python 标准库。
它不像一个“文档处理平台”,更像一个很顺手的素材拆包器。
怎么使用?
导出单个 Word 文件:
python src\word_image_exporter.py examples\sample.docx -o examples\exported
导出一个目录里的所有 Word 文件:
python src\word_image_exporter.py examples -o examples\exported
如果希望生成 JSON 清单:
python src\word_image_exporter.py examples\sample.docx -o examples\exported --manifest-format json
如果想调整导出命名:
python src\word_image_exporter.py examples\sample.docx -o examples\exported --prefix "{doc}-image-{index:02d}"
运行后会看到类似输出:
已导出图片: 3 张输出目录: examples\exported导出清单: examples\exported\manifest.csv
清单大概长这样:
source_docx,original_name,output_name,output_path,extension,size_bytes,rel_id,used_in_documentexamples\sample.docx,image1.png,sample-001.png,examples\exported\sample-001.png,png,48231,rId5,True
实现思路
这个工具的实现很直接,主要分成四步。
第一步,确认输入。
如果输入是文件,就只处理这一个 .docx;如果输入是目录,就递归查找目录里的 .docx 文件。
第二步,把 Word 当成 zip 包打开。
Python 标准库里的 zipfile 就能完成这件事。工具会检查文件是否真的是 zip 结构,避免把旧版 .doc 或其他文件误当成 Word 处理。
第三步,查找图片。
工具会扫描压缩包里的:
word/media/
只要扩展名属于常见图片格式,就读取原始 bytes 写到输出目录。这个过程不会改变图片尺寸,也不会重新编码。
第四步,生成清单。
除了导出图片,我还让它读取:
word/_rels/document.xml.rels
这个关系文件可以告诉我们图片在文档里的关系 ID。清单里有这些信息,后续排查“这张图来自哪个 Word、原来叫什么、导出后叫什么”会轻松很多。
为什么默认不覆盖?
批处理工具最怕一上来就把用户文件覆盖掉。
所以这一版默认很保守:如果输出目录里已经有同名文件,工具会自动改成:
report-001-2.pngreport-001-3.png
只有明确加上 --overwrite,才允许覆盖同名导出文件。
这是一个小设计,但能减少很多“我刚才那批图去哪了”的焦虑。
现在的局限
这一版也有边界:
-
只支持 .docx,不支持老式.doc。 -
不识别图片在正文中的具体页码。 -
不处理 Word 里通过链接引用的外部图片。 -
不做图片内容识别和分类。 -
不负责去重,只做原始导出和清单记录。
但它已经能把最常见的需求解决掉:从 Word 里一次性拿到所有原图。
后续可以怎么升级?
后面可以继续加:
-
按图片在文档中的出现顺序导出。 -
读取正文上下文,给图片生成更有意义的文件名。 -
增加重复图片检测。 -
导出图片尺寸、颜色模式等元数据。 -
支持拖拽式桌面小工具。 -
支持批量把图片压缩成一个 zip 包。
源码
Day 18 项目源码已经放在 GitHub:
GitHub – Day 18 word-image-exporter
这类工具的价值不在于技术多复杂,而在于它把一个低价值动作从“一张张点”变成“一条命令”。人就应该把注意力留给更值得看的图片,而不是右键菜单。
夜雨聆风