1|Travis Build Status| |Appveyor Build status| |Coverage Status| |PyPI| |Gitter Chat| 2 3What is this? 4~~~~~~~~~~~~~ 5 6| fontTools is a library for manipulating fonts, written in Python. The 7 project includes the TTX tool, that can convert TrueType and OpenType 8 fonts to and from an XML text format, which is also called TTX. It 9 supports TrueType, OpenType, AFM and to an extent Type 1 and some 10 Mac-specific formats. The project has an `MIT open-source 11 licence <LICENSE>`__. 12| Among other things this means you can use it free of charge. 13 14Installation 15~~~~~~~~~~~~ 16 17FontTools requires `Python <http://www.python.org/download/>`__ 2.7, 3.4 18or later. 19 20**NOTE** After January 1 2019, until no later than June 30 2019, the support 21for *Python 2.7* will be limited to only bug fixes, and no new features will 22be added to the ``py27`` branch. The upcoming FontTools 4.x series will require 23*Python 3.5* or above. You can read more `here <https://python3statement.org>`__ 24and `here <https://github.com/fonttools/fonttools/issues/765>`__ for the 25reasons behind this decision. 26 27The package is listed in the Python Package Index (PyPI), so you can 28install it with `pip <https://pip.pypa.io>`__: 29 30.. code:: sh 31 32 pip install fonttools 33 34If you would like to contribute to its development, you can clone the 35repository from GitHub, install the package in 'editable' mode and 36modify the source code in place. We recommend creating a virtual 37environment, using `virtualenv <https://virtualenv.pypa.io>`__ or 38Python 3 `venv <https://docs.python.org/3/library/venv.html>`__ module. 39 40.. code:: sh 41 42 # download the source code to 'fonttools' folder 43 git clone https://github.com/fonttools/fonttools.git 44 cd fonttools 45 46 # create new virtual environment called e.g. 'fonttools-venv', or anything you like 47 python -m virtualenv fonttools-venv 48 49 # source the `activate` shell script to enter the environment (Un*x); to exit, just type `deactivate` 50 . fonttools-venv/bin/activate 51 52 # to activate the virtual environment in Windows `cmd.exe`, do 53 fonttools-venv\Scripts\activate.bat 54 55 # install in 'editable' mode 56 pip install -e . 57 58TTX – From OpenType and TrueType to XML and Back 59~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 60 61Once installed you can use the ``ttx`` command to convert binary font 62files (``.otf``, ``.ttf``, etc) to the TTX XML format, edit them, and 63convert them back to binary format. TTX files have a .ttx file 64extension. 65 66.. code:: sh 67 68 ttx /path/to/font.otf 69 ttx /path/to/font.ttx 70 71The TTX application can be used in two ways, depending on what 72platform you run it on: 73 74- As a command line tool (Windows/DOS, Unix, macOS) 75- By dropping files onto the application (Windows, macOS) 76 77TTX detects what kind of files it is fed: it will output a ``.ttx`` file 78when it sees a ``.ttf`` or ``.otf``, and it will compile a ``.ttf`` or 79``.otf`` when the input file is a ``.ttx`` file. By default, the output 80file is created in the same folder as the input file, and will have the 81same name as the input file but with a different extension. TTX will 82*never* overwrite existing files, but if necessary will append a unique 83number to the output filename (before the extension) such as 84``Arial#1.ttf`` 85 86When using TTX from the command line there are a bunch of extra options. 87These are explained in the help text, as displayed when typing 88``ttx -h`` at the command prompt. These additional options include: 89 90- specifying the folder where the output files are created 91- specifying which tables to dump or which tables to exclude 92- merging partial ``.ttx`` files with existing ``.ttf`` or ``.otf`` 93 files 94- listing brief table info instead of dumping to ``.ttx`` 95- splitting tables to separate ``.ttx`` files 96- disabling TrueType instruction disassembly 97 98The TTX file format 99------------------- 100 101The following tables are currently supported: 102 103.. begin table list 104.. code:: 105 106 BASE, CBDT, CBLC, CFF, CFF2, COLR, CPAL, DSIG, EBDT, EBLC, FFTM, 107 Feat, GDEF, GMAP, GPKG, GPOS, GSUB, Glat, Gloc, HVAR, JSTF, LTSH, 108 MATH, META, MVAR, OS/2, SING, STAT, SVG, Silf, Sill, TSI0, TSI1, 109 TSI2, TSI3, TSI5, TSIB, TSID, TSIJ, TSIP, TSIS, TSIV, TTFA, VDMX, 110 VORG, VVAR, ankr, avar, bsln, cidg, cmap, cvar, cvt, feat, fpgm, 111 fvar, gasp, gcid, glyf, gvar, hdmx, head, hhea, hmtx, kern, lcar, 112 loca, ltag, maxp, meta, mort, morx, name, opbd, post, prep, prop, 113 sbix, trak, vhea and vmtx 114.. end table list 115 116Other tables are dumped as hexadecimal data. 117 118TrueType fonts use glyph indices (GlyphIDs) to refer to glyphs in most 119places. While this is fine in binary form, it is really hard to work 120with for humans. Therefore we use names instead. 121 122The glyph names are either extracted from the ``CFF`` table or the 123``post`` table, or are derived from a Unicode ``cmap`` table. In the 124latter case the Adobe Glyph List is used to calculate names based on 125Unicode values. If all of these methods fail, names are invented based 126on GlyphID (eg ``glyph00142``) 127 128It is possible that different glyphs use the same name. If this happens, 129we force the names to be unique by appending ``#n`` to the name (``n`` 130being an integer number.) The original names are being kept, so this has 131no influence on a "round tripped" font. 132 133Because the order in which glyphs are stored inside the binary font is 134important, we maintain an ordered list of glyph names in the font. 135 136Other Tools 137~~~~~~~~~~~ 138 139Commands for merging and subsetting fonts are also available: 140 141.. code:: sh 142 143 pyftmerge 144 pyftsubset 145 146fontTools Python Module 147~~~~~~~~~~~~~~~~~~~~~~~ 148 149The fontTools Python module provides a convenient way to 150programmatically edit font files. 151 152.. code:: py 153 154 >>> from fontTools.ttLib import TTFont 155 >>> font = TTFont('/path/to/font.ttf') 156 >>> font 157 <fontTools.ttLib.TTFont object at 0x10c34ed50> 158 >>> 159 160A selection of sample Python programs is in the 161`Snippets <https://github.com/fonttools/fonttools/blob/master/Snippets/>`__ 162directory. 163 164Optional Requirements 165--------------------- 166 167The ``fontTools`` package currently has no (required) external dependencies 168besides the modules included in the Python Standard Library. 169However, a few extra dependencies are required by some of its modules, which 170are needed to unlock optional features. 171The ``fonttools`` PyPI distribution also supports so-called "extras", i.e. a 172set of keywords that describe a group of additional dependencies, which can be 173used when installing via pip, or when specifying a requirement. 174For example: 175 176.. code:: sh 177 178 pip install fonttools[ufo,lxml,woff,unicode] 179 180This command will install fonttools, as well as the optional dependencies that 181are required to unlock the extra features named "ufo", etc. 182 183- ``Lib/fontTools/misc/etree.py`` 184 185 The module exports a ElementTree-like API for reading/writing XML files, and 186 allows to use as the backend either the built-in ``xml.etree`` module or 187 `lxml <https://http://lxml.de>`__. The latter is preferred whenever present, 188 as it is generally faster and more secure. 189 190 *Extra:* ``lxml`` 191 192- ``Lib/fontTools/ufoLib`` 193 194 Package for reading and writing UFO source files; it requires: 195 196 * `fs <https://pypi.org/pypi/fs>`__: (aka ``pyfilesystem2``) filesystem 197 abstraction layer. 198 199 * `enum34 <https://pypi.org/pypi/enum34>`__: backport for the built-in ``enum`` 200 module (only required on Python < 3.4). 201 202 *Extra:* ``ufo`` 203 204- ``Lib/fontTools/ttLib/woff2.py`` 205 206 Module to compress/decompress WOFF 2.0 web fonts; it requires: 207 208 * `brotli <https://pypi.python.org/pypi/Brotli>`__: Python bindings of 209 the Brotli compression library. 210 211 *Extra:* ``woff`` 212 213- ``Lib/fontTools/ttLib/sfnt.py`` 214 215 To better compress WOFF 1.0 web fonts, the following module can be used 216 instead of the built-in ``zlib`` library: 217 218 * `zopfli <https://pypi.python.org/pypi/zopfli>`__: Python bindings of 219 the Zopfli compression library. 220 221 *Extra:* ``woff`` 222 223- ``Lib/fontTools/unicode.py`` 224 225 To display the Unicode character names when dumping the ``cmap`` table 226 with ``ttx`` we use the ``unicodedata`` module in the Standard Library. 227 The version included in there varies between different Python versions. 228 To use the latest available data, you can install: 229 230 * `unicodedata2 <https://pypi.python.org/pypi/unicodedata2>`__: 231 ``unicodedata`` backport for Python 2.7 and 3.5 updated to the latest 232 Unicode version 9.0. Note this is not necessary if you use Python 3.6 233 as the latter already comes with an up-to-date ``unicodedata``. 234 235 *Extra:* ``unicode`` 236 237- ``Lib/fontTools/varLib/interpolatable.py`` 238 239 Module for finding wrong contour/component order between different masters. 240 It requires one of the following packages in order to solve the so-called 241 "minimum weight perfect matching problem in bipartite graphs", or 242 the Assignment problem: 243 244 * `scipy <https://pypi.python.org/pypi/scipy>`__: the Scientific Library 245 for Python, which internally uses `NumPy <https://pypi.python.org/pypi/numpy>`__ 246 arrays and hence is very fast; 247 * `munkres <https://pypi.python.org/pypi/munkres>`__: a pure-Python 248 module that implements the Hungarian or Kuhn-Munkres algorithm. 249 250 *Extra:* ``interpolatable`` 251 252- ``Lib/fontTools/varLib/plot.py`` 253 254 Module for visualizing DesignSpaceDocument and resulting VariationModel. 255 256 * `matplotlib <https://pypi.org/pypi/matplotlib>`__: 2D plotting library. 257 258 *Extra:* ``plot`` 259 260- ``Lib/fontTools/misc/symfont.py`` 261 262 Advanced module for symbolic font statistics analysis; it requires: 263 264 * `sympy <https://pypi.python.org/pypi/sympy>`__: the Python library for 265 symbolic mathematics. 266 267 *Extra:* ``symfont`` 268 269- ``Lib/fontTools/t1Lib.py`` 270 271 To get the file creator and type of Macintosh PostScript Type 1 fonts 272 on Python 3 you need to install the following module, as the old ``MacOS`` 273 module is no longer included in Mac Python: 274 275 * `xattr <https://pypi.python.org/pypi/xattr>`__: Python wrapper for 276 extended filesystem attributes (macOS platform only). 277 278 *Extra:* ``type1`` 279 280- ``Lib/fontTools/pens/cocoaPen.py`` 281 282 Pen for drawing glyphs with Cocoa ``NSBezierPath``, requires: 283 284 * `PyObjC <https://pypi.python.org/pypi/pyobjc>`__: the bridge between 285 Python and the Objective-C runtime (macOS platform only). 286 287- ``Lib/fontTools/pens/qtPen.py`` 288 289 Pen for drawing glyphs with Qt's ``QPainterPath``, requires: 290 291 * `PyQt5 <https://pypi.python.org/pypi/PyQt5>`__: Python bindings for 292 the Qt cross platform UI and application toolkit. 293 294- ``Lib/fontTools/pens/reportLabPen.py`` 295 296 Pen to drawing glyphs as PNG images, requires: 297 298 * `reportlab <https://pypi.python.org/pypi/reportlab>`__: Python toolkit 299 for generating PDFs and graphics. 300 301Testing 302~~~~~~~ 303 304To run the test suite, you need to install `pytest <http://docs.pytest.org/en/latest/>`__. 305When you run the ``pytest`` command, the tests will run against the 306installed ``fontTools`` package, or the first one found in the 307``PYTHONPATH``. 308 309You can also use `tox <https://tox.readthedocs.io/en/latest/>`__ to 310automatically run tests on different Python versions in isolated virtual 311environments. 312 313.. code:: sh 314 315 pip install tox 316 tox 317 318Note that when you run ``tox`` without arguments, the tests are executed 319for all the environments listed in tox.ini's ``envlist``. In our case, 320this includes Python 2.7 and 3.7, so for this to work the ``python2.7`` 321and ``python3.7`` executables must be available in your ``PATH``. 322 323You can specify an alternative environment list via the ``-e`` option, 324or the ``TOXENV`` environment variable: 325 326.. code:: sh 327 328 tox -e py27 329 TOXENV="py36-cov,htmlcov" tox 330 331Development Community 332~~~~~~~~~~~~~~~~~~~~~ 333 334TTX/FontTools development is ongoing in an active community of 335developers, that includes professional developers employed at major 336software corporations and type foundries as well as hobbyists. 337 338Feature requests and bug reports are always welcome at 339https://github.com/fonttools/fonttools/issues/ 340 341The best place for discussions about TTX from an end-user perspective as 342well as TTX/FontTools development is the 343https://groups.google.com/d/forum/fonttools mailing list. There is also 344a development https://groups.google.com/d/forum/fonttools-dev mailing 345list for continuous integration notifications. You can also email Behdad 346privately at behdad@behdad.org 347 348History 349~~~~~~~ 350 351The fontTools project was started by Just van Rossum in 1999, and was 352maintained as an open source project at 353http://sourceforge.net/projects/fonttools/. In 2008, Paul Wise (pabs3) 354began helping Just with stability maintenance. In 2013 Behdad Esfahbod 355began a friendly fork, thoroughly reviewing the codebase and making 356changes at https://github.com/behdad/fonttools to add new features and 357support for new font formats. 358 359Acknowledgements 360~~~~~~~~~~~~~~~~ 361 362In alphabetical order: 363 364Olivier Berten, Samyak Bhuta, Erik van Blokland, Petr van Blokland, 365Jelle Bosma, Sascha Brawer, Tom Byrer, Frédéric Coiffier, Vincent 366Connare, Dave Crossland, Simon Daniels, Behdad Esfahbod, Behnam 367Esfahbod, Hannes Famira, Sam Fishman, Matt Fontaine, Yannis Haralambous, 368Greg Hitchcock, Jeremie Hornus, Khaled Hosny, John Hudson, Denis Moyogo 369Jacquerye, Jack Jansen, Tom Kacvinsky, Jens Kutilek, Antoine Leca, 370Werner Lemberg, Tal Leming, Peter Lofting, Cosimo Lupo, Masaya Nakamura, 371Dave Opstad, Laurence Penney, Roozbeh Pournader, Garret Rieger, Read 372Roberts, Guido van Rossum, Just van Rossum, Andreas Seidel, Georg 373Seifert, Miguel Sousa, Adam Twardoch, Adrien Tétar, Vitaly Volkov, Paul 374Wise. 375 376Copyrights 377~~~~~~~~~~ 378 379| Copyright (c) 1999-2004 Just van Rossum, LettError 380 (just@letterror.com) 381| See `LICENSE <LICENSE>`__ for the full license. 382 383Copyright (c) 2000 BeOpen.com. All Rights Reserved. 384 385Copyright (c) 1995-2001 Corporation for National Research Initiatives. 386All Rights Reserved. 387 388Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All 389Rights Reserved. 390 391Have fun! 392 393.. |Travis Build Status| image:: https://travis-ci.org/fonttools/fonttools.svg 394 :target: https://travis-ci.org/fonttools/fonttools 395.. |Appveyor Build status| image:: https://ci.appveyor.com/api/projects/status/0f7fmee9as744sl7/branch/master?svg=true 396 :target: https://ci.appveyor.com/project/fonttools/fonttools/branch/master 397.. |Coverage Status| image:: https://codecov.io/gh/fonttools/fonttools/branch/master/graph/badge.svg 398 :target: https://codecov.io/gh/fonttools/fonttools 399.. |PyPI| image:: https://img.shields.io/pypi/v/fonttools.svg 400 :target: https://pypi.org/project/FontTools 401.. |Gitter Chat| image:: https://badges.gitter.im/fonttools-dev/Lobby.svg 402 :alt: Join the chat at https://gitter.im/fonttools-dev/Lobby 403 :target: https://gitter.im/fonttools-dev/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge 404