首页 > 编程语言 >Python实现批量提取Word文档中的图片(支持.doc和.docx格式)

Python实现批量提取Word文档中的图片(支持.doc和.docx格式)

时间:2024-11-14 16:46:11浏览次数:3  
标签:docx Word Python doc 剪贴板 文件夹 文档 图片

        在工作中,我们可能会遇到需要从多个 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) 是核心逻辑:

  1. 初始化 COM 环境,确保可以控制 Word。
  2. 遍历指定目录中的文件,只处理 .doc.docx 格式的文件。
  3. 创建一个与 Word 文件同名的文件夹,用于存放从该文档提取的图片。
  4. 打开文档,逐一读取其中的图片,将其复制到剪贴板。
  5. 使用 ImageGrab.grabclipboard() 从剪贴板中获取图片,并将其保存为 .jpg 格式。
  6. 关闭文档,继续处理下一个文件。

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)

三、代码说明

  1. 文件夹处理:代码会自动检查输入路径中的 .doc.docx 文件。对于每个文档,代码会在输出文件夹内创建一个以文档名命名的文件夹,将该文档中的所有图片保存到这个文件夹中。

  2. 图片提取和保存

    • 将图片从文档中复制到剪贴板。
    • 使用 ImageGrab.grabclipboard() 从剪贴板获取图片。如果图片是 RGBA 模式,转换为 RGB 模式,便于保存为 .jpg 格式。
  3. 错误处理:如果某个文档中未找到图片,代码会打印相应提示。

  4. 延时操作time.sleep(0.5) 确保图片已经成功复制到剪贴板,避免图像未完全加载而无法提取的问题。

四、注意事项

  1. Word版本:此代码适用于安装了 Microsoft Word 的 Windows 系统。
  2. Word不可见模式:代码中将 word_app.Visible = False,以隐藏 Word 窗口,节省资源和避免干扰。
  3. 路径设置:确保输入和输出路径正确,以避免出现文件无法读取或写入的错误。
  4. 防止过多图片未提取问题:如果遇到很多图片未成功提取,可以尝试调整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

相关文章

  • Docker部署Reids哨兵模式集群(sentinel)
    一、下载redis镜像二、redis主库配置redis.conf绑定的IP地址和端口bind0.0.0.0必须使用6379,因为容器内默认是6379端口port6379设置密码requirepass123456启用持久化appendonlyyes三、主库sentinel配置sentinel.confprotected-modeno配置端口号,各个节点不能相同......
  • DL00337-基于yolov11的阿尔兹海默症检测诊断含数据集python
    阿尔兹海默症是一种渐进性的神经退行性疾病,通常通过认知障碍、记忆丧失、语言障碍等症状表现出来。早期诊断是控制疾病发展的关键,但现有的诊断方法如临床评估、神经影像检查(CT、MRI等)通常具有一定的局限性。YOLOv11能够帮助提取医学影像中的有价值特征,进而辅助阿尔兹海默症的诊......
  • Docker快速入门到项目实战部署
    1.*docker*1.1*什么是docker*docker是快速构建、运行、管理应用的工具,简单来就是来帮助部署项目以及部署项目需要的一些组件的工具。1.2*卸载旧版*首先如果系统中已经存在旧的docker,则先卸载:yumremovedockerdocker-clientdocker-client-latestdocker-commondock......
  • 【Python学习笔记】 第9章 元组、文件和其他核心类型
    元组Python元组的属性:任意对象的有序集合通过偏移量存取属于“不可变序列”固定长度、多样性、任意嵌套对象引用的数组元组的常见方法:运算解释()空元组T=(0,)单个元素的元组T=(0,'Ni',1.2,3)四个元素的元组T=0,'Ni',1.2,3还是四个元......
  • Python可视化Matplotlib折线图plot用法详解
    importmatplotlib.pyplotaspltimportrandom,iofrompylabimportmplimportnumpyasnp#画出温度变化图#设置显示中文字体mpl.rcParams["font.sans-serif"]=["SimHei"]#设置正常显示符号mpl.rcParams["axes.unicode_minus"]=False# 准备x.y坐标......
  • Python练习2:企业发放的奖金根据利润提成。利润([)低于或等于10万元时,奖金可提10%;利润
     Python练习2:企业发放的奖金根据利润提成。利润([)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时......
  • 探险家的秘密武器:Python爬虫
    在一个名为“代码王国”的神秘地方,有一位著名的探险家,他的名字叫“爬虫侠”。爬虫侠不是普通的探险家,他是一位Python程序员,擅长使用代码作为武器,探索未知的世界。今天,他接到了一个任务:从遥远的“电商星球”的店铺中,获取所有的商品信息。准备阶段:装备升级在出发前,爬虫侠需要......
  • python爬虫获得店铺的所有商品
    在编写Python爬虫以获取店铺的所有商品信息时,通常涉及到发送HTTP请求、解析响应内容以及处理API返回的数据。以下是一个详细的Python爬虫示例,用于获取店铺的商品信息。这个示例假设API返回的是JSON格式的数据,并且需要API密钥进行认证。步骤1:导入必要的库首先,需要导入Python......
  • python-三方库-PyTorch-Pillow (PIL Fork)
    1需求官网:https://python-pillow.org/docs:https://pillow.readthedocs.io/en/stable/需求:Image.filename需求:获取图像格式Image.format需求:获取图像尺寸Image.sizeImage.widthImage.height需求:获取图像颜色模式Image.mode需求:获取图像像素值Image.load()[x,y]......
  • docker run指定gpu,后台拉镜像
     root@node37:/ollama#dockerrun-d--gpus'"device=2,3"'-v/ollama:/root/.ollama-p11434:11434--nameollamaollama/ollamac12c23004c3957a8cba38376dbb17904db9381932f9578b2dd5de87794f40a9droot@node37:/ollama#root@node37:/ollama#......