Appearance
字体授权与交付包里的字体账(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):字体这一关过了,还有出血、色空间、墨量、打样那一串。