乐于分享
好东西不私藏

一键提取 Word 里的所有图片

一键提取 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

这类工具的价值不在于技术多复杂,而在于它把一个低价值动作从“一张张点”变成“一条命令”。人就应该把注意力留给更值得看的图片,而不是右键菜单。