如何使用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
相关产品推荐
相关产品推荐

