OpenMAIC 渲染包自托管中文字体的授权合规实践:解读 `@openmaic/renderer` FONTS.md 白名单与再分发机制
2026/9/11 1:44:48 网站建设 项目流程

OpenMAIC 渲染包自托管中文字体的授权合规实践:解读@openmaic/rendererFONTS.md 白名单与再分发机制

【免费下载链接】OpenMAICOpen Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click项目地址: https://gitcode.com/GitHub_Trending/op/OpenMAIC

@openmaic/renderer是 OpenMAIC 项目中用于渲染 PPTist 风格幻灯片 JSON 的只读画布包(见 packages/@openmaic/renderer/README.md)。从 PowerPoint 导入的幻灯片常引用中文字体,而查看端未必安装这些字体,因此该包通过自托管 woff2 文件提供一批中文界面字体。本文以 FONTS.md 这份字体授权与署名记录为骨架,深入讲解其字体分发架构、6 款白名单字体的许可细节、被排除字体的原因,以及如何按合规要求维护这套自托管字体体系——读完你可以理解"服务字体即再分发"的合规边界,并掌握在自有应用中接入与扩展这套字体的完整方案。

为什么渲染器需要一份"字体授权记录"

先明确一个关键前提:@openmaic/renderer本身不内嵌任何字体二进制文件fonts.css中只声明@font-face规则,其src指向对象存储上的自托管 woff2 文件(https://file.maic.chat/fonts/<name>.woff2)。但"把这些字体文件托管并对外提供访问"本身就是一种**再分发(redistribution)**行为,因此每款字体都必须确认具备再分发许可,并在此处完成署名。这就是 FONTS.md 存在的意义:它是字体的授权/清算记录(clearance record),独立于包本身的 MIT 许可证——MIT 不覆盖字体部分。

值得注意的还有字体名称的传递规则。从 FONTS.md 及 fonts.config.mjs 的注释可以看到:

importer 不做字体重映射:它把每张幻灯片原始的font-family名称原样透传。只有名称与白名单中的字体面匹配时才使用对应字体渲染,否则浏览器回退到系统字体。

这意味着白名单列表与幻灯片中实际使用的字体族一一对应,列表的完备性直接决定导入幻灯片的中文字体能否正确呈现。

技术架构:单一事实来源与自动生成的 fonts.css

这套字体体系采用"配置驱动生成"的设计,核心文件有三个:

  1. fonts.config.mjs—— 唯一事实来源(single source of truth)
  2. scripts/generate-fonts-css.mjs—— 生成器
  3. fonts.css—— 生成产物(禁止手改)

fonts.config.mjs定义了四个导出:

/** Object-storage origin that serves the woff2 files. */ export const FONT_CDN_BASE_URL = 'https://file.maic.chat'; /** Path segment under the origin where the woff2 files live. */ export const FONT_DIR = 'fonts'; /** Ordered whitelist of font-family names (each backed by one Regular woff2). */ export const FONT_FAMILIES = [ 'SourceHanSans', 'SourceHanSerif', 'LXGWWenKai', 'ZhuQueFangSong', 'WenDingPLKaiTi', 'ZcoolHappy', ]; /** Build the woff2 URL for a given family. */ export const fontUrl = (family) => `${FONT_CDN_BASE_URL}/${FONT_DIR}/${family}.woff2`;

生成脚本 generate-fonts-css.mjs 读取上述配置,逐一对每个 family 生成一个@font-face块,并写入fonts.css。脚本开头明确写道:"fonts.cssis GENERATED from this file",对应命令为pnpm run genfonts,且构建会自动先执行生成(见 package.json 中build脚本的第一句node scripts/generate-fonts-css.mjs)。

生成结果即 fonts.css,每款字体对应一个标准声明,例如:

@font-face { font-display: swap; font-family: 'SourceHanSans'; src: url('https://file.maic.chat/fonts/SourceHanSans.woff2') format('woff2'); }

全部 6 款字体均采用font-display: swap,即在字体加载完成前先用回退字体显示文本,避免阻塞渲染。字体文件按需加载——只有幻灯片实际使用到对应font-family时,浏览器才会首次发起该 woff2 请求。

在消费端,只需在应用外壳导入一次:

import '@openmaic/renderer/fonts.css';

该子路径通过 package.json 的exports字段显式导出("./fonts.css": "./fonts.css"),并且files数组包含了fonts.cssFONTS.mdfont-licenses目录,确保发布到 npm 时这些合规文件随之分发。

运行时依赖提醒(重要):README.md 特别指出,@font-facesrcURL 指向外部字体托管源(https://file.maic.chat/fonts/<name>.woff2),woff2 文件不打包在包里。因此这是一项硬运行时依赖:该域名必须从消费端应用可达且开启 CORS,否则浏览器会静默回退到系统字体(不会报错,只是字形和度量不同)。若需要其他来源(自托管、离线内网、私有 CDN),修改FONT_CDN_BASE_URL后执行pnpm run genfonts重新生成即可。

白名单总览:6 款可再分发的中文字体

FONTS.md 给出的白名单完整清单如下(许可原文分别捆绑在 font-licenses/OFL.txt、font-licenses/ARPHIC-PL.txt、font-licenses/ZcoolHappy-LICENSE.txt):

Family(font-family中文名LicenseRedistributionCopyright / source
SourceHanSans思源黑体SIL OFL 1.1© 2014–2021 Adobe, Reserved Font Name "Source Han Sans"
SourceHanSerif思源宋体SIL OFL 1.1© 2017–2021 Adobe, Reserved Font Name "Source Han Serif"
LXGWWenKai霞鹜文楷SIL OFL 1.1© 2021 The LXGW WenKai Project Authors
ZhuQueFangSong朱雀仿宋SIL OFL 1.1© 2023 Zhejiang JadeFoci Technology Co. LTD
ZcoolHappy站酷快乐体站酷(ZCOOL)免费使用授权(永久免费授权所有人使用,可免费商用)✅(有条件)© ZCOOL(站酷),造字者保留署名权 — 许可文本
WenDingPLKaiTi文鼎PL简中楷(AR PL KaitiM GB)Arphic Public License (1999)© 1994–1999 Arphic Technology Co., Ltd. — 许可文本

表中 ✅ 的含义是:只要满足相应条件即可自由再分发(打包 / 内嵌 / 提供服务),核心条件为"许可声明随字体一同分发、不得单独作为商品出售"。其中四款为 OFL 1.1 许可;ZcoolHappy对所有人永久免费、可免费商用,但需遵守下文列出的附加条件。

逐款授权细节

四款 SIL Open Font License 1.1 字体

思源黑体(SourceHanSans)、思源宋体(SourceHanSerif)、霞鹜文楷(LXGWWenKai)、朱雀仿宋(ZhuQueFangSong)四款字体均采用SIL Open Font License 1.1。OFL §2 要求:每一份再分发副本都必须随附版权声明和本许可证全文。这正是font-licenses目录中捆绑 OFL.txt(OFL 1.1 全文)以及四款字体各自的版权行的原因——从该目录的命名与 package.json 将font-licenses列入发布files可以印证,这些许可文本是随包分发的必备合规要件。

站酷快乐体(ZcoolHappy):永久免费商用但有条件

站酷快乐体按站酷(ZCOOL)的声明对所有人永久免费,包括免费商用。附带的 font-licenses/ZcoolHappy-LICENSE.txt 记录了完整授权与署名信息(设计:刘兵克学员及工作室团队 / thosefree;版权归站酷所有,全体造字者保留署名权),并明确使用条件:

  • 可免费商用,永久免费授权所有人使用;
  • 禁止在任何场景下改变站酷免费字体的原有名称(即必须保留"站酷快乐体"名称);
  • 不得将该免费字体作为商品单独转售或牟利
  • 造字者保留署名权(保留本署名)。

FONTS.md 对它的合规结论是:作为免费包的一部分通过 CDN 提供服务,满足上述条件(名称不变、不单独出售、保留署名),因此被批准列入白名单。

文鼎PL简中楷(WenDingPLKaiTi):可验证的 Arphic Public License 1999 再分发

这一款是白名单中合规论证最充分的一个。WenDingPLKaiTi实际上是AR PL KaitiM GB(文鼎 PL 简中楷)的 WOFF2 转换/再分发版本,依据Arphic Public License授权。该许可是 FSF 认可的 copyleft 自由软件许可,明确允许商业使用和逐字再分发——许可原文写道:"You may copy and distribute verbatim copies of this Font in any medium, without restriction, provided that you retain this license file (ARPHICPL.TXT) unaltered in all copies"。并且 Arphic 于2022 年重新确认,1999 年发布的这四款字体仍可免费商用(与 2010 年的非商用许可版本相区分)。

FONTS.md 特别强调"WenDingPLKaiTi ⇄ AR PL KaitiM GB"的对应关系是可证明而非断言的——依据是从 woff2 内嵌的name表(name table)提取的身份信息:

nameID 1/4 Family/Full : AR PL KaitiM GB nameID 0 Copyright : (c) Copyright 1994-1999, Arphic Technology Co., Ltd. nameID 7 Trademark : Arphic is a registered trademark of Arphic Technology Co., Ltd. nameID 8/9 Manufacturer/Designer : Arphic Technology Co., Ltd. nameID 11 Vendor URL : http://www.arphic.com.tw nameID 13 License : ARPHIC PUBLIC LICENSE (full text embedded)

这一验证方法可以复现:在本地对 woff2 文件运行fc-scan,或使用python -m fontTools.ttx -t name <file>导出 name 表即可比对。

修改声明(Arphic PL §2.a):相对于原始AR PL KaitiM GB,唯一改动是 (1) 字体格式从 TrueType 转换为 WOFF2,以及 (2) 对外暴露的font-family名称改为WenDingPLKaiTi未修改任何字形。许可原文逐字捆绑于 font-licenses/ARPHIC-PL.txt,必须保持原样随服务字体一起分发。

被移除的字体:白名单为什么如此克制

白名单之外,FONTS.md 还明确记录了曾经打包过、但因再分发条款不够宽松而被剔除的字体,这体现了"宁可少、不可有风险"的合规策略:

  • 方正(FangZheng)系列(Hei / Kai / ShuSong / FangSong)、MiSans得意黑(DeYiHei)以及若干展示体(display faces)——属于商用许可,未获再分发授权;
  • 阿里巴巴普惠体(AlibabaPuHuiTi)——虽然免费商用,但其许可证未像 OFL 那样授予明确的再分发/重新托管权利,为保证再分发的无歧义性而被剔除。

FONTS.md 还给出了一条明确的维护纪律:任何字体若要恢复列入白名单,必须先补上已清算的许可条目("If any are reinstated, add a cleared license entry above first")。也就是说,授权记录必须先于代码改动存在。

工程实践:如何在应用中使用与自定义这套字体

接入方式(只读消费):

pnpm add @openmaic/renderer # 或 npm install @openmaic/renderer

然后在应用入口导入一次:

import '@openmaic/renderer/fonts.css';

这会让 6 款中文字体以@font-face形式注册,幻灯片中凡font-family命中白名单的文本,都会在首次使用时按需拉取对应 woff2。注意保持@openmaic/renderer所在包的 Tailwind 4 配置包含其产物目录(详见 README.md 的 Tailwind 4 setup 一节)。

自定义/自托管:如果需要脱离file.maic.chat这个默认域名(例如离线内网环境),修改 fonts.config.mjs 中的FONT_CDN_BASE_URL(保持FONT_DIR目录结构不变),然后重新生成:

pnpm run genfonts

该命令由 scripts/generate-fonts-css.mjs 执行,会按FONT_FAMILIES顺序重写fonts.css不要手改fonts.css——它是生成产物,下次构建会被覆盖。

新增字体的完整流程(合规视角):

  1. 确认目标字体的许可允许再分发(OFL、明确授权条款等);
  2. 将许可原文与署名信息放入font-licenses/目录(参照已有的 OFL.txt、ARPHIC-PL.txt、ZcoolHappy-LICENSE.txt);
  3. 在 FONTS.md 白名单表中登记许可、再分发结论与版权/来源信息;
  4. 将字体族名加入fonts.config.mjsFONT_FAMILIES,把 woff2 上传到对象存储fonts/目录;
  5. 执行pnpm run genfonts重新生成fonts.css

build脚本会在每次构建时自动执行字体 CSS 生成,保证发布产物与配置始终一致。

合规要点小结

回顾整份记录,可以提炼出三条可复用的工程原则:

  1. 服务即再分发:只要把字体文件托管在 CDN 上对外提供,就进入再分发范畴,必须逐字核准许可并随附许可文本;
  2. 授权记录与许可证解耦:包的 MIT 许可证不覆盖字体,字体的许可/署名独立记录在FONTS.md并与许可原文一同打包发布(font-licenses/files分发);
  3. 白名单是"可再分发"清单而非"好看"清单:以AlibabaPuHuiTi为例,"可免费商用"不等于"可再分发",只有授权清晰可证的字体才能进入;剔除即删除,恢复必须先补记录。

这套机制让 OpenMAIC 的幻灯片渲染体系在"自带中文字体、保证跨端一致呈现"与"字体版权合规"之间找到了可维护的平衡点,也为其他需要自托管字体的项目提供了一份可直接参考的合规工程范本。

【免费下载链接】OpenMAICOpen Multi-Agent Interactive Classroom — Get an immersive, multi-agent learning experience in just one click项目地址: https://gitcode.com/GitHub_Trending/op/OpenMAIC

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询