先简单对比
在 2026 年,Python 环境下有多种开源库可用于将 SVG 转换为 PNG。以下是几种主流库的详细对比,可根据项目需求(如性能、渲染精度或依赖复杂度)做出选择。
主流开源库对比一览:

分析与建议
行业标杆:CairoSVG
CairoSVG 是目前 Python 社区最流行的选择。它将 SVG 解析为 Cairo 绘图命令,能够较好地处理标准的 SVG 1.1 特性。
- • 特点:支持通过
scale、dpi 等参数精确控制输出质量。 - • 注意:在 Windows 上安装时,通常需要手动配置
libcairo-2.dll 等系统环境。
性能之选:resvg-py
如果你追求转换速度和对 SVG 规范的严格遵循,resvg-py 是 2026 年的首选。它封装了 Rust 编写的 resvg 库,在处理复杂路径和静态渲染时,速度通常优于基于 Python 的传统库。
极简集成:svglib
如果你的项目已经在使用 ReportLab 生成 PDF,那么使用 svglib 是最顺理成章的。它将 SVG 转换为 ReportLab 的 Drawing 对象,方便在文档中复用。但请注意,它对复杂 SVG 效果(如滤镜)的兼容性较差。
重量级处理:Wand (ImageMagick)
对于需要对转换后的 PNG 进行进一步特效处理(如旋转、水印、调色)的任务,Wand 配合 ImageMagick 是万能工具库。
CairoSVG示例:
import cairosvg# 将 SVG 文件转换为 PNGcairosvg.svg2png(url='input.svg', write_to='output.png', scale=2.0)# 将 SVG 字符串直接转换为字节流# png_data = cairosvg.svg2png(bytestring=open('input.svg').read())
实测

上述种图,几个工具都能正常渲染。

resvg-py、CairoSVG等都搞不定上述这个图(上半图),渲染效果为下半图。
原因是:这个 SVG(d3-flame-graph 生成的)比较复杂,含大量 foreignObject + 嵌套 HTML。而上述这些库主要是渲染静态,比如resvg-py明确说明。
那如何渲染含有foreignObject的svg呢。
最终银弹
得请出重型武器,浏览器是最终银弹,可使用playwright调用。完美解决 foreignObject 的问题。
为何SVG普遍支持“不好”
这么多 Python SVG 转码库(CairoSVG、pyvips/librsvg、svglib 等)对复杂 SVG 支持不好的核心原因在于 SVG 标准本身过于强大且复杂,而这些库的后端实现都有不同程度的取舍和历史包袱,尤其是遇到 d3-flame-graph 这种大量使用
SVG 标准极度复杂,尤其是 foreignObject
- • 要完整渲染,需要同时支持 SVG 1.1/2 + XHTML + CSS(包括 flex、overflow、text-overflow 等)+ 复杂的坐标变换。
- • 大多数 SVG 渲染器(如 librsvg、resvg、Cairo)原本是为“纯 SVG”设计的,不是为“混合 HTML”优化的。 → 结果:文字定位错乱、部分元素缺失、背景不跟动、溢出被裁剪、细小文字消失等(你看到的“只显示部分”就是典型表现)。
浏览器天生支持混合内容
SVG 标准允许 <foreignObject> 嵌入任意 XHTML/HTML/CSS,甚至部分 JS(虽不动画)。浏览器把这当成“网页的一部分”处理:
- • 用 Blink/WebKit/Gecko 完整渲染 HTML + CSS(布局、字体、溢出、flex 等)。
- • SVG 的坐标变换(transform、viewBox)无缝应用到 foreignObject 里的 div/span。
- • 文字自动换行、字体 fallback、对齐全对。
- • d3-flame-graph 这种火焰图故意靠 foreignObject + HTML 实现可读文字(纯 SVG
<text> 很难自动处理多行/溢出),浏览器完美还原。
历史与优先级原因
SVG 规范从 2000 年代开始就很复杂(1.1 → 2),但 Web 浏览器有 Google/Apple/Mozilla 持续砸钱优化(每年数千 commit)。
开源 SVG 库多是社区/个人维护,优先级是“常见场景”(图标、简单图表),而 foreignObject + HTML 是“边缘但毒”的用例(浏览器用户多,standalone 用户少)。
结果是,resvg/librsvg 的 SVG 支持表里,foreignObject/HTML 仍是弱项或空白。
小结
静态首选resvg-py,含有foreignObject的复杂svg,使用playwright解决。