You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python读取或修改Word DocX文档中绘图形状内的文本内容

解决方案

python-docx 原生未封装嵌入形状内文本框内容的直接访问接口,因此你遍历 inline_shapes 无法直接获取文本是正常情况,直接操作文档XML完全可以实现提取、编辑需求,具体实现逻辑如下:

核心逻辑说明

从你提供的blob输出可以看到,形状内部的文本全部存放在 <v:textbox> 标签下的 <w:txbxContent> 节点中,该节点下的 <w:p> 段落结构和文档正文的段落XML结构完全一致,遵循相同的命名空间规范。

具体实现步骤

  • 无需手动解析 doc.inline_shapes.part.blob,每个 InlineShape 对象自带 _element 属性,直接对应该形状的XML根节点
  • 从XML根节点查找 <w:txbxContent> 节点,定位到文本存放区域
  • 遍历该节点下的段落节点,即可实现文本提取或内容修改

代码示例

from docx import Document

# 加载目标文档
doc = Document("测试文档.docx")

# 遍历所有嵌入形状
for idx, shape in enumerate(doc.inline_shapes):
    # 查找当前形状下的文本框内容节点,自动适配命名空间
    txbx_node = shape._element.find(".//w:txbxContent", namespaces=shape._element.nsmap)
    if not txbx_node:
        continue
    
    print(f"===== 第{idx+1}个形状的文本内容 =====")
    # 遍历文本框内的所有段落,和正文段落处理逻辑完全一致
    for p_node in txbx_node.findall("w:p", namespaces=txbx_node.nsmap):
        # 提取段落文本
        cur_text = "".join([t.text for t in p_node.findall(".//w:t", namespaces=p_node.nsmap) if t.text])
        print(cur_text)
        
        # 若要修改内容,直接修改w:t节点的text属性即可,修改后调用doc.save()就会生效
        # for t_node in p_node.findall(".//w:t", namespaces=p_node.nsmap):
        #     if "需要替换的关键词" in t_node.text:
        #         t_node.text = t_node.text.replace("需要替换的关键词", "替换后的内容")

# 保存修改后的文档(如果做了编辑操作的话)
# doc.save("修改后的文档.docx")

额外说明

如果你要处理的是浮动形状(不属于 inline_shapes 列表,而是插入在段落内的悬浮形状),只需要遍历文档所有段落的 <w:drawing> 节点,用同样的方法查找 <w:txbxContent> 节点即可。


内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:06:05