มีเครื่องมือบรรทัดคำสั่ง unix ที่สามารถวิเคราะห์ไฟล์ตัวอักษร?


32

ให้ไดเรกทอรีของไฟล์ฟอนต์ (TTF และ OTF) ฉันต้องการตรวจสอบแต่ละฟอนต์และกำหนดว่าสไตล์ใด (ปกติ, ตัวเอียง, ตัวหนา, ตัวหนา - ตัวเอียง) มีเครื่องมือบรรทัดคำสั่งสำหรับระบบปฏิบัติการ unix ปรุงแต่งที่สามารถทำได้หรือไม่? หรือใครรู้วิธีการดึงข้อมูลเมตาจากไฟล์แบบอักษร TTF หรือ OTF?

คำตอบ:


30

ผมคิดว่าคุณกำลังมองหาotfinfo ดูเหมือนจะไม่มีตัวเลือกให้ไปที่อนุวงศ์โดยตรง แต่คุณสามารถทำได้:

otfinfo --info *.ttf | grep Subfamily

โปรดทราบว่าแบบอักษรจำนวนหนึ่งที่ฉันดูใช้ "เฉียง" แทน "ตัวเอียง"


10
สมบูรณ์แบบขอบคุณ! สำหรับผู้ที่สนใจฉันใช้งาน OS X และติดตั้งผ่านทาง Brew withbrew install lcdf-typetools
kreek

FWIW, แพคเกจ MacPorts นั้นเรียกอีกอย่างว่าlcdf-typetools(และเป็นการพึ่งพาtexlive-fontutilsดังนั้นจึงอาจถูกติดตั้งสำหรับผู้ที่ใช้ TeX แล้ว)
hans_meine

15

ใน Linux ถ้าคุณมีฟอนต์. ttf คุณก็อาจมีฟอนต์configซึ่งมาพร้อมกับ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";

ยอดเยี่ยมขอบคุณสำหรับเคล็ดลับ (และสคริปต์ .. แม้ว่าฉันยังไม่ได้ทดสอบสคริปต์) คุณรู้หรือไม่ว่ามีวิธีรับข้อมูลลิขสิทธิ์ / ลิขสิทธิ์ด้วยหรือไม่? ฉันลอง% {license},% {copyright} และไม่มีรูปแบบใด แต่ไม่มีรูปแบบใดที่ให้ผลตอบแทนใด ๆ ในขณะที่ fontforge สามารถแสดงให้ฉันเห็นได้
บ้า

อันที่จริง fc-scan ดูเหมือนจะไม่แสดงลิขสิทธิ์ foundryมันใกล้เคียงที่สุดที่จะให้คุณ แต่otfinfo -iแนะนำโดย cjm จะแสดงมัน
mivk

อ่าเยี่ยมมากฉันติดตั้งlcdf-typetoolsและวิ่งotfinfo -iตามที่แนะนำและนั่นก็เป็นการหลอกลวงขอบคุณ! (และฉันก็ให้ @cjm +1 เช่นกัน)
บ้า

fc-scan เหมาะอย่างยิ่งสำหรับการรับฟอนต์ "fullname" ที่ใช้ในการอ้างอิงฟอนต์ในโปรแกรม
MPR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.