在工作中,我们可能会遇到需要从多个 Word 文档中批量提取图片的需求。如果手动操作,效率低且容易出错。因此,利用 Python 自动化批量提取图片是一个不错的选择。本篇文章将详细介绍如何使用 Python 来实现从 .doc
和 .docx
格式的 Word 文档中批量提取图片并保存到指定的文件夹中。
一、环境准备
1. 安装Python和所需库
首先,我们需要 Python 环境,并且安装以下 Python 库:
- win32com:用于与 Windows COM 组件(如 Word)进行交互。
- Pillow:处理图像的库,用于保存剪贴板中的图片。
pip install pywin32 pillow
2. 准备目录结构
假设你的 Word 文档存放在 D:\1
目录中,图片提取后会存储在 D:\1\图片
文件夹中。
二、代码实现
1. 导入必要的库
首先,我们导入必要的库,并初始化 COM 环境。win32com.client
提供了与 Word 的接口,PIL.ImageGrab
可以从剪贴板中获取图像。
import os
import win32com.client as win32
import pythoncom
from PIL import ImageGrab
import time
2. 编写提取图片的主函数
函数 extract_images_from_doc(input_dir, output_dir)
是核心逻辑:
- 初始化 COM 环境,确保可以控制 Word。
- 遍历指定目录中的文件,只处理
.doc
和.docx
格式的文件。 - 创建一个与 Word 文件同名的文件夹,用于存放从该文档提取的图片。
- 打开文档,逐一读取其中的图片,将其复制到剪贴板。
- 使用
ImageGrab.grabclipboard()
从剪贴板中获取图片,并将其保存为.jpg
格式。 - 关闭文档,继续处理下一个文件。
3. 完整代码实现
def extract_images_from_doc(input_dir, output_dir):
# 初始化COM环境
pythoncom.CoInitialize()
word_app = win32.gencache.EnsureDispatch("Word.Application")
word_app.Visible = False # 不显示Word应用
# 获取所有.doc和.docx文件
for doc_file in os.listdir(input_dir):
if doc_file.endswith(('.doc', '.docx')):
# 创建每个文档对应的文件夹
doc_name = os.path.splitext(doc_file)[0]
doc_output_folder = os.path.join(output_dir, doc_name)
os.makedirs(doc_output_folder, exist_ok=True)
# 打开.doc或.docx文件
doc_path = os.path.join(input_dir, doc_file)
doc = word_app.Documents.Open(doc_path)
image_count = 0
# 遍历所有内嵌图片
for shape in doc.InlineShapes:
image_count += 1
# 复制图片到剪贴板
shape.Select()
word_app.Selection.CopyAsPicture()
# 确保剪贴板已复制图片
time.sleep(0.5) # 等待剪贴板稳定
# 从剪贴板获取图片
img = ImageGrab.grabclipboard()
if isinstance(img, ImageGrab.Image.Image):
# 如果图像是RGBA模式,则转换为RGB模式
if img.mode == 'RGBA':
img = img.convert('RGB')
# 保存图片为JPEG格式
img_path = os.path.join(doc_output_folder, f'image_{image_count}.jpg')
img.save(img_path, 'JPEG')
print(f"已保存图片: {img_path}")
else:
print(f"未找到图片:{doc_file} - image_{image_count}")
print(f"{doc_file} 中的所有图片已保存到 {doc_output_folder}")
doc.Close()
word_app.Quit()
4. 示例用法
最后,我们设置输入和输出文件夹的路径,并调用 extract_images_from_doc
函数。将 D:\1
替换为你的 Word 文档所在路径,D:\1\图片
替换为存储提取图片的路径。
# 示例用法
input_directory = r'D:\1' # 替换为你的.doc或.docx文件所在文件夹路径
output_directory = r'D:\1\图片' # 替换为存储图片的总文件夹路径
extract_images_from_doc(input_directory, output_directory)
三、代码说明
-
文件夹处理:代码会自动检查输入路径中的
.doc
和.docx
文件。对于每个文档,代码会在输出文件夹内创建一个以文档名命名的文件夹,将该文档中的所有图片保存到这个文件夹中。 -
图片提取和保存:
- 将图片从文档中复制到剪贴板。
- 使用
ImageGrab.grabclipboard()
从剪贴板获取图片。如果图片是RGBA
模式,转换为RGB
模式,便于保存为.jpg
格式。
-
错误处理:如果某个文档中未找到图片,代码会打印相应提示。
-
延时操作:
time.sleep(0.5)
确保图片已经成功复制到剪贴板,避免图像未完全加载而无法提取的问题。
四、注意事项
- Word版本:此代码适用于安装了 Microsoft Word 的 Windows 系统。
- Word不可见模式:代码中将
word_app.Visible = False
,以隐藏 Word 窗口,节省资源和避免干扰。 - 路径设置:确保输入和输出路径正确,以避免出现文件无法读取或写入的错误。
- 防止过多图片未提取问题:如果遇到很多图片未成功提取,可以尝试调整
time.sleep(0.5)
的延时值,增加至0.8
或更长,以适应不同电脑的响应速度。
五、总结
通过 Python 和 COM 技术,我们能够轻松实现从 Word 文档中批量提取图片的需求。此代码既可以处理 .doc
也可以处理 .docx
文件,具有较强的通用性。在实际应用中,提取图片后可以用于报告整理、图片分析等多个场景。
六、反馈
欢迎大家想我提供想要的办公代码,我很乐意帮忙写各种代码,希望大家可以喜欢,也希望大家可以给提出好的建议,请多多关注。
标签:docx,Word,Python,doc,剪贴板,文件夹,文档,图片 From: https://blog.csdn.net/m0_70207299/article/details/143773696