30

Given a directory of font files (TTF and OTF) I'd like to inspect each font and determine what style (regular, italic, bold, bold-italic) it is. Is there a command line tool for unix flavored operating systems that can do this? Or does anyone know how to extract the metadata from a TTF or OTF font file?

28

I think you're looking for otfinfo. There doesn't seem to be an option to get at the Subfamily directly, but you could do:

otfinfo --info *.ttf | grep Subfamily

Note that a number of the fonts I looked at use "Oblique" instead of "Italic".

  • 9
    Perfect, thanks! For those interested I'm on OS X and installed it via brew with brew install lcdf-typetools – kreek Dec 5 '11 at 5:28
  • FWIW, the MacPorts package is also called lcdf-typetools (and is a dependency of texlive-fontutils, so it may already be installed for people using TeX). – hans_meine Mar 4 at 6:54
15

In Linux, if you have .ttf fonts, you most probably also have fontconfig, which comes with the fc.scan utility. You can parse the output for the information you want, or use the badly documented --format option.

For example:

fc-scan --format "%{foundry} : %{family}\n" /usr/share/fonts/truetype/msttcorefonts/arialbd.ttf

The font properties you can print this way are shown here: http://www.freedesktop.org/software/fontconfig/fontconfig-user.html#AEN21

Some properties are listed in multiple languages. For example, %{fullname} may be a list. In that case, %{fullnamelang} will list the languages. If that shows you your language in fourth position in the list, you can use %{fullname[3]} as the format string to print the full name in only that language.

This language stuff being quite inconvenient, I ended up writing a full Perl script to list the info I wanted in only one language:

#!/usr/bin/perl

use strict;
my $VERSION=0.1;
my $debug=1;

my @wanted  = qw(foundry family fullname style weight slant width spacing file);
my @lang_dependent = qw(family fullname style);
my $lang = "en";

my $separator = ", ";


use File::Basename;
use Data::Dumper; $Data::Dumper::Sortkeys = 1;



my $me = basename $0;
die "Usage: $me FILENAME\n" unless @ARGV;

my $fontfile = shift;

unless (-f $fontfile) {
    die "Bad argument: '$fontfile' is not a file !\n";
}



my $fc_format = join( "\\n", map { "\%{$_}" } @wanted );

my @info = `fc-scan --format "$fc_format" "$fontfile"`;
chomp @info;

my %fontinfo;
@fontinfo{@wanted} = @info;

if ( grep /,/, @fontinfo{ @lang_dependent } ) {
    my $format = join( "\\n", map { "\%{${_}lang}" } @lang_dependent );
    my @langs = `fc-scan --format "$format" "$fontfile"`;

    for my $i (0..$#lang_dependent) {
        my @lang_list = split /,/, $langs[$i];
        my ($pos) = grep { $lang_list[$_] ~~ $lang } 0 .. $#lang_list;
        my @vals = split /,/, $fontinfo{$lang_dependent[$i]};
        $fontinfo{$lang_dependent[$i]} = $vals[$pos];
    }
}

warn Dumper(\%fontinfo), "\n" if $debug;

$fontinfo{'fullname'} ||= $fontinfo{'family'}; # some old fonts don't have a fullname? (WINNT/Fonts/marlett.ttf)

print join($separator, @fontinfo{@wanted}), "\n";
  • Awesome, thanks for the tip (and script.. though I haven't tested the script yet). Do you know if there's a way to get license/copyright info as well? I tried %{license}, %{copyright} and no format, but none of those yielded anything, whereas fontforge is able to show it to me. – insaner Nov 25 '15 at 16:23
  • Indeed, fc-scan does't seem to show the copyright. foundry is the closest it gives you. But otfinfo -i, suggested by cjm, does display it. – mivk Nov 25 '15 at 23:54
  • Ah that's great, I installed lcdf-typetools and and ran otfinfo -i as suggested and that did the trick, thanks! (And I gave @cjm a +1 as well). – insaner Nov 26 '15 at 15:05
  • fc-scan is great for getting the font "fullname" that is used to reference the font in programs. – mpr Apr 9 '18 at 14:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.