图片实际存放在.docx文件的word/media/子目录下,以二进制文件形式存储,需通过zipfile直接解压该路径提取,python-docx默认无法获取原始图片数据。

docx 文件里图片实际存放在哪里?
Word 的 .docx 本质是 ZIP 压缩包,图片不直接嵌在文本流里,而是以二进制文件形式存于 word/media/ 子目录下。用 python-docx 读取文档时,它默认忽略这些资源——你调用 document.inline_shapes 或 document.part.images 都拿不到原始图片数据,只能拿到占位信息。
用 zipfile 直接解压 media/ 目录最可靠
绕过文档解析库的限制,直接操作底层 ZIP 结构是最稳的方式。关键点在于:必须打开 .docx 文件为 ZIP 对象,定位到 word/media/ 路径下的所有文件(通常是 image1.png、image2.jpeg 这类命名),逐个提取并保存。
- 不要用
python-docx的InlineShape对象尝试导出——它不提供原始字节流,只返回模糊的blob或空值 - 注意 ZIP 内路径区分大小写:
word/media/必须全小写,Windows 上容易因大小写疏忽漏掉文件 - 部分 docx 可能含 SVG 或 WMF 图片,它们也落在
word/media/下,扩展名可能是.svg或.wmf,需一并匹配
import zipfile
import os
<p>def extract_images_from_docx(docx_path, output_dir):
os.makedirs(output_dir, exist_ok=True)
with zipfile.ZipFile(docx_path) as docx:
for item in docx.filelist:
if item.filename.startswith("word/media/"):
filename = os.path.basename(item.filename)
if filename: # 防止空名
with open(os.path.join(output_dir, filename), "wb") as f:
f.write(docx.read(item.filename))
如何确认提取的图片没损坏?
直接解压可能拿到损坏图片,常见原因是 Word 在保存时对某些格式做了内部重编码(比如把 PNG 转成 JPEG 但没改扩展名),或插入的是剪贴画(EMF/WMF)被 Office 自动转存为 PNG 但元数据丢失。验证方法很简单:
- 检查提取出的文件能否被
PIL.Image.open()正常加载,捕获IOError或UnidentifiedImageError - 用命令行快速验证:
file image1.png(Linux/macOS)或certutil -hashfile image1.png SHA1(Windows)看是否报“data”而非具体格式 - 若发现大量
.png实际是 JPEG 数据,可先用imghdr.what()判断真实类型再重命名
遇到加密或受保护的 docx 怎么办?
如果 docx 打开提示“受密码保护”或用 zipfile 报 BadZipFile,说明文件被加密(哪怕只是只读推荐密码)。Python 标准库不支持解密,此时 zipfile 会静默失败或抛异常。没有通用绕过方案——Office 密码保护是 AES 加密,必须先手动用 Word 解密另存为无密码版本,再处理。
立即学习“Python免费学习笔记(深入)”;
真正容易被忽略的是:有些企业模板 docx 用数字签名或 DRM 封装,表面能打开,但 ZIP 结构被篡改,word/media/ 目录可能不存在或路径被重定向。这种情况下,连手动解压 ZIP 都看不到图片,得换用 COM 自动化(Windows)或 LibreOffice headless 导出为 PDF 再提取图片——但那就超出纯 Python 范畴了。


















