如何不花钱使用 Adobe Fonts 中的字体(以Forma DJR为例)

朋友推荐游戏中的英文使用等线字体 Forma DJR,搜索了之后发现官网花里胡哨完全看不懂(英语差,懒),而Adobe Fonts里能够免费授权Creativ Cloud用户非商业使用,不巧的是我也买不起正版adobe软件,于是在网上疯狂搜索如何白嫖使用,以下是逐步破解使用过程。

需要使用的字体:Forma DJR Deck | Adobe Fonts

搜索到的教程:   如何试用 Adobe Fonts - 点击领取 (dianjilingqu.com)——本贴基于此文章撰写

        如何更改字体文件的信息? - 知乎 (zhihu.com)

        Python连接MySQL数据库(pip.exe闪退)-CSDN博客

        【pip升级】使用pip安装时出现要You are using pip version 22.0.4; however, version 23.0.1 is available报错的解决方法_Kan SY的博客-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代码的不同之处是:

  1. A代码的sfntVersion属性值为"\x00\x01\x00\x00",而B代码的sfntVersion属性值为"1.0"。B代码使用了标准的字符串形式表示版本号,而A代码使用了十六进制表示。

  2. A代码的namerecord nameID="0"的值是一个版权声明,而B代码的namerecord nameID="0"则为空,没有任何值。

  3. B代码新增了一些namerecord nameID的值,包括1、3、4、5、6、16和17。这些值描述了字体的名称、版本、唯一标识符等信息。

  4. 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 才能使用,所以通过该文章方法下载的字体仅供个人试用,不能用作其它用途(尤其是商用)!

 

posted @ 2023-04-10 20:37  元囮  阅读(1304)  评论(0编辑  收藏  举报