一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

使用Python轻松获取Word文本框中的文字和图片

时间:2026-07-30 15:24:59 编辑:袖梨 来源:一聚教程网

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()

使用Python轻松获取Word文本框中的文字和图片

上述代码首先通过 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 Noneresult = ""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 osinputFile = "./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()

使用Python轻松获取Word文本框中的文字和图片

上述代码遍历文档中所有文本框,对于每个文本框内的每个段落,进一步遍历段落的 ChildObjects 集合。当子对象类型为 Picture 时,将其转换为 DocPicture 对象,通过 ImageBytes 属性获取图片的二进制数据,并以 PNG 格式写入文件。ImageBytes 返回的是原始图片字节流,默认以 PNG 格式保存;如果原始图片为 JPEG 或其他格式,也可以根据实际需求修改文件扩展名。每个图片文件以序号命名,确保不会发生文件名冲突。

实用技巧

同时提取文字和图片

在实际应用中,文本框内往往同时包含文字和图片。可以将上述提取逻辑整合到一个遍历流程中:对外层遍历到段落时,既提取段落文字,又检查段落内是否包含图片子对象。这样只需一次遍历即可完成所有内容的提取,提高处理效率。

处理嵌套文本框

Word 文档支持文本框的嵌套,即一个文本框内部可能还包含其他文本框。如果在提取过程中发现 DocumentObjectType.TextBox 类型的子对象,需要对其 Body 进行递归遍历,以确保所有层级的内容都能被提取到。可以通过定义递归函数来实现这一逻辑。

编码与换行处理

提取的文字写入文件时,建议统一使用 UTF-8 编码(encoding='utf-8'),以避免中文等非 ASCII 字符出现乱码。同时,不同操作系统对换行符的处理方式不同(Windows 使用 rn,Linux/macOS 使用 n),如果需要在特定平台上正确显示,可以针对性地调整换行符格式。

总结

本文介绍了如何使用 Python 借助 Spire.Doc 从 Word 文档的文本框中提取文字和图片。通过遍历文本框对象并结合文档结构,可以识别并读取其中的段落、表格等文本内容,同时利用图片对象实现文本框内图片的导出。此外,本文还介绍了嵌套文本框、编码处理以及换行符解析等常见场景的处理方法。虽然文本框中的内容不属于文档正文流,但通过 Spire.Doc 提供的对象模型,仍然可以对其进行灵活访问和提取。掌握这些方法后,可以进一步应用于 Word 文档归档、数据迁移、内容分析以及批量文档处理等自动化场景。

热门栏目