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 文档的自动化流程。