如何不花钱使用 Adobe Fonts 中的字体(以Forma DJR为例)
朋友推荐游戏中的英文使用等线字体 Forma DJR,搜索了之后发现官网花里胡哨完全看不懂(英语差,懒),而Adobe Fonts里能够免费授权Creativ Cloud用户非商业使用,不巧的是我也买不起正版adobe软件,于是在网上疯狂搜索如何白嫖使用,以下是逐步破解使用过程。
需要使用的字体:Forma DJR Deck | Adobe Fonts
搜索到的教程: 如何试用 Adobe Fonts - 点击领取 (dianjilingqu.com)——本贴基于此文章撰写
Python连接MySQL数据库(pip.exe闪退)-CSDN博客
python之pip换源 - _yessir - 博客园 (cnblogs.com)
用到的网址/项目:TypeRip (badnoise.net) ——用以搜索下载字体文件
GitHub - CodeZombie/TypeRip: Adobe Fonts (formerly TypeKit) font ripper ——上一条的项目仓库
GitHub - adobe-type-tools/afdko: Adobe Font Development Kit for OpenType ——修改字体信息必要库
关于Python中使用pip安装库是出现的一个问题-python黑洞网 (pythonheidong.com)
python3.7及以上版本
一、下载字体&准备工作
首先我们需要下载所需的字体,在TypeRip (badnoise.net) 上方搜索框输入字体的网址,即可下载。
“注意一定要先选中“Download without processing”,否则下载下来的文件会丢失字体特性。然后选择需要的字体下载或是直接“Download All”即可。”
由于我们是非正规手段得到的字体,adobe fonts里的字体信息不全,无法直接安装,需要用到Adobe Font Development Kit for OpenType (AFDKO) 中获取命令行工具 ttx 用以修改字体信息(方法来自知乎@梁海的回答)
下载ADFDKO后执行安装,电脑上需要Python3.7 及以上的版本,并且确保python环境配置完成,pip版本正确,第三方库下载支持是否正常以及pip是否可以运行。笔者接连遇到了以上问题,更新了版本,换源镜像站进行第三方库下载。最后pip仍然无法运行则是通过进入PYthon的安装目录的scripts子目录直接运行以下命令
pip3 install --user afdko
若出现警告提示需要把安装路径放进 PATH
中。
即:除了python安装时必要配置的环境变量,还有保存第三方库的文件夹的安装路径也需要放入PATH中
这里我将 C:\Users\用户名\AppData\Roaming\Python\Python39\Scripts
以及 C:\Users\用户名\AppData\Roaming\Python\Python39\site-packages
两个路径同时放进了PATH中解决了问题
接下来继续运行命令
ttx -h
出现帮助信息表明安装成功
二、修改字体name表
管理员模式运行cmd并前往字体所在文件夹下,按照原帖运行以下命令
ttx -t name [要处理的字体文件]
但此时大概率会因为字体文件名带有空格导致无法正确定位文件,这样的情况下我们需要使用英文引号将文件名完全包含,即
ttx -t name "要处理的字体文件"
于是我们得到一个[字体文件文件名].ttx
的文件,此为字体的 name
表。(此处以Forma DJR Deck Regular.ttf为例)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="4.38"> 3 4 <name> 5 <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True"> 6 (c) Copyright David Jonathan Ross, 2016. All rights reserved. 7 </namerecord> 8 <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True"> 9 10 </namerecord> 11 <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True"> 12 Regular 13 </namerecord> 14 <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True"> 15 46db122a16c3f693d30de61db0304ef3 16 </namerecord> 17 <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True"> 18 - 19 </namerecord> 20 <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True"> 21 Version 1.000;PS 1.0;hotconv 1.0.72;makeotf.lib2.5.5900; ttfautohint (v0.97) -l 8 -r 50 -G 200 -x 14 -f dflt -w G 22 </namerecord> 23 <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True"> 24 - 25 </namerecord> 26 <namerecord nameID="14" platformID="1" platEncID="0" langID="0x0" unicode="True"> 27 http://typekit.com/eulas/00000000000000003b9ae4cd 28 </namerecord> 29 <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409"> 30 (c) Copyright David Jonathan Ross, 2016. All rights reserved. 31 </namerecord> 32 <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> 33 34 </namerecord> 35 <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> 36 Regular 37 </namerecord> 38 <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409"> 39 46db122a16c3f693d30de61db0304ef3 40 </namerecord> 41 <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> 42 - 43 </namerecord> 44 <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409"> 45 Version 1.000;PS 1.0;hotconv 1.0.72;makeotf.lib2.5.5900; ttfautohint (v0.97) -l 8 -r 50 -G 200 -x 14 -f dflt -w G 46 </namerecord> 47 <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409"> 48 - 49 </namerecord> 50 <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409"> 51 http://typekit.com/eulas/00000000000000003b9ae4cd 52 </namerecord> 53 </name> 54 55 </ttFont>
可以看出我们下载的字体文件有部分加密如:
sfntVersion="\x00\x01\x00\x00
以及信息丢失,参考原文章对 Minion 3 Bold Italic.ttf name表的修改,我将代码补充为
1 <?xml version="1.0" encoding="UTF-8"?> 2 <ttFont sfntVersion="1.0" ttLibVersion="4.38"> 3 4 <name> 5 <namerecord nameID="0" platformID="1" platEncID="0" langID="0x0" unicode="True"> 6 7 </namerecord> 8 <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True"> 9 Forma DJR Deck 10 </namerecord> 11 <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True"> 12 Regular 13 </namerecord> 14 <namerecord nameID="3" platformID="1" platEncID="0" langID="0x0" unicode="True"> 15 :Forma DJR Deck Regular 16 </namerecord> 17 <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True"> 18 Forma DJR Deck Regular 19 </namerecord> 20 <namerecord nameID="5" platformID="1" platEncID="0" langID="0x0" unicode="True"> 21 Version 0.1 22 </namerecord> 23 <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True"> 24 FormaDJRDeckRegular 25 </namerecord> 26 <namerecord nameID="7" platformID="1" platEncID="0" langID="0x0" unicode="True"> 27 28 </namerecord> 29 <namerecord nameID="8" platformID="1" platEncID="0" langID="0x0" unicode="True"> 30 31 </namerecord> 32 <namerecord nameID="9" platformID="1" platEncID="0" langID="0x0" unicode="True"> 33 34 </namerecord> 35 <namerecord nameID="10" platformID="1" platEncID="0" langID="0x0" unicode="True"> 36 37 </namerecord> 38 <namerecord nameID="11" platformID="1" platEncID="0" langID="0x0" unicode="True"> 39 40 </namerecord> 41 <namerecord nameID="12" platformID="1" platEncID="0" langID="0x0" unicode="True"> 42 43 </namerecord> 44 <namerecord nameID="13" platformID="1" platEncID="0" langID="0x0" unicode="True"> 45 46 </namerecord> 47 <namerecord nameID="14" platformID="1" platEncID="0" langID="0x0" unicode="True"> 48 49 </namerecord> 50 <namerecord nameID="16" platformID="1" platEncID="0" langID="0x0" unicode="True"> 51 Forma DJR Deck 52 </namerecord> 53 <namerecord nameID="17" platformID="1" platEncID="0" langID="0x0" unicode="True"> 54 Regular 55 </namerecord> 56 <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409"> 57 58 </namerecord> 59 <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> 60 Forma DJR Deck 61 </namerecord> 62 <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> 63 Regular 64 </namerecord> 65 <namerecord nameID="3" platformID="3" platEncID="1" langID="0x409"> 66 :Forma DJR Deck Regular 67 </namerecord> 68 <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> 69 Forma DJR Deck Regular 70 </namerecord> 71 <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409"> 72 Version 0.1 73 </namerecord> 74 <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409"> 75 FormaDJRDeckRegular 76 </namerecord> 77 <namerecord nameID="7" platformID="3" platEncID="1" langID="0x409"> 78 79 </namerecord> 80 <namerecord nameID="8" platformID="3" platEncID="1" langID="0x409"> 81 82 </namerecord> 83 <namerecord nameID="9" platformID="3" platEncID="1" langID="0x409"> 84 85 </namerecord> 86 <namerecord nameID="10" platformID="3" platEncID="1" langID="0x409"> 87 88 </namerecord> 89 <namerecord nameID="11" platformID="3" platEncID="1" langID="0x409"> 90 91 </namerecord> 92 <namerecord nameID="12" platformID="3" platEncID="1" langID="0x409"> 93 94 </namerecord> 95 <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409"> 96 97 </namerecord> 98 <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409"> 99 100 </namerecord> 101 <namerecord nameID="16" platformID="3" platEncID="1" langID="0x409"> 102 Forma DJR Deck 103 </namerecord> 104 <namerecord nameID="17" platformID="3" platEncID="1" langID="0x409"> 105 Regular 106 </namerecord> 107 </name> 108 </ttFont>
GPT对两段代码的解析,合理运用工具能为工作提供便利
在这两个XML代码中,A代码和B代码的不同之处是:
A代码的sfntVersion属性值为"\x00\x01\x00\x00",而B代码的sfntVersion属性值为"1.0"。B代码使用了标准的字符串形式表示版本号,而A代码使用了十六进制表示。
A代码的namerecord nameID="0"的值是一个版权声明,而B代码的namerecord nameID="0"则为空,没有任何值。
B代码新增了一些namerecord nameID的值,包括1、3、4、5、6、16和17。这些值描述了字体的名称、版本、唯一标识符等信息。
B代码将一些namerecord nameID的值与A代码进行了修改,如2、3、4、6、以及16和17。修改的地方有:字体名称、唯一标识符、样式等。
在总体结构上,这两个XML代码非常相似,但在细节方面有所不同。B代码相对于A代码进行了许多修改,主要是为了更好地定义字体的名称、版本号和样式。
接下来我们将修改后的 ttx
文件编译进字体文件内,同样管理员模式运行cmd并在字体所在文件夹下执行以下命令
ttx -m "要处理的字体文件" "ttx文件"
文件夹中会生成一个新的 [字体名].ttf 文件,此时Windows便能正常打开执行安装了。
3. 修改字体 OS/2 表
按照之前的步骤得到的输出文件已可以正常安装使用,但在 InDesign 等软件嵌入字体时会出现错误,原因是字体带有嵌入许可限制。要解除该限制,需要修改字体
OS/2
表中的fsType
值(可以参考微软的文档)。运行命令
ttx -t OS/2 [之前输出的字体文件]
可以得到另一个
ttx
文件,这就是字体的OS/2
表。找到该文档中的fsType
值,将该值改为"00000000 00000000"
然后保存。运行命令ttx -m [之前输出的字体文件] [刚刚修改的ttx文件]
即可得到最终的字体文件。在 Windows 下安装该文件,然后可以在 控制面板\外观和个性化\字体 中查看字体嵌入性,若为“可安装”,则修改成功。
4. 后记
网上有很多教程推荐使用字体编辑器(比如 High-Logic FontCreator)导入字体,编辑信息后再导出。这样做看似方便,实际上会重新生成整个字体文件,有可能会导致字体出现问题。使用
ttx
是更加安全的方案。
警告:Adobe Fonts 只有订阅了 Creative Cloud 才能使用,所以通过该文章方法下载的字体仅供个人试用,不能用作其它用途(尤其是商用)!