OTF to TTF

This is the one conversion on this site that redraws glyphs rather than repacking a file. An .otf normally holds a "CFF " table whose outlines are cubic Bézier curves; a .ttf holds a "glyf" table whose outlines are quadratic. Those are different mathematics, so a genuine conversion has to refit every curve — which is exactly what happens here, locally, with the fit tolerance stated rather than glossed over. What this page will never do is rename CFF bytes to .ttf and call it converted.

Drop OpenType/CFF (.otf) files or folders here, or choose them.

Everything runs in this tab. Detecting device capabilities…

Files are read and processed in this browser tab. Nothing is uploaded — the page’s Content-Security-Policy blocks connections to any other origin.

How the outlines are refitted

Each cubic segment is subdivided until the provable maximum deviation from the original curve falls below 0.001 em — one font unit on a typical 1000-unit em, which is a twentieth of a pixel at 50px. Where a curve cannot be fitted within that bound even at full subdivision depth, the conversion says so in the result rather than accepting it silently.

The glyph outlines are then rounded onto the integer grid TrueType requires, which moves any point by at most half a font unit. "glyf" and "loca" are written from scratch, "maxp" is upgraded from CFF's version 0.5 to the version 1.0 a TrueType rasteriser needs, and left side bearings are recomputed because a side bearing describes where the redrawn glyph actually starts.

The outlines themselves are decoded by HarfBuzz, compiled to WebAssembly and served from this origin. Interpreting Type 2 charstrings correctly — subroutine bias, hint masks, the flex operators, CID fonts — is a well-known source of subtly wrong glyphs, and HarfBuzz is the most heavily exercised implementation of it in existence.

What this costs you, stated plainly

CFF hinting is discarded. It has no TrueType equivalent, and the output is unhinted. On modern rendering stacks that is invisible; at very small sizes on older Windows configurations it is not. If your font is being used at 9px on a legacy system, keep the original.

The refitting is an approximation, not an identity. It is bounded and stated above, and it is far below the threshold of visibility at any normal size — but "lossless" would be a lie, so this page does not use the word.

Everything else is copied, not regenerated: the character map, every name record including the copyright and licence strings, the OS/2 embedding permission bits, and all the OpenType layout tables that drive ligatures and kerning.

Do you actually need this?

Often not. If the goal is a web font, OpenType/CFF compresses to WOFF2 and loads in every browser — no outline conversion is involved and nothing is lost. If a tool has told you it needs "an OTF" or "a TTF", it usually just means "a font".

The honest reasons to convert are a toolchain that genuinely rejects CFF outlines, an embedded or game engine that only parses "glyf", or a pipeline that needs TrueType outlines to apply its own hinting.

What survives this conversion

Every row below is checked automatically against your own file after conversion. If any check fails the output is discarded rather than offered for download.

Conversion compatibility for OTF to TTF
PropertyOutcome
Glyph outlines partialGenuinely redrawn from cubic to quadratic curves, fitted to within 0.001 em of the originals. Not byte-identical, and not claimed to be.
Glyph count and order keptIdentical. Every glyph id keeps its meaning, and the count is verified after conversion.
Character map (cmap) keptCopied unchanged. Every code point still resolves to the same glyph id, checked against the input.
Family, version, copyright and licence strings keptCopied byte for byte and re-checked against the input.
OS/2 embedding permissions (fsType) keptCopied. Glyph Batch never clears a vendor restriction bit.
OpenType layout (GSUB, GPOS, GDEF, kern) keptCopied unchanged, so ligatures, alternates and kerning behave identically.
Advance widths keptIdentical. Side bearings are recomputed from the new outlines, which is required rather than optional.
CFF hinting lostDiscarded. There is no TrueType equivalent, so the output is unhinted.
Variable fonts lostRefused, not flattened. A "glyf" table cannot carry CFF2 variations, so converting would silently freeze the font to one instance.
DSIG digital signature lostRemoved. It signs the original outlines, which no longer exist in this file.

When it does not work

The result came back as a .otf even though this page says TTF.

Why: The font was variable, or it was already a TrueType font wearing an .otf name. Both are refused rather than converted: flattening a variable font loses its axes, and there is nothing to redraw in a font that is already TrueType.

Fix: Open it in the font inspector to see which case applies. A font that is already TrueType needs no conversion at all.

The converted font looks slightly different at very small sizes.

Why: CFF hinting was discarded, because TrueType has no equivalent instruction set to carry it into.

Fix: If small-size rendering on legacy Windows matters, keep the original .otf. For web and modern desktop rendering the difference is not visible.

The file is larger than the .otf it came from.

Why: Quadratic curves need more points than the cubics they approximate, and CFF stores outlines more compactly than glyf does. A larger file is the expected outcome, not a fault.

Fix: If size is the concern, convert to WOFF2 instead — that is a container change and compresses far better than either raw format.

A warning says some curves could not be fitted within the tolerance.

Why: A few outlines were complex enough to hit the subdivision depth limit before reaching 0.001 em.

Fix: The affected curves are still extremely close to the originals. Compare them in the previewer; in practice this is not visible.

Related

  • Inspector

    Read everything inside a font file in your browser: family and PostScript names, version, copyright and licence text, OS/2 embedding permissions, variation axes, colour tables and the full table directory.

    Open
  • Previewer

    Preview fonts with your own sample text, sizes, weights, colours and variable-font axis sliders. Rendered by the browser's own FontFace API, so it matches what your visitors will see.

    Open
  • TTF to WOFF2

    Compress TTF or OTF fonts to WOFF2 in your browser using the reference Google encoder. Batch queue, @font-face CSS, preload snippet and ZIP. No upload, no server.

    Open
  • Formats

    A precise guide to the four font formats: what a container is, what an outline model is, why OTF to TTF is a real conversion and TTF to WOFF2 is not, and which format to ship.

    Open