字体裁剪与精简(ttf/otf)

先来总结

软件ttfotftips
fonttools-pyftsubsetPython pip安装即可 源代码:Github
sfntly-sfnttool.jar-(Shell版本-java)Google开源 源代码:Github
sfntly-sfnttool.jar-FontZip(Gui版本-java)[ttf推荐]GUI版本 源代码:Github
sfntly-sfnttool.jar-FontPruner(未测试)西山居开源的内部工具 更多看这里->关于字体剥离和精简工具 FontSubsetGUI 和 FontPruner 的比较。

请直接参考下面教程使用 fonttools-pyftsubset 就完事了

sfntly-sfnttool.jar shell 若不懂配置环境将会花费你很多的时间。

我就是因为不是很懂Java和ant的配置,打包研究了半小时…丢人行为


fonttools-pyftsubset

因为sfntly- sfnttool不支持,于是我再搜索引擎搜“sfntly otf” 找到个close的issue…发现了

注意

使用过程中我遇到了otf转换会有报错情况(尚未解决)

$ ~ pyftsubset 1.otf --text-file=1.txt --output-file=2.otf

Traceback (most recent call last):
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\Scripts\pyftsubset.exe\__main__.py", line 7, in 
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\misc\loggingTools.py", line 372, in wrapper
    return func(*args, **kwds)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\subset\__init__.py", line 3104, in main
    subsetter.subset(font)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\subset\__init__.py", line 2907, in subset
    self._prune_post_subset(font)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\subset\__init__.py", line 2890, in _prune_post_subset
    retain = table.prune_post_subset(font, self.options)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\subset\cff.py", line 471, in prune_post_subset
    self.remove_unused_subroutines()
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\subset\cff.py", line 620, in remove_unused_subroutines
    subr.subset_subroutines (local_subrs, font.GlobalSubrs)
  File "C:\Users\UserName\AppData\Local\Programs\Python\Python39\lib\site-packages\fontTools\subset\cff.py", line 165, in subset_subroutines
    p[i-1] = subrs._used.index(p[i-1] + subrs._old_bias) - subrs._new_bias
AttributeError: 'list' object has no attribute '_used'

但是使用otf转换后的ttf正常!

使用教程

# 使用环境:Python ( 工具4.x版本需要 Python 3.6+)

pip install fonttools
pyftsubset 1.otf --text-file=1.txt --output-file=2.otf

# 1.otf 要被裁剪精简的字体文件
# --text-file=1.txt裁剪的字体中保留1.txt这个文档中的所有字符
# --output-file= 将裁剪后的字体保存为2.otf

image-20210914010602399

image-20210914010253404


sfntly-sfnttool

OTF转TTF

因为不支持otf,于是我搜了一些方法,比如利用软件转换otf为ttf:

在线转换FontCreator(收费)fontforge(开源)

直接转换会错误,会无法识别

主要是轮廓线制式不一样:ttf 需要设置 TrueType(TTF是二次元曲线 / OTF是三次元曲线-CFF PostScript)

字体转换资料收集:

字体裁剪,精简字体,字体瘦身:FontSubsetGUI,FontCreator,FontPruner

关于字体剥离和精简工具 FontSubsetGUI 和 FontPruner 的比较。

这样转换出来系统就能识别了,但是使用 sfnttool 的工具还是转换失败。

image-20210914011356638

Shell官方版本(不推荐)

自行打包环境:java JDK + ant(JRE的环境变量要为JDK路径,不是JRE(Windows10环境))

参考教程:https://www.cnblogs.com/slysky/p/11209662.html

如果没有编程技术请勿自行打包,可能你会难在配置环境

顺便提一下:

CSDN很多重复类似的文章,然后 jar 附件下载全要积分。开源软件这样搞太恶心了…

GUI版本(推荐使用)

最后找到了Gui版本(已经打包好了)….

源代码和下载:Github

推荐