Skip to content

字体授权与交付包里的字体账(PE-05) ​

一句话:这套工作台编辑期与导出用的 16 款中文字面全部是 SIL OFL 1.1(思源黑体/宋体 + 站酷系 + 龙藏/马善政/ 柳建毛草/志莽行),OFL 允许商用、允许子集嵌入、允许再分发——所以"还没买商业字库"不等于"不能出稿"。 但客户稿里最常见的偏偏不是这 16 款:系统自带的宋体/苹方/雅黑(Songti SC、PingFang SC、Microsoft YaHei) 随附授权不覆盖商品包装印刷与再分发,方正/汉仪/华文一族更是有名发过索款函的。这一页说清三件事: 账记在哪、谁在查、交付包里怎么说。

三处台账,各管一段(互不代替) ​

位置回答的问题复跑
字体清单 docs/demo/assets/fonts/font-manifest.json仓库里那 16 款是谁、许可文本叫什么、子集多少码位、ttf 指纹node tools/verify-font-license.mjs(16 项;逐款 sha256/字节/许可文本 + 商业字库黑名单 + OFL 改名义务)
真源 design.fonts[](packages/design-json/src/design.ts 的 fontRefSchema)这一版稿子用了哪款字、licenseStatus 到哪一步、能不能嵌入node tools/validate-design.mjs;blocked 且含文字 → schema 直接拒(PE-05 闸门)
交付包 README + manifest.fonts(packages/delivery/src/bundle.mjs)拿到 ZIP 的人(印厂/客户验房)不 parse design.json 也能查出哪款字没授权node tools/verify-delivery-bundle.mjs 的 A13/A14/A15 + B22/B23;node tools/verify-delivery-api.mjs 的 B12

还有一处必须独立:落盘 PDF 里到底嵌了哪个字面,由 workers/export/src/pdf-preflight.ts 用 poppler 的 pdffonts 读回真文件判断(pdf-font-substituted 告警)。清单漂亮、真源写 cleared,都不等于 PDF 里真装了那款字; 反过来 PDF 里嵌了 OFL 替身,也不等于客户能拿真字库量产——两条线各说一半,谁也不许替谁签字。

交付包里的字体账(P4-55) ​

bundleFontSummary(design, faces) 只做投影:从真源 fonts[] 与可见文字层数出来,缺字段一律算"没登记", 不猜、不美化。浏览器工作台与导出 worker 调同一个函数(红线 1,不许有第二套数法)。README 的 【字体与商用授权】区块逐款写:

  • licenseStatus:cleared / pending / blocked / 未登记(真源连状态都没写=未登记,绝不并入 cleared);
  • 用没用上:登记了却没排进本包,与"pending 且被 N 个文字层压着"是两种收法,前者只是提示、后者是红牌;
  • 授权依据:能对上清单的给出许可文本文件名、子集码位、ttf 指纹前缀;对不上的写"清单里没有这一款", 并说明要么补厂商书面授权凭证、要么换 OFL 替身;
  • 命中商用风险名单的单独打 ⚠(名单只有一份:内核的 FONT_LICENSE_POLICY,PE-05 门禁 import 的就是它—— 两份名单早晚一份改了另一份没跟上,那时包里写"没风险"就是假的);
  • 收尾固定一句边界:授权状态是真源登记口径,不是法务结论;本包不含字体文件本体 (OFL 子集可以随 PDF 嵌入,商业字库连嵌入都要授权);量产前逐款补凭证或转曲(PE-05)。

没有可见文字层也必须出一节:写"本包不排一个字"。"这稿没排字"可以开工,"排了字但没人核对授权"必须先停, 两种情况下一步动作完全不同——和 印前检查清单 里 AI 文字那一行的口径是一对。

真夹具(docs/demo/assets/design.json)本身就是反面教材:两款 Songti SC 全 pending,被 3 个文字层压着 (34 字 / 25 个码位 / 其中中日韩 15 个),所以真跑出来的包里必须点名"未确认商用授权不得量产(PE-05)", 门禁把这条钉成断言——台账再干净,包里有 pending 的字排着品名却没人说,客户与印厂仍是事后才知道。

换字与改名义务(OFL 不是免责金牌) ​

  • 16 款字面一律以 APW- 前缀家族名分发(OFL 的 Reserved Font Name 义务:改名分发、许可文本随包、不得单独卖字体);
  • 生产容器只装子集(tools/font-subset-report.py + tools/prepare-production-fonts.py),不装 10 MB 全量;
  • 可变字体必须按 instance 轴实例化——默认实例是 Thin/ExtraLight,当 Regular 用是常见事故;
  • 屏上显示与导出真装载由 docs/demo/font-runtime.mjs 负责:真源声明的系统字库会被换成清单里的 OFL 替身, 这个替换是为了跑通链路,不是"授权已解决"。量产要换回真字体(补凭证)或把该层文字转曲。

说清楚没做的 ​

  • 拿不出商业字库的授权合同:客户要用方正/汉仪,得客户自己出凭证;我们只登记与核对,不代买、不代签;
  • 逐字字形覆盖:清单里记的是码位数(codepoints),不是逐字判定;真缺字靠排版链 onMissingGlyph 当场报(界面缺字提示), 逐字级复核属 PE-03 印前真链(callas 缺位期用 Ghostscript + 自研覆盖大半);
  • 自动判"该转曲还是该补授权":现在只把读数摊在 README 上,红牌仍由人下(PE-05 回填时应升级为导出闸门);
  • 本包不是「印厂可生产」判定(红线 7):字体这一关过了,还有出血、色空间、墨量、打样那一串。

交付前请核对文字、字体、结构与印厂要求,并保留确认版本。