使用docxtpl插入InlineImage报图片不存在错误如何解决
问题背景
需要批量将图片插入Word文档,统一图片尺寸实现便捷打印,使用如下代码实现时抛出Image does not exist报错,提示对应jpg图片不存在,已自行确认文件名、存储路径填写正确仍无法解决:
from docxtpl import DocxTemplate from docxtpl import InlineImage from docx.shared import Mm import os folder = "./mercedes/" for img_name in os.listdir(folder): doc = DocxTemplate("C:\\Users\\jpp08\\Documents\\MIDDELKOOP\\testimg.docx") img1 = InlineImage(doc, image_descriptor=f'{img_name}', width=Mm(20), height=Mm(10)) context = {'img1': img1} doc.render(context) doc.save(f"{folder}/{img_name}" +".docx")
核心报错原因
os.listdir(folder)仅返回目标目录下的文件/子文件夹名称,不包含父目录路径。代码中直接将img_name传入InlineImage,程序会在当前脚本运行的工作目录下查找对应图片,而非./mercedes/目录,自然会触发文件不存在报错。
排查解决步骤
- 优先修正路径拼接逻辑:遍历得到文件名后,通过
os.path.join()将文件夹路径和文件名拼接为完整路径,再传入图片读取接口。 - 过滤无效遍历项:目录下可能存在子文件夹、系统隐藏文件、非图片格式文件,遍历过程中需要跳过这些项,避免将非图片文件传入图片加载接口。
- 确认文件真实后缀:Windows系统默认隐藏已知文件类型的扩展名,可能出现视觉上文件名是
test.jpg、实际完整文件名是test.jpg.jpg的情况,可在文件资源管理器勾选「文件扩展名」选项查看真实文件名。 - 规避相对路径歧义:如果使用IDE运行代码,注意IDE默认工作目录可能和脚本所在目录不一致,不确定时直接拼接为绝对路径传入即可。
- 优化保存逻辑:原代码保存生成的Word文档时,会把图片原后缀也带入文件名,最终生成类似
test.jpg.docx的文件,可提前拆分文件名后缀,生成更规范的文档名。
修正后代码
from docxtpl import DocxTemplate, InlineImage from docx.shared import Mm import os folder = "./mercedes/" template_path = "C:\\Users\\jpp08\\Documents\\MIDDELKOOP\\testimg.docx" for img_name in os.listdir(folder): img_full_path = os.path.join(folder, img_name) # 跳过子文件夹、非图片格式文件 if not os.path.isfile(img_full_path) or not img_name.lower().endswith(('.jpg', '.jpeg', '.png')): continue doc = DocxTemplate(template_path) img1 = InlineImage(doc, image_descriptor=img_full_path, width=Mm(20), height=Mm(10)) context = {'img1': img1} doc.render(context) # 拆分原图片后缀,生成规范的docx文件名 save_name = f"{os.path.splitext(img_name)[0]}.docx" doc.save(os.path.join(folder, save_name))
内容的提问来源于stack exchange,提问作者user17825405
相关产品推荐
相关产品推荐

