如何在Django环境下用Python docxtpl通过URL添加InlineImage图片
解决方案
核心原理
docxtpl的InlineImage仅支持本地文件路径、字节流、类文件对象作为图片源,不支持直接传入网络URL,你遇到的报错就是因为程序把URL当作本地磁盘路径去读取,自然会触发路径无效的异常。
你不需要将远程图片存储到本地磁盘,只需要先将图片内容下载到内存中,转成类文件对象再传入即可。
实现步骤
- 先安装依赖(如果项目中还没有安装requests):
pip install requests
- 代码实现示例:
import requests from io import BytesIO from docxtpl import DocxTemplate, InlineImage # 如果需要指定图片尺寸,额外导入单位类 from docx.shared import Mm # 你的DocxTemplate实例 document = DocxTemplate("你的模板路径.docx") # 远程图片URL img_url = "https://files-cdn.myhost.net/3255/ddef9d07-0a6b-4f54-801a-c016e6d41885/myimage.png" # 下载图片到内存 resp = requests.get(img_url, timeout=10) # 校验请求是否成功,可自行包裹try-except捕获异常处理异常场景 resp.raise_for_status() # 转为BytesIO类文件对象 img_file = BytesIO(resp.content) # 生成InlineImage对象,可自行指定宽高 inline_img = InlineImage(document, img_file, width=Mm(50)) # 后续正常把inline_img传入模板渲染即可
注意事项
- 网络请求建议加超时参数,避免服务端出现长时间阻塞
- 可以根据业务需要捕获
requests.exceptions.RequestException类型的异常,处理图片下载失败的场景 - 整个过程全部在内存中完成,不会产生本地临时文件,适配Django服务端运行场景
内容的提问来源于stack exchange,提问作者Sander
相关产品推荐
相关产品推荐

