Có một công cụ dòng lệnh unix có thể phân tích các tập tin phông chữ?


32

Đưa ra một thư mục các tệp phông chữ (TTF và OTF) Tôi muốn kiểm tra từng phông chữ và xác định kiểu nào (thông thường, in nghiêng, in đậm, in đậm). Có một công cụ dòng lệnh cho các hệ điều hành có hương vị unix có thể làm điều này? Hoặc có ai biết cách trích xuất siêu dữ liệu từ tệp phông chữ TTF hoặc OTF không?

Câu trả lời:


30

Tôi nghĩ rằng bạn đang tìm kiếm otfinfo . Dường như không có tùy chọn nào để nhận trực tiếp tại Phân họ, nhưng bạn có thể làm:

otfinfo --info *.ttf | grep Subfamily

Lưu ý rằng một số phông chữ tôi đã xem sử dụng "Xiên" thay vì "In nghiêng".


10
Hoàn hảo, cảm ơn! Đối với những người quan tâm, tôi đang dùng OS X và cài đặt nó qua brew vớibrew install lcdf-typetools
kav

FWIW, gói MacPorts cũng được gọi lcdf-typetools(và là một phụ thuộc của texlive-fontutils, vì vậy nó có thể đã được cài đặt cho những người sử dụng TeX).
hans_meine

15

Trong Linux, nếu bạn có phông chữ .ttf, bạn có lẽ hầu hết cũng có fontconfig , mà đi kèm với các fc.scantiện ích. Bạn có thể phân tích đầu ra cho thông tin bạn muốn hoặc sử dụng --formattùy chọn tài liệu xấu .

Ví dụ:

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

Các thuộc tính phông chữ bạn có thể in theo cách này được hiển thị ở đây: http://www.freedesktop.org/software/fontconfig/fontconfig-user.html#AEN21

Một số thuộc tính được liệt kê bằng nhiều ngôn ngữ. Ví dụ, %{fullname}có thể là một danh sách. Trong trường hợp đó, %{fullnamelang}sẽ liệt kê các ngôn ngữ. Nếu điều đó cho bạn thấy ngôn ngữ của bạn ở vị trí thứ tư trong danh sách, bạn có thể sử dụng %{fullname[3]}làm chuỗi định dạng để in tên đầy đủ chỉ bằng ngôn ngữ đó.

Công cụ ngôn ngữ này khá bất tiện, cuối cùng tôi đã viết một tập lệnh Perl đầy đủ để liệt kê thông tin tôi muốn chỉ bằng một ngôn ngữ:

#!/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";

Tuyệt vời, cảm ơn vì tiền boa (và kịch bản .. mặc dù tôi chưa thử kịch bản). Bạn có biết nếu có một cách để có được thông tin giấy phép / bản quyền không? Tôi đã thử% {giấy phép},% {bản quyền} và không có định dạng, nhưng không ai trong số đó mang lại bất cứ điều gì, trong khi fontforge có thể hiển thị cho tôi.
điên cuồng

Thật vậy, fc-scan dường như không hiển thị bản quyền. foundrylà gần nhất nó mang lại cho bạn. Nhưng otfinfo -i, được đề xuất bởi cjm, không hiển thị nó.
mivk

Thật tuyệt vời, tôi đã cài đặt lcdf-typetoolsvà chạy otfinfo -inhư được đề xuất và đó là một mẹo nhỏ, cảm ơn! (Và tôi cũng đã cho @cjm +1).
điên cuồng

fc-scan là tuyệt vời để có được phông chữ "tên đầy đủ" được sử dụng để tham chiếu phông chữ trong các chương trình.
mpr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.