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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:15:06