最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
使用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()
上述代码首先通过 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()
上述代码遍历文档中所有文本框,对于每个文本框内的每个段落,进一步遍历段落的 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 文档归档、数据迁移、内容分析以及批量文档处理等自动化场景。
相关文章
- 斗罗大陆魂师对决星斗蝎子如何打 星斗蝎子打法教程 07-30
- 斗罗大陆魂师对决风笑天PVP阵容怎么搭配 风笑天阵容推荐 07-30
- 白银之城同一律测试配置推荐 同一律测试配置要求 07-30
- 斗罗大陆魂师对决全民对决肉队如何组 全民对决肉队详情 07-30
- 斗罗大陆魂师对决新版本火舞阵容如何搭配 火舞阵容搭配 07-30
- 斗罗大陆魂师对决巅峰演武古榕如何过 挑战古榕攻略 07-30