运营上传的 SVG 在浏览器里正常,服务端转 PNG 时报 URL not found,输出图里 logo 位置是空白。SVG 里用的是 <image xlink:href> 指向 CDN,本地预览能加载。乍看像缓存或者权限的锅,追下去往往不是。
import cairosvg cairosvg.svg2png(url="in.svg", write_to="out.png", output_width=1200, unsafe=False)
追下去是这么回事:cairosvg 默认不发起网络请求,外部 href 一律当成缺失资源。浏览器有网络上下文,所以看起来正常。字体和 CSS 外链也一样,缺了只留空白不报错。
「cairosvg 外链资源」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,先禁止 SVG 引用外部资源 上传时校验并清理;确实需要的图片改成内嵌 base64;转换时统一指定字体和 DPI 保证输出一致;转换失败要抛异常 不要吞掉只写空图。
验收就看一点,同一份 SVG 转出的 PNG 里 logo 正常显示,转换日志没有 URL not found,输出宽度是 1200px。
