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

提取图片的步骤

  1. 打开Word文档
  2. 获取文档中的所有内嵌形状(图片通常属于InlineShape)
  3. 逐个保存图片到指定文件夹

代码实现

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(...)自动编号。

可能的陷阱

  • 有些图片可能作为DrawingPicture节点存储,此时需要通过doc.element进行XPath查找。简单场景下上述代码已足够。
  • 如果文档中图片是浮动式(非内嵌),则不在inline_shapes中,此时需要额外处理。

结语

通过python-docx提取Word图片非常高效。以上代码可直接复制使用,将其封装为函数后,可轻松集成到自动化脚本中。更多高级功能(如指定图片大小、替换图片)可查阅官方文档。