Существует ли инструмент командной строки Unix, который может анализировать файлы шрифтов?

32

Учитывая каталог файлов шрифтов (TTF и OTF), я хотел бы проверить каждый шрифт и определить, какой это стиль (обычный, курсив, полужирный, полужирный курсив). Существует ли инструмент командной строки для операционных систем Unix со вкусом, который может это сделать? Или кто-нибудь знает, как извлечь метаданные из файла шрифта TTF или OTF?

Kreek
источник

Ответы:

30

Я думаю, что вы ищете Отфинфо . Кажется , нет возможности попасть в подсемейство напрямую, но вы могли бы сделать:

otfinfo --info *.ttf | grep Subfamily

Обратите внимание, что в некоторых шрифтах, которые я рассматривал, используется «Наклонный» вместо «Курсив».

CJM
источник
10
Отлично, спасибо! Для тех, кто заинтересован, я на OS X и установил его с помощью brew сbrew install lcdf-typetools
kreek
FWIW, пакет MacPorts также называется lcdf-typetools(и является зависимостью texlive-fontutils, поэтому он может быть уже установлен для людей, использующих TeX).
hans_meine
15

В Linux, если у вас есть шрифты .ttf, скорее всего, у вас также есть fontconfig , который поставляется вместе с fc.scanутилитой. Вы можете проанализировать выходные данные для получения необходимой информации или использовать плохо документированный --formatвариант.

Например:

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

Свойства шрифта, которые вы можете напечатать таким способом, показаны здесь: http://www.freedesktop.org/software/fontconfig/fontconfig-user.html#AEN21

Некоторые свойства перечислены на нескольких языках. Например, %{fullname}может быть список. В этом случае %{fullnamelang}будут перечислены языки. Если это показывает, что ваш язык находится на четвертой позиции в списке, вы можете использовать %{fullname[3]}в качестве строки формата для печати полного имени только на этом языке.

Эти языковые вещи были довольно неудобными, и я закончил тем, что написал полный скрипт на Perl, чтобы вывести информацию, которую я хотел, только на одном языке:

#!/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";
mivk
источник
Круто, спасибо за подсказку (и скрипт ... хотя я еще не тестировал скрипт). Знаете ли вы, есть ли способ получить информацию о лицензии / авторских правах? Я пробовал% {license},% {copyright} и не форматировал, но ни один из них ничего не дал, тогда как fontforge может показать это мне.
безумный
Действительно, fc-scan, похоже, не показывает авторские права. foundryэто самый близкий вам Но otfinfo -i, предложенный cjm, отображает его.
Mivk
Ах, это здорово, я установил lcdf-typetoolsи побежал otfinfo -iкак предложено, и это сделало свое дело, спасибо! (И я дал @cjm +1 тоже).
Insaner
fc-scan отлично подходит для получения шрифта "fullname", который используется для ссылки на шрифт в программах.
MPR