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?
2 Answers
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".
- 26,740
- 12
- 88
- 84
-
14Perfect, thanks! For those interested I'm on OS X and installed it via brew with `brew install lcdf-typetools` – kreek Dec 05 '11 at 05: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 04 '19 at 06:54
-
The nix package is called `nixpkgs.lcdf-typetools` – pseudosudo Dec 13 '22 at 00:44
-
On Fedora 37 it's called `texlive-lcdftypetools` – Cristian Ciupitu Jan 12 '23 at 17:12
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";
- 2,430
- 1
- 22
- 29
- 3,446
- 29
- 31
-
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
-
1Indeed, 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
-
1fc-scan is great for getting the font "fullname" that is used to reference the font in programs. – mpr Apr 09 '18 at 14:52
-
1If you want to avoid the language issue, `postscriptname` instead of `fullname` gives you the same information, language-independent, in a different format. Alternatively, in bash: `for fontfile in /mnt/Fonts/*.{otf,ttf}; do fc-scan --format "%{fullname[$(( $(sed -E 's/^(.*)en.*/\1/;s/[^,]//g' <<< "$(fc-scan --format "%{fullnamelang}\n" ${fontfile})" | wc -c) -1 ))]}\n" "${fontfile}"; done > fontlist.txt` – emk2203 May 07 '20 at 06:55
-