You need to enable JavaScript to run this app. python-docx插入OpenCV处理图片报AttributeError: 'NoneType'无seek属性
优惠活动
大模型
产品
解决方案
定价
更多

python-docx插入OpenCV处理图片报AttributeError: 'NoneType'无seek属性

问题原因

该报错由两个叠加的错误触发:

  • numpy.ndarray.resize()是原位修改数组维度的方法,没有返回值,你赋值得到的resized_image实际为None,python-docx的add_picture方法接收None后尝试调用seek读取内容就会触发该报错
  • add_picture方法本身不支持直接传入OpenCV读取得到的numpy数组格式,仅支持本地文件路径、字节流、PIL Image对象三类输入
修复步骤
  • 替换numpy数组的resize调用为cv2.resize()方法,正确得到调整尺寸后的图像数组
  • 调整后的OpenCV数组转换为PIL Image对象,再传入add_picture方法
  • 修正原代码中逻辑分支判断的错误,原判断条件覆盖不全,横版、竖版图像的判断逻辑写反
修复后完整代码
from docx import Document
import cv2
from PIL import Image
import glob 
import os
from io import BytesIO

document = Document()

img_dir = "C:/Users/27832/Desktop/Report Images"
data_path = os.path.join(img_dir,'*g') 
files = glob.glob(data_path) 

for pic in files: 
    # 跳过读取失败的无效文件
    if not os.path.exists(pic):
        continue
    imagg = cv2.imread(pic)
    if imagg is None:
        continue
    # cv2默认BGR格式,转成PIL需要的RGB格式
    imagg = cv2.cvtColor(imagg, cv2.COLOR_BGR2RGB)
    h, w = imagg.shape[:2]
    aspect_ratio = w / h
    
    # 按宽高比调整尺寸
    if 0.85 < aspect_ratio < 1.15:
        # 近似正方形
        resized = cv2.resize(imagg, (314, 314))
    elif aspect_ratio >= 1.15:
        # 横版图片
        resized = cv2.resize(imagg, (401, 325))
    else:
        # 竖版图片
        resized = cv2.resize(imagg, (257, 382))
    
    # 转成字节流传入docx,无需临时存储本地文件
    pil_img = Image.fromarray(resized)
    img_stream = BytesIO()
    pil_img.save(img_stream, format='PNG')
    img_stream.seek(0)
    
    document.add_picture(img_stream)

# 自动创建目标保存目录
save_dir = "C:/Users/27832/Desktop/Word Macro Program"
if not os.path.exists(save_dir):
    os.makedirs(save_dir)
document.save(os.path.join(save_dir, "Report.docx"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 03:42:02