You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中将WMF/EMF转换为PNG/JPEG?(非GPL/无外部依赖)

WMF转PNG的纯Python解决方案(符合非GPL/无外部依赖要求)

方案说明

完全符合你的限制条件:

  • 无GPL协议库:所用库均为MIT/BSD类宽松协议
  • 无外部工具调用:纯Python实现,无需子进程调用inkscape/libreoffice等软件
  • 无系统级依赖:全部通过pip安装,无需apt等包管理器

所需依赖

通过pip安装以下库:

pip install wmf2svg svglib reportlab pillow

各库协议说明:

  • wmf2svg:MIT协议,纯Python的WMF解析与转SVG工具
  • svglib:MIT协议,用于将SVG转换为ReportLab图形对象
  • reportlab:BSD-like协议,用于渲染图形为PNG
  • pillow:HPND协议,可选用于后续PNG处理

转换代码示例

import io
from wmf2svg import WmfRenderer
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM

def wmf_to_png(wmf_input_path, png_output_path):
    # 将WMF文件转换为SVG字符串
    renderer = WmfRenderer()
    svg_content = renderer.render_file(wmf_input_path)
    
    # 解析SVG内容为ReportLab绘图对象
    drawing = svg2rlg(io.StringIO(svg_content))
    
    # 渲染绘图对象为PNG文件
    renderPM.drawToFile(drawing, png_output_path, fmt='PNG')

if __name__ == '__main__':
    wmf_to_png('test.wmf', 'test.png')

替代实现(使用Pillow处理PNG)

如果需要用Pillow对生成的PNG做进一步处理,可使用以下代码:

import io
from wmf2svg import WmfRenderer
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM
from PIL import Image

def wmf_to_png(wmf_input_path, png_output_path):
    renderer = WmfRenderer()
    svg_content = renderer.render_file(wmf_input_path)
    
    drawing = svg2rlg(io.StringIO(svg_content))
    
    # 将PNG渲染到字节流
    png_bytes = io.BytesIO()
    renderPM.drawToFile(drawing, png_bytes, fmt='PNG')
    
    # 用Pillow加载并保存
    png_bytes.seek(0)
    with Image.open(png_bytes) as img:
        img.save(png_output_path, format='PNG')

if __name__ == '__main__':
    wmf_to_png('test.wmf', 'test.png')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:17:24