Max 最近在協助其他的好心人開發免費的字型,順便學一下關於字型的相關技術。
FontTools 是一套以 ttx 為核心的工具集,用於處理與字體編輯有關的各種問題,程序用 Python 編寫完成,代碼開源,具有良好的跨平台性。
FontForeg正式版和開發中的版本下載:
https://fontforge.org/en-US/downloads/
官網網站:
https://github.com/fonttools/fonttools
FontTools 由以下 4 個程序組成:
- ttx 可將字體文件與 xml 文件進行雙向轉換
- pyftmerge 可將數個字體文件合併成為一個字體文件
- pyftsubset 可產生一個由字體的指定字符組成的子集
- pyftinspect 可顯示字體文件的二進制組成信息
安裝 FontTools
詳細介紹:
https://pypi.org/project/fonttools/
指令:
pip install fonttools
字體基本知識
一個字體由數個表(table)構成,字體的信息儲存在表中。一個最基本的字體文件一定會包含以下的表:
- cmap: Character to glyph mapping
- head: Font header
- hhea: Horizontal header
- hmtx: Horizontal metrics
- maxp: Maximum profile
- name: Naming table
- OS/2: OS/2 and Windows specific metrics
- post: PostScript information:
以上都不知道,也沒差,有個印象就好了。
使用 TrueType 曲線繪制的字體會包含如下的表:
- cvt: Control Value Table
- fpgm: Font program
- glyf: Glyph data
- loca: Index to location
- prep: CVT Program
- gasp: Grid-fitting/Scan-conversion (optional table)
以上都不知道,也沒差,有個印象就好了。
使用 PostScript 曲線繪制的字體會包含如下的表:
- CFF: PostScript font program (compact font format)
- VORG: Vertical Origin (optional table)
使用 SVG 曲線繪制的字體會包含如下的表:
- SVG: The SVG (Scalable Vector Graphics) table
使用 Bitmap 圖形構成的字體會包含如下的表:
- EBDT: Embedded bitmap data
- EBLC: Embedded bitmap location data
- EBSC: Embedded bitmap scaling data
- CBDT: Color bitmap data
- CBLC: Color bitmap location data
包含高級書法特性的字體會包含如下的表:
- BASE: Baseline data
- GDEF: Glyph definition data
- GPOS: Glyph positioning data
- GSUB: Glyph substitution data
- JSTF: Justification data
- MATH: Math layout data
包含其他特性的字體會包含如下的表:
- DSIG: Digital signature
- hdmx: Horizontal device metrics
- kern: Kerning
- LTSH: Linear threshold data
- PCLT: PCL 5 data
- VDMX: Vertical device metrics
- vhea: Vertical Metrics header
- vmtx: Vertical Metrics
- COLR: Color table
- CPAL: Color palette table
對字體的修改基本上是圍繞著最上方的基本表進行的,如果要修改字符形態等才需要用到之後的表。
以上都不知道,也沒差,有個印象就好了。
ttx 指令使用說明
ttx 是 FontTools 的核心工具,用於將字體轉換為 xml 文件,或者將 xml 文件轉換回字體。ttx 所產生的 xml 文件的後綴名是 ttx,可以用各種文檔編輯器打開進行編輯。
將字體全部的表轉換為 ttx 文件:
$ ttx font.ttf
將 ttx 文件轉換回字體文件。
$ ttx font.ttx
pyftmerge 使用說明
合併字體:
$ pyftmerge font1.otf font2.otf
實測結果:
合併失敗
➜ ttf pyftmerge temp.ttf temp2.ttf WARNING: Dropped cmap subtable from font [0]: format 0, platformID 1, platEncID 0 WARNING: Dropped cmap subtable from font [1]: format 0, platformID 1, platEncID 0 Traceback (most recent call last): File "/usr/local/bin/pyftmerge", line 8, in <module> sys.exit(main()) File "/usr/local/lib/python2.7/site-packages/fontTools/misc/loggingTools.py", line 375, in wrapper return func(*args, **kwds) File "/usr/local/lib/python2.7/site-packages/fontTools/merge.py", line 1157, in main font = merger.merge(args) File "/usr/local/lib/python2.7/site-packages/fontTools/merge.py", line 997, in merge table = clazz(tag).merge(self, tables) File "/usr/local/lib/python2.7/site-packages/fontTools/merge.py", line 160, in merge return m.mergeObjects(self, self.mergeMap, tables) File "/usr/local/lib/python2.7/site-packages/fontTools/merge.py", line 1043, in mergeObjects value = mergeLogic(getattr(table, key, NotImplemented) for table in tables) File "/usr/local/lib/python2.7/site-packages/fontTools/merge.py", line 49, in equal assert all(item == first for item in t), "Expected all items to be equal: %s" % lst AssertionError: Expected all items to be equal: [1024, 1000]
pyftsubset 使用說明
pyftsubset 可提取一個字體的部分字符,產生一個只由它們組成的新字體。通過這一子集化技術,可有效縮小字體文件的體積,便於網絡傳輸。
用法:
$ pyftsubset font.otf --text="漢字"
- –text 選項用於指定需要保留的字符
- –text-file 選項用於指定一個包含需要保留的字符的 txt 文檔
- –output-file 選項用於指定輸出文件的保存位置