如何用Python读取并插入Word文档图片?解决inline_shapes为空问题
解决python-docx处理docx模板时签名图片消失的问题
问题分析
你使用的python-docx 0.8.11版本过于老旧,对Word图片的支持存在明显局限:
- 无法识别浮动式图片(不在段落内的图片,比如画布、文本框中的)
- 对嵌入式图片的遍历和读取存在bug,导致
inline_shapes返回空列表
解决方案
1. 优先升级python-docx到最新版
旧版本的多数图片处理问题在新版中已修复,执行升级命令:
pip install --upgrade python-docx
升级后可正常遍历嵌入式图片:
from docx import Document doc = Document('test.docx') # 现在能正常获取所有嵌入式图片 for inline_shape in doc.inline_shapes: print(f"图片尺寸:{inline_shape.width} x {inline_shape.height}")
2. 提取原文档图片并重新插入
如果更新文档时误删了图片所在段落,或图片是浮动式的,可先提取原文档图片,再插入到指定位置:
步骤1:提取原文档中的图片
docx本质是压缩包,直接解压提取word/media/下的所有图片:
import zipfile import os with zipfile.ZipFile('test.docx', 'r') as zip_obj: os.makedirs('extracted_images', exist_ok=True) # 提取所有媒体文件 for file_path in zip_obj.namelist(): if file_path.startswith('word/media/'): zip_obj.extract(file_path, 'extracted_images')
步骤2:在更新后的文档中插入图片
找到目标位置(比如指定段落)插入图片:
from docx import Document from docx.shared import Inches doc = Document('test.docx') # 执行你的更新操作,比如替换文本占位符 for para in doc.paragraphs: if '{{signature_pos}}' in para.text: para.text = para.text.replace('{{signature_pos}}', '') # 在该段落插入签名图片 run = para.add_run() # 替换为你提取的图片路径 run.add_picture('extracted_images/word/media/image1.png', width=Inches(2)) doc.save('updated_test.docx')
3. 特殊情况:数字签名图片
如果你的签名是Word的数字签名域,python-docx无法处理这类特殊对象,需用pywin32调用Word原生COM接口处理(需安装Office):
import win32com.client as win32 import os word = win32.gencache.EnsureDispatch('Word.Application') word.Visible = False doc_path = os.path.abspath('test.docx') doc = word.Documents.Open(doc_path) # 执行文档更新操作,比如替换用户名占位符 doc.Content.Find.Execute(FindText='{{username}}', ReplaceWith='李四') # 保存文档,数字签名会保留 doc.SaveAs(os.path.abspath('updated_test.docx')) doc.Close() word.Quit()
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

