使用Python批量从Word文档及各种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元素。你可以根据自己的文档元素,适当对代码进行修改或拓展。

本文完结。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值