使用Python的Spire.Doc库可通过遍历文本框对象模型,提取其中的段落文字、表格数据及图片。通过判断子对象类型,读取文字或表格单元格内容,利用ImageBytes属性导出图片。该方法支持嵌套文本框和编码处理,适用于文档自动化迁移与归档。
Word文档中的文本框功能非常实用,能够将独立的文字段落、表格甚至图片整合在一起,放置在文档中的任意位置。然而,在实际工作中(如文档迁移、数据归档或批量处理),经常需要将文本框内的文字和图片提取出来。与正文不同,文本框内容不属于文档主段落流,需要通过专门的文档对象模型进行遍历和访问。本文将介绍如何使用Python系统性地提取Word文本框中的文字、表格数据和嵌入图片。
本次使用的工具是Spire.Doc for Python。该库提供完整的文档对象模型,能够方便地遍历文本框中的子对象,并按类型分别处理。安装命令如下:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
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文档的文本框中提取文字和图片。通过遍历文本框对象,结合文档结构,可识别并读取其中的段落、表格等文本内容;同时利用图片对象的ImageBytes属性,实现文本框内图片的导出。此外,还讨论了嵌套文本框、编码处理、换行符解析等常见场景的处理方法。虽然文本框内容不属于文档正文流,但借助Spire.Doc提供的对象模型,仍可灵活访问和提取它们。掌握这些方法后,可进一步应用于Word文档归档、数据迁移、内容分析以及批量文档处理等自动化场景。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述