使用Python批量从Word文档及各种Word元素中提取图片-程序员宅基地

技术标签: python  word  开发语言  

目录

安装Python Word库

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

使用Python提取Word文档特定页面上的图片

使用Python提取Word文档表格中的图片

使用Python提取Word文档页眉和页脚中的图片

使用Python提取Word文档批注中的图片


Word文档通常包含丰富多样的图片内容,例如插图、照片等等。有时,我们可能需要将这些图片提取出来,以便进一步编辑、在其他文档中使用或与他人共享。提取Word文档中的图片可以有多种方法,手动复制和保存是最简单的方法之一,但手动操作效率低下,特别是当需要提取多个图片时。在这种情况下,可以使用Python来自动化这一过程。这篇文章将探讨如何使用Python批量从Word文档及各种Word元素中提取图片,主要包括以下主题:

  • 使用Python批量提取Word文档中的图片
  • 使用Python提取Word文档特定页面上的图片
  • 使用Python提取Word文档表格中的图片
  • 使用Python提取Word文档页面和页脚中的图片
  • 使用Python提取Word文档批注中的图片

安装Python Word库

在Python中,我们可以使用Spire.Doc for Python库来读取Word文档的内容,包括读取图片和读取文本等。

Spire.Doc for Python主要用于在Python应用程序中创建、读取、编辑和转换Word文件。它可以处理各种Word格式,包括Doc、Docx、Docm、Dot、Dotx、Dotm等。此外,还可以将Word文档转换为其他类型的文件格式,如Word转PDFWord转RTFWord转HTMLWord转文本Word转图片Word转OFD/XPS/PostScript

你可以通过在终端运行以下命令来从PyPI安装Spire.Doc for Python:

pip install Spire.Doc

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

在 Spire.Doc for Python 中,Word 文档中的图片由 DocPicture 对象表示。 因此,要从 Word 文档中提取图片,需要遍历文档元素并识别出类型为DocPicture 的对象。

具体的代码如下:

import queue
from spire.doc import *
from spire.doc.common import *
import os

# 指定输入文件路径
input_file = "测试.docx"
# 指定输出目录路径
output_path = "文档图片/"
# 如果输出目录不存在,则创建
os.makedirs(output_path, exist_ok=True)

# 创建一个Document实例
document = Document()
# 加载输入的Word文档
document.LoadFromFile(input_file)

# 创建一个列表来存储提取的图片数据
images = []

# 初始化一个队列来存储待遍历的文档元素
nodes = queue.Queue()
nodes.put(document)

# 遍历文档元素
while not nodes.empty():
    node = nodes.get()
    for i in range(node.ChildObjects.Count):
        obj = node.ChildObjects[i]
        # 查找图片
        if isinstance(obj, DocPicture):
            picture = obj
            # 将图片数据添加到列表中
            data_bytes = picture.ImageBytes
            images.append(data_bytes)
        elif isinstance(obj, ICompositeObject):
            nodes.put(obj)

# 将图片数据保存为图像文件
for i, image_data in enumerate(images):
    file_name = f"Image-{i}.png"
    with open(os.path.join(output_path, file_name), 'wb') as image_file:
        image_file.write(image_data)

document.Close()

以上代码展示了如何从一个Word文档中提取图片。如果需要批量从一个文件夹下的多个Word文档(如.doc和.docx文档)中提取图片,可以使用以下代码:

import queue
from spire.doc import *
from spire.doc.common import *
import os

# 指定包含要处理文档的文件夹路径
folder_path = "文档文件夹/"
# 指定输出目录路径
output_path = "文档图片/"
# 如果输出目录不存在,则创建
os.makedirs(output_path, exist_ok=True)

# 获取文件夹中的所有文件
files = os.listdir(folder_path)

# 过滤出 .doc 和 .docx 文件
doc_files = [f for f in files if f.endswith(".doc") or f.endswith(".docx")]

# 遍历文档文件
for doc_file in doc_files:
    # 构建完整的文件路径
    input_file = os.path.join(folder_path, doc_file)

    # 创建一个Document实例
    document = Document()
    # 加载输入的Word文档
    document.LoadFromFile(input_file)

    # 创建一个列表来存储提取的图片数据
    images = []

    # 初始化一个队列来存储待遍历的文档元素
    nodes = queue.Queue()
    nodes.put(document)

    # 遍历文档元素
    while not nodes.empty():
        node = nodes.get()
        for i in range(node.ChildObjects.Count):
            obj = node.ChildObjects[i]
            # 查找图片
            if isinstance(obj, DocPicture):
                picture = obj
                # 将图片数据添加到列表中
                data_bytes = picture.ImageBytes
                images.append(data_bytes)
            elif isinstance(obj, ICompositeObject):
                nodes.put(obj)

    # 将图片数据保存为图像文件
    for i, image_data in enumerate(images):
        file_name = f"{doc_file}_Image-{i}.png"
        with open(os.path.join(output_path, file_name), 'wb') as image_file:
            image_file.write(image_data)

    document.Close()

使用Python提取Word文档特定页面上的图片

Word 文档可以包含多个页面,有时,你可能只需要从特定的一个或多个页面中提取图片。因为Word文档本质上是流式文档,流式布局,因此技术上来说,Word 文档本身没有“页面”的概念。 为了方便页面操作,Spire.Doc for Python提供了FixedLayoutDocument类,用于将Word文档转换为固定布局。 使用该类可以获取Word文档中特定页面的图片。

具体的代码如下:

from spire.doc import *
from spire.doc.common import *

# 指定输入文件路径
input_file = "测试.docx"
# 指定输出目录路径
output_path = "页面图片/"
# 如果输出目录不存在,则创建
os.makedirs(output_path, exist_ok=True)

# 创建一个Document实例
document = Document()
# 加载输入的Word文档
document.LoadFromFile(input_file)

# 创建一个列表来存储提取的图片数据
images = []

# 创建FixedLayoutDocument对象,并将Document对象作为参数传递给类构造函数
# 这一步是将文档转换为固定布局文档
layoutDoc = FixedLayoutDocument(document)

# 访问文档的第一页
layoutPage = layoutDoc.Pages[0]

# 遍历第一页第一列中的每一行
for i in range(layoutPage.Columns[0].Lines.Count):
    line = layoutPage.Columns[0].Lines[i]
    # 获取当前行的段落
    paragraph = line.Paragraph

    # 遍历段落中的子对象
    for j in range(paragraph.ChildObjects.Count):
        obj = paragraph.ChildObjects[j]
        # 查找图片
        if isinstance(obj, DocPicture):
            picture = obj
            # 将图片数据添加到列表中
            data_bytes = picture.ImageBytes
            images.append(data_bytes)

# 将图片数据保存为图像文件
for i, image_data in enumerate(images):
    file_name = f"Image-{i}.png"
    with open(os.path.join(output_path, file_name), 'wb') as image_file:
        image_file.write(image_data)

document.Close()

使用Python提取Word文档表格中的图片

表格是Word文档中常用的工具之一,常用于展示数据、统计信息或其他结构化信息。在某些情况下,这些表格可能包含嵌入的图片,如产品图片、景点照片等。要从表格中提取图片,需要遍历表格中的元素,然后找到类型是DocPicture的对象。

具体的代码如下:

from spire.doc import *
from spire.doc.common import *

# 指定输入文件路径
input_file = "表格.docx"
# 指定输出目录路径
output_path = "表格图片/"
# 如果输出目录不存在,则创建
os.makedirs(output_path, exist_ok=True)

# 创建一个Document实例
document = Document()
# 加载输入的Word文档
document.LoadFromFile(input_file)

# 获取第一节
section = document.Sections[0]

# 获取节中的第一个表格
table = section.Tables[0]

# 创建一个列表来存储提取的图片数据
images = []

# 遍历表格中的所有行
for i in range(table.Rows.Count):
    row = table.Rows[i]
    # 遍历每一行中的所有单元格
    for j in range(row.Cells.Count):
        cell = row.Cells[j]
        # 遍历每个单元格中的所有段落
        for k in range(cell.Paragraphs.Count):
            paragraph = cell.Paragraphs[k]
            # 遍历每个段落中的所有子对象
            for o in range(paragraph.ChildObjects.Count):
                obj = paragraph.ChildObjects[o]
                # 查找图片
                if isinstance(obj, DocPicture):
                    picture = obj
                    # 将图片数据添加到列表中
                    data_bytes = picture.ImageBytes
                    images.append(data_bytes)

# 将图片数据保存为图像文件
for i, image_data in enumerate(images):
    file_name = f"Image-{i}.png"
    with open(os.path.join(output_path, file_name), 'wb') as image_file:
        image_file.write(image_data)

document.Close()

使用Python提取Word文档页眉和页脚中的图片

Word文档中的页眉页脚可能会包含一些图片内容,例如公司logo。有时候你可能需要从页眉页脚提取这些图片内容以作进一步使用。

以下代码展示了如何从一个Word文档的页眉页脚中提取图片:

from spire.doc import *
from spire.doc.common import *

# 指定输入文件路径
input_file = "页眉页脚.docx"
# 指定输出目录路径
output_path = "页眉页脚图片/"
# 如果输出目录不存在,则创建
os.makedirs(output_path, exist_ok=True)

# 创建一个Document实例
document = Document()
# 加载输入的Word文档
document.LoadFromFile(input_file)

# 获取第一节
section = document.Sections[0]

# 创建一个列表来存储提取的图片数据
images = []

# 获取页眉
header = section.HeadersFooters.Header

# 遍历页眉中的所有段落
for i in range(header.Paragraphs.Count):
    paragraph = header.Paragraphs[i]
    # 遍历每个段落中的所有子对象
    for j in range(paragraph.ChildObjects.Count):
        obj = paragraph.ChildObjects[j]
        # 查找图片
        if isinstance(obj, DocPicture):
            picture = obj
            # 将图片数据添加到列表中
            data_bytes = picture.ImageBytes
            images.append(data_bytes)

# 获取页脚
footer = section.HeadersFooters.Footer

# 遍历页脚中的所有段落
for i in range(footer.Paragraphs.Count):
    paragraph = footer.Paragraphs[i]
    # 遍历每个段落中的所有子对象
    for j in range(paragraph.ChildObjects.Count):
        obj = paragraph.ChildObjects[j]
        # 查找图片
        if isinstance(obj, DocPicture):
            picture = obj
            # 将图片数据添加到列表中
            data_bytes = picture.ImageBytes
            images.append(data_bytes)

# 将图片数据保存为图像文件
for i, image_data in enumerate(images):
    file_name = f"Image-{i}.png"
    with open(os.path.join(output_path, file_name), 'wb') as image_file:
        image_file.write(image_data)

document.Close()

使用Python提取Word文档批注中的图片

批注是Word文档中一种常用的工具,用于添加注释、反馈或审阅意见。有时,批注中可能包含与文档内容相关的图片,如屏幕截图、标记或插图。下面的代码展示了如何提取Word文档的批注中的图片:

from spire.doc import *
from spire.doc.common import *

# 指定输入文件路径
input_file = "批注.docx"

# 指定输出目录路径
output_path = "批注图片/"

# 如果输出目录不存在,则创建
os.makedirs(output_path, exist_ok=True)

# 创建一个Document实例
document = Document()
# 加载输入的Word文档
document.LoadFromFile(input_file)

# 创建一个列表来存储提取的图片数据
images = []

for i in range(document.Comments.Count):
    comment = document.Comments[i]
    for j in range(comment.Body.Paragraphs.Count):
        paragraph = comment.Body.Paragraphs[j]
        for o in range(paragraph.ChildObjects.Count):
            obj = paragraph.ChildObjects[o]
            # 查找图片
            if isinstance(obj, DocPicture):
                picture = obj
                # 将图片数据添加到列表中
                data_bytes = picture.ImageBytes
                images.append(data_bytes)

# 将图片数据保存为图像文件
for i, image_data in enumerate(images):
    file_name = f"Image-{i}.png"
    with open(os.path.join(output_path, file_name), 'wb') as image_file:
        image_file.write(image_data)

document.Close()

这篇文章介绍了如何从Word文档及部分Word元素中提取图片,由于篇幅限制,并未涵盖所有的Word元素。你可以根据自己的文档元素,适当对代码进行修改或拓展。

本文完结。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nuclear2011/article/details/138069919

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签