目录
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转PDF、Word转RTF、Word转HTML、Word转文本、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元素。你可以根据自己的文档元素,适当对代码进行修改或拓展。
本文完结。