如何使用 Python 从 Word 文档中提取图片

Word 文档中经常包含截图、产品图片、示意图、Logo 等嵌入图片。如果文档中的图片较多,逐张在 Microsoft Word 中另存会比较麻烦。

本文介绍如何使用 Python 从 Word 文档中批量提取图片,并将其保存为独立的图片文件。

准备工作

确保电脑上已安装 Python,然后通过 pip 安装所需库:

复制代码
pip install Spire.Doc

步骤 1:使用 Python 加载 Word 文档

下面的示例使用 Spire.Doc for Python 读取 DOC 或 DOCX 文件。

首先导入所需模块并加载 Word 文档:

javascript 复制代码
import queue
from spire.doc import *
from spire.doc.common import *

doc = Document()
doc.LoadFromFile("Sample.docx")

文档加载完成后,就可以遍历其中的对象并查找图片。

步骤 2:查找 Word 文档中的图片

Word 文档中的普通嵌入图片通常以 ​​DocPicture​​ 对象表示。

由于图片可能位于不同层级的文档对象中,可以使用队列遍历文档结构,并查找类型为 ​​DocumentObjectType.Picture​​ 的对象:

ini 复制代码
nodes = queue.Queue()
nodes.put(doc)

images = []

while not nodes.empty():
    node = nodes.get()

    for i in range(node.ChildObjects.Count):
        child = node.ChildObjects.get_Item(i)

        if child.DocumentObjectType == DocumentObjectType.Picture:
            picture = child if isinstance(child, DocPicture) else None

            if picture is not None:
                images.append(picture.ImageBytes)

        elif isinstance(child, ICompositeObject):
            nodes.put(child)

找到图片后,通过 ​​ImageBytes​​ 属性获取图片的二进制数据,并将其保存到 ​​images​​ 列表中。

步骤 3:保存从 Word 中提取的图片

获取图片数据后,可以将每张图片分别写入文件:

ini 复制代码
import os

output_folder = "ExtractedImages"
os.makedirs(output_folder, exist_ok=True)

for i, image_data in enumerate(images, start=1):
    output_path = os.path.join(
        output_folder,
        f"Image-{i}.png"
    )

    with open(output_path, "wb") as image_file:
        image_file.write(image_data)

如果文档中包含 3 张图片,输出目录可能如下:

复制代码
ExtractedImages/
├── Image-1.png
├── Image-2.png
└── Image-3.png

使用 Python 从 Word 中提取图片的完整代码

下面是完整示例:

ini 复制代码
import os
import queue
from spire.doc import *
from spire.doc.common import *

input_file = "Sample.docx"
output_folder = "ExtractedImages"

os.makedirs(output_folder, exist_ok=True)

# 加载 Word 文档
doc = Document()
doc.LoadFromFile(input_file)

# 遍历文档对象
nodes = queue.Queue()
nodes.put(doc)

images = []

while not nodes.empty():
    node = nodes.get()

    for i in range(node.ChildObjects.Count):
        child = node.ChildObjects.get_Item(i)

        # 获取文档中的嵌入图片
        if child.DocumentObjectType == DocumentObjectType.Picture:
            picture = child if isinstance(child, DocPicture) else None

            if picture is not None:
                images.append(picture.ImageBytes)

        # 继续遍历嵌套对象
        elif isinstance(child, ICompositeObject):
            nodes.put(child)

# 保存提取出的图片
for i, image_data in enumerate(images, start=1):
    output_path = os.path.join(
        output_folder,
        f"Image-{i}.png"
    )

    with open(output_path, "wb") as image_file:
        image_file.write(image_data)

doc.Close()

运行代码后,程序会遍历 Word 文档,查找其中的嵌入图片,并将图片保存到 ​​ExtractedImages​​ 文件夹。

使用 Python 批量提取多个 Word 文档中的图片

如果需要处理多个 Word 文件,可以将提取逻辑封装到函数中,然后遍历文件夹内的 ​​.docx​​ 文件。

例如:

lua 复制代码
for filename in os.listdir("WordFiles"):
    if filename.lower().endswith(".docx"):
        input_path = os.path.join("WordFiles", filename)

        # 对每个 Word 文档执行图片提取操作

批量处理时,建议为每个源文档创建独立的输出文件夹,避免不同文档中提取出的图片因文件名相同而被覆盖。

从 Word 中提取图片时需要注意的问题

  • 上面的示例提取的是以 DocPicture 对象表示的图片。
  • 图表、SmartArt、形状、OLE 对象等图形元素可能使用不同的 Word 对象类型,因此不一定会被这段代码提取。
  • 示例直接将图片数据保存为 .png 文件。如果需要保留图片原始格式,应先判断源图片的实际格式,再决定输出文件扩展名。
  • 文档处理完成后,应调用 Close() 释放相关资源。

总结

当 Word 文档中包含大量图片时,使用 Python 自动提取会比手动逐张另存更加方便。

通过遍历文档对象、查找 ​​DocPicture​​ 并读取其 ​​ImageBytes​​ 数据,可以将 Word 中的嵌入图片批量保存为独立文件,也可以进一步扩展为批量处理多个 DOCX 文档的自动化流程。

相关推荐
白山编程大哥2 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
昭昭日月明4 小时前
RAGFlow 入门,不用从零造轮子
python·ai编程
莓有烦恼吖5 小时前
Vibe Coding 的一些思考
python
小白学大数据5 小时前
超简单:用 Python 让 Excel 飞起来:用 openpyxl 把重复报表整理交给脚本
开发语言·数据库·python·excel
爱丶不疚5 小时前
写给前端工程师的现代 Python 工程化最佳实践:从 pnpm 到 uv,从 CommonJS 到 src-layout
javascript·python·typescript
2601_962297255 小时前
C# vs Java vs Python:YOLO工业部署性能对比实战
java·python·c·工业视觉·性能对比
CTA终结者5 小时前
示例、拆解和练习,要连成一条量化补课线
人工智能·python
lolijiaqi156 小时前
一线观察:长期体验后发现的医疗器械 CDMO 底层现象
大数据·python
spencer_tseng6 小时前
[j2cache ehcache.xml]/tmp/.ehcache-diskstore.lock (Permission denied)
xml·linux·python·ehcache·[j2cache