word 文档中的文本框常用于承载独立的文字段落、表格以及图片等内容。在文档内容迁移、数据归档或自动化处理场景中,经常需要将文本框中的文字提取出来进行二次利用,或者将文本框内嵌入的图片导出为独立文件。与正文内容不同,文本框中的元素并不直接出现在文档的主体段落流中,因此需要通过特定的对象模型进行遍历和访问。本文将介绍如何使用 python 系统地提取 word 文本框中的文字内容和图片数据,涵盖段落文本、表格文本以及嵌入图片的提取方法。
环境准备
本文使用 spire.doc for python 库来操作 word 文档。该库提供了完整的文档对象模型,支持遍历文本框内部的子对象并按类型分别处理。通过以下命令安装:
pip install spire.doc
安装完成后,在脚本中导入所需模块即可开始使用。
from spire.doc import * from spire.doc.common import *
遍历文本框并提取文字
文本框在 spire.doc 的对象模型中属于 textbox 类型,其内部内容通过 body 属性暴露,结构与文档主体类似。文本框内可能包含段落和表格两种主要元素,需要通过遍历 childobjects 集合并判断每个子对象的 documentobjecttype 来分别处理。这种逐层遍历的方式能够确保不遗漏任何嵌套结构中的文字内容。
from spire.doc import *
from spire.doc.common import *
inputfile = "/文本框.docx"
outputfile = "extractedtext.txt"
# 加载文档
document = document()
document.loadfromfile(inputfile)
# 检查文档中是否包含文本框
if document.textboxes.count > 0:
with open(outputfile, 'w', encoding='utf-8') as sw:
for i in range(document.textboxes.count):
textbox = document.textboxes.get_item(i)
# 遍历文本框内的子对象
for j in range(textbox.body.childobjects.count):
obj = textbox.body.childobjects.get_item(j)
# 提取段落文字
if obj.documentobjecttype == documentobjecttype.paragraph:
para = obj if isinstance(obj, paragraph) else none
sw.write(para.text + "\n")
# 提取表格中的文字
if obj.documentobjecttype == documentobjecttype.table:
table = obj if isinstance(obj, table) else none
for row_idx in range(table.rows.count):
row = table.rows[row_idx]
for cell_idx in range(row.cells.count):
cell = row.cells[cell_idx]
for para_idx in range(cell.paragraphs.count):
para = cell.paragraphs.get_item(para_idx)
sw.write(para.text + "\t")
sw.write("\n")
document.close()

上述代码首先通过 document.textboxes 集合获取文档中的所有文本框。对于每个文本框,通过 body.childobjects 遍历其内部子对象。当子对象类型为 paragraph 时,直接读取 text 属性获取段落文字;当子对象类型为 table 时,则进一步遍历表格的行、单元格和单元格内的段落,逐个提取文字内容。使用制表符 \t 分隔同一行中不同单元格的文字,换行符 \n 分隔不同行,这样可以保留表格的行列结构,便于后续处理。
从文本框中读取表格数据
如果明确知道文本框中包含表格,并且需要以结构化的方式读取表格内容,可以直接通过 body.tables 集合访问文本框中的表格对象。这种方式比遍历 childobjects 更加直接,适用于已知文本框内部结构的场景。
from spire.doc import *
from spire.doc.common import *
inputfile = "./data/textboxtable.docx"
outputfile = "tablefromtextbox.txt"
# 加载文档
doc = document()
doc.loadfromfile(inputfile)
# 获取第一个文本框
textbox = doc.textboxes[0]
# 获取文本框中的第一个表格
table = textbox.body.tables[0] if isinstance(textbox.body.tables[0], table) else none
result = ""
for i in range(table.rows.count):
row = table.rows.get_item(i)
for j in range(row.cells.count):
cell = row.cells.get_item(j)
for k in range(cell.paragraphs.count):
paragraph = cell.paragraphs.get_item(k)
result += paragraph.text + "\t"
result += "\n"
with open(outputfile, 'w', encoding='utf-8') as fp:
fp.write(result)
doc.close()
这段代码通过 doc.textboxes[0] 直接获取文档中第一个文本框,再通过 textbox.body.tables[0] 获取该文本框中的第一个表格。随后按照行 → 单元格 → 段落的层次结构逐层遍历,将每个单元格内的文字拼接成文本输出。这种方法适用于文本框中表格位置已知的情况,可以减少不必要的遍历开销。
提取文本框中的图片
文本框中的图片在 spire.doc 中以 docpicture 对象表示,其 imagebytes 属性包含了图片的二进制数据。提取图片的核心思路与提取文字类似:遍历文本框的子对象,当发现类型为 picture 的子对象时,读取其 imagebytes 并写入文件。需要注意的是,图片可能嵌套在段落内部,因此需要递归遍历所有层级的子对象。
from spire.doc import *
from spire.doc.common import *
import os
inputfile = "./data/textboxwithimages.docx"
outputdir = "extractedimages/"
if not os.path.exists(outputdir):
os.makedirs(outputdir)
# 加载文档
document = document()
document.loadfromfile(inputfile)
image_index = 0
# 遍历所有文本框
for i in range(document.textboxes.count):
textbox = document.textboxes.get_item(i)
# 遍历文本框中的子对象
for j in range(textbox.body.childobjects.count):
obj = textbox.body.childobjects.get_item(j)
# 检查是否为段落,图片通常嵌套在段落中
if obj.documentobjecttype == documentobjecttype.paragraph:
para = obj if isinstance(obj, paragraph) else none
for k in range(para.childobjects.count):
child = para.childobjects.get_item(k)
if child.documentobjecttype == documentobjecttype.picture:
picture = child if isinstance(child, docpicture) else none
# 获取图片二进制数据并保存
image_bytes = picture.imagebytes
image_path = os.path.join(outputdir, f"image-{image_index}.png")
with open(image_path, 'wb') as img_file:
img_file.write(image_bytes)
image_index += 1
print(f"已保存图片: {image_path}")
document.close()

上述代码遍历文档中所有文本框,对于每个文本框内的每个段落,进一步遍历段落的 childobjects 集合。当子对象类型为 picture 时,将其转换为 docpicture 对象,通过 imagebytes 属性获取图片的二进制数据,并以 png 格式写入文件。imagebytes 返回的是原始图片字节流,默认以 png 格式保存;如果原始图片为 jpeg 或其他格式,也可以根据实际需求修改文件扩展名。每个图片文件以序号命名,确保不会发生文件名冲突。
实用技巧
同时提取文字和图片
在实际应用中,文本框内往往同时包含文字和图片。可以将上述提取逻辑整合到一个遍历流程中:对外层遍历到段落时,既提取段落文字,又检查段落内是否包含图片子对象。这样只需一次遍历即可完成所有内容的提取,提高处理效率。
处理嵌套文本框
word 文档支持文本框的嵌套,即一个文本框内部可能还包含其他文本框。如果在提取过程中发现 documentobjecttype.textbox 类型的子对象,需要对其 body 进行递归遍历,以确保所有层级的内容都能被提取到。可以通过定义递归函数来实现这一逻辑。
编码与换行处理
提取的文字写入文件时,建议统一使用 utf-8 编码(encoding='utf-8'),以避免中文等非 ascii 字符出现乱码。同时,不同操作系统对换行符的处理方式不同(windows 使用 \r\n,linux/macos 使用 \n),如果需要在特定平台上正确显示,可以针对性地调整换行符格式。
总结
本文介绍了如何使用 python 借助 spire.doc 从 word 文档的文本框中提取文字和图片。通过遍历文本框对象并结合文档结构,可以识别并读取其中的段落、表格等文本内容,同时利用图片对象实现文本框内图片的导出。此外,本文还介绍了嵌套文本框、编码处理以及换行符解析等常见场景的处理方法。虽然文本框中的内容不属于文档正文流,但通过 spire.doc 提供的对象模型,仍然可以对其进行灵活访问和提取。掌握这些方法后,可以进一步应用于 word 文档归档、数据迁移、内容分析以及批量文档处理等自动化场景。
到此这篇关于使用python轻松获取word文本框中的文字和图片的文章就介绍到这了,更多相关python获取word文本框文字和图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论