Python读取Word文档中的图片:实用方法与代码示例
Python读取Word文档中的图片
在日常办公自动化中,经常需要从Word文档中提取图片。Python的python-docx库能够方便地处理.docx文件,包括读取其中的图片。本文将详细介绍原理、实现步骤以及完整的代码示例。
原理
Word文档(.docx)本质上是一个ZIP压缩包,内部包含XML文件和各种资源(如图片存放在word/media文件夹)。python-docx库封装了对这些结构的访问,通过Document对象我们可以遍历文档中的InlineShape(内嵌图形)或Picture对象。
环境准备
首先安装python-docx:
pip install python-docx提取图片的步骤
- 打开Word文档
- 获取文档中的所有内嵌形状(图片通常属于InlineShape)
- 逐个保存图片到指定文件夹
代码实现
import os
from docx import Document
from docx.opc.constants import RELATIONSHIP_TYPE as RT
def extract_images_from_word(docx_path, output_dir):
"""
从Word文档中提取所有图片
:param docx_path: Word文件路径
:param output_dir: 图片输出目录
"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
doc = Document(docx_path)
# 遍历文档中的所有内嵌形状
for i, shape in enumerate(doc.inline_shapes):
# 如果是图片类型
if shape.type == 3: # WD_INLINE_SHAPE_TYPE.PICTURE
# 获取图片的二进制数据
image = shape._inline.graphic.graphicData.pic.blipFill.blip
embed_id = image.embed
# 通过关系ID获取图片数据
rId = embed_id
image_part = doc.part.related_parts[rId]
image_bytes = image_part.blob
# 保存图片,使用原始文件名或自动命名
ext = image_part.content_type.split('/')[-1] # 如 'jpeg', 'png'
filename = f"img_{i}.{ext}"
filepath = os.path.join(output_dir, filename)
with open(filepath, 'wb') as f:
f.write(image_bytes)
print(f"已保存: {filepath}")
if __name__ == "__main__":
extract_images_from_word("example.docx", "images")更多细节说明
- 形状类型判断:
shape.type == 3表示图片,实际也可通过hasattr(shape, 'image')等方法。 - 图片格式:
content_type通常包含'image/jpeg'、'image/png'等,可通过split('/')[-1]得到文件后缀。 - 处理多个图片:使用
for i, shape in enumerate(...)自动编号。
可能的陷阱
- 有些图片可能作为
Drawing或Picture节点存储,此时需要通过doc.element进行XPath查找。简单场景下上述代码已足够。 - 如果文档中图片是浮动式(非内嵌),则不在
inline_shapes中,此时需要额外处理。
结语
通过python-docx提取Word图片非常高效。以上代码可直接复制使用,将其封装为函数后,可轻松集成到自动化脚本中。更多高级功能(如指定图片大小、替换图片)可查阅官方文档。