如何从Zip压缩包直接加载字体到Matplotlib?
直接从Zip包加载字体到Matplotlib的解决方案
核心思路
Matplotlib支持通过字体字节流直接注册字体,无需提前解压到本地文件。结合zipfile读取压缩包内的字体文件流,再用Fonttools解析字体元信息,就能实现无解压加载字体的需求。
具体实现步骤
- 用
zipfile.ZipFile打开目标压缩包,读取指定字体文件的字节数据 - 通过Fonttools解析字体,提取字体名称等元信息(方便后续调用识别)
- 将字体字节数据注册到Matplotlib的字体管理器中
- 在绘图时直接调用已注册的字体
代码示例
import zipfile import io from fontTools.ttLib import TTFont from matplotlib.font_manager import FontManager import matplotlib.pyplot as plt def load_font_from_zip(zip_path, font_filename): # 读取Zip包内的字体字节流 with zipfile.ZipFile(zip_path, 'r') as zf: if font_filename not in zf.namelist(): raise FileNotFoundError(f"字体文件 {font_filename} 不存在于压缩包中") font_data = zf.read(font_filename) # 用Fonttools解析字体,提取正式名称 ttfont = TTFont(io.BytesIO(font_data)) font_name = ttfont['name'].getDebugName(4) # 注册字体到Matplotlib fm = FontManager() font_prop = fm.add_font( fontfile=None, fontdata=font_data, name=font_name ) return font_prop # 示例:加载并使用字体 if __name__ == "__main__": # 替换为你的Zip包路径和字体文件名 font_prop = load_font_from_zip("large_fonts.zip", "NotoSansSC-Regular.ttf") # 测试绘图 plt.figure(figsize=(8, 4)) plt.text(0.5, 0.5, "这是从Zip包加载的字体测试", fontproperties=font_prop, fontsize=24, ha='center') plt.axis('off') plt.show()
注意事项
- 若需批量加载压缩包内的所有字体,可遍历
zf.namelist()筛选出.ttf/.otf等格式文件,逐个注册 - 注册后的字体可通过
FontManager().get_font_names()查看是否成功添加 - 首次注册字体需要解析字节流,会有少量耗时,但后续绘图无需重复读取Zip包,符合性能要求
- 确保Fonttools和Matplotlib版本兼容(建议使用较新版本的库)
内容的提问来源于stack exchange,提问作者Lukas W.
相关产品推荐
相关产品推荐

