有unix命令行工具可以分析字体文件吗?


32

给定一个字体文件目录(TTF和OTF),我想检查每种字体并确定它是什么样式(常规,斜体,粗体,粗体斜体)。是否有针对UNIX风格的操作系统的命令行工具可以做到这一点?还是有人知道如何从TTF或OTF字体文件中提取元数据?

Answers:


30

我认为您正在寻找otfinfo。似乎没有直接进入亚科的选择,但您可以这样做:

otfinfo --info *.ttf | grep Subfamily

请注意,我看过的许多字体使用“ Oblique”而不是“ Italic”。


10
很好,谢谢!对于那些感兴趣的人,我在OS X上并通过brew通过brew install lcdf-typetools
kreek

FWIW,也称为MacPorts软件包lcdf-typetools(是的依赖项texlive-fontutils,因此可能已经为使用TeX的用户安装了该软件包)。
hans_meine

15

在Linux中,如果您使用.ttf字体,则很可能还具有该实用程序随附的fontconfigfc.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";

太棒了,谢谢你的提示(和脚本。尽管我还没有测试脚本)。您知道是否还有一种获取许可证/版权信息的方法吗?我尝试了%{license},%{copyright},并且没有格式,但是这些格式都没有产生任何效果,而fontforge可以向我展示。
insaner

实际上,fc-scan似乎没有显示版权。foundry是它给您的最接近的东西。但是otfinfo -i,由cjm建议,不会显示它。
mivk 2015年

啊,太好了,我按照建议的方式安装lcdf-typetools和运行了otfinfo -i,就成功了,谢谢!(我也给了@cjm +1)。
insaner 2015年

fc-scan非常适合获取字体“全名”,该字体用于在程序中引用该字体。
mpr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.