#!/usr/bin/perl # wants one or more font names on the command line. If none given, use full # list of core fonts. If -s given as first arg, use the short list. # CAUTION: the displayed Unicode value (U=xxxx) appears to be correct in most # cases, except that the MS Smart Quotes (32 characters) are given as U=0080 # through U=009F. Those Unicode values are reserved for the C1 Control character # group, not printable glyphs. I don't know if the font files hold incorrect # Unicode values, or this program is in error. See PDF::Builder::Resource:: # Glyphs for u2n and n2u tables -- they may be in error. What the mapping is # from Unicode to the various pages and 00..FF within each page is not clear at # this point, although the "Latinx" encodings seem to be mostly OK. Note that # most fonts spill over onto 1 or more additional pages, which of course is # beyond single byte encoding. use strict; use warnings; use lib '../lib'; use PDF::Builder; use PDF::Builder::Util; #my $compress = 'none'; # uncompressed streams my $compress = 'flate'; # compressed streams my $sx = 33; my $sy = 45; my $fx = 20; my $gLLx = 50; # lower left position of grid my $gLLy = 50; # default list of core fonts if user doesn't provide command line list my @fns=qw{ Helvetica Helvetica-Oblique Helvetica-Bold Helvetica-BoldOblique Courier Courier-Oblique Courier-Bold Courier-BoldOblique Times-Roman Times-Italic Times-Bold Times-BoldItalic Symbol ZapfDingbats georgia georgiaitalic georgiabold georgiabolditalic trebuchet trebuchetbold trebuchetbolditalic trebuchetitalic verdana verdanaitalic verdanabold verdanabolditalic wingdings webdings }; # It's not clear what is being shown for Bank Gothic. # 1. There is only Regular and Italic -- no bold variants # 2. It doesn't look like the Bank Gothic shown on sample font pages -- # perhaps it's some other sans serif font being substituted # bankgothic # bankgothicbold # bankgothicbolditalic # bankgothicitalic my @ARGVcopy = @ARGV; # 'short' (-s flag)? if (@ARGVcopy > 0 && $ARGVcopy[0] eq '-s') { @ARGVcopy = qw{ Courier-Bold Times-Italic Symbol }; } # use only with single byte encodings, as multibyte (including UTF-8) don't # appear to be compatible with these core fonts # there may be a number of aliases available for each encoding. # available encodings (believed to be single byte): # 7bit-jis AdobeStandardEncoding AdobeSymbol AdobeZdingbat ascii # ascii-ctrl cp1006 cp1026 cp1047 cp1250 cp1251 cp1252 cp1253 cp1254 # cp1255 cp1256 cp1257 cp1258 cp37 cp424 cp437 cp500 cp737 cp775 # cp850 cp852 cp855 cp856 cp857 cp858 cp860 cp861 cp862 cp863 cp864 # cp865 cp866 cp869 cp874 cp875 dingbats hp-roman8 iso-8859-1 # iso-8859-2 iso-8859-3 iso-8859-4 iso-8859-5 iso-8859-6 iso-8859-7 # iso-8859-8 iso-8859-9 iso-8859-10 iso-8859-11 iso-8859-13 iso-8859-14 # iso-8859-15 iso-8859-16 iso-ir-165 jis0201-raw koi8-f koi8-r koi8-u # MacArabic MacCentralEurRoman MacCroatian MacCyrillic MacDingbats # MacFarsi MacGreek MacHebrew MacIcelandic MacRoman MacRomanian # MacRumanian MacSami MacSymbol MacThai MacTurkish MacUkrainian nextstep # null posix-bc symbol viscii # multibyte encodings (do not use): # big5-eten big5-hkscs cp932 cp936 cp949 cp950 euc-cn euc-jp euc-kr # gb12345-raw gb2312-raw gsm0338 hz iso-2022-jp iso-2022-jp-1 iso-2022-kr # jis0208-raw jis0212-raw johab ksc5601-raw MacChineseSimp MacChineseTrad # MacJapanese MacKorean MIME-B MIME-Header MIME-Header-ISO_2022_JP MIME-Q # shiftjis UCS-2BE UCS-2LE UTF-16 UTF-16BE UTF-16LE UTF-32 UTF-32BE # UTF-32LE UTF-7 utf-8-strict utf8 and probably others my @ecs = qw{ latin1 latin2 latin3 latin4 latin5 latin6 latin7 latin8 latin9 latin10 }; # just Latin-1 for now... @ecs = qw{ latin1 }; my ($y, $pdf, $f1); # override default list with command line entries if (scalar @ARGVcopy && $ARGVcopy[0] ne '-s') { @fns = @ARGVcopy; } # loop through list of font names foreach my $fn (@fns) { # at least one page for each encoding foreach my $ec (@ecs) { $pdf = PDF::Builder->new(-compress => $compress); $f1 = $pdf->corefont('Helvetica'); # for various labels print STDERR "\n$fn -- $ec\n"; initNameTable(); # set up u2n and n2u hashes my $fnt = $pdf->corefont($fn, -encode => $ec); my @planes = ($fnt, $fnt->automap()); my $flight = -1; foreach my $plane (@planes) { $flight++; # subfonts within overall font (223 characters per plane + space) # they can be treated just like regular fonts my $page = $pdf->page(); $page->mediabox(595,842); my $gfx = $page->gfx(); my $txt = $page->text(); $txt->font($plane,$fx); my $txt2 = $page->text(); $txt2->textlabel($gLLx,800, $f1,20, "font='".$plane->fontname()." / ".$plane->name()."' plane $flight", -hscale=>75); $txt2->textlabel($gLLx,780, $f1,20, "encoding='$ec'"); $txt2->font($f1, 5); $txt2->hscale(80); # distance below baseline (<0) to clear descenders my $u = $plane->underlineposition()*$fx/1000; # draw grid of characters and information # yp character row value (0..F T to B) foreach my $yp (0..15) { $y = 15 - $yp; # y vertical (row) position T to B print STDERR "."; foreach my $x (0..15) { # x horizontal (column) position L to R $txt->translate($gLLx+($sx*$x),$gLLy+($sy*$y)); my $ci = $yp*16 + $x; # 0..255 value my $c = chr($ci); $txt->text($c); my $wx = $plane->width($c)*$fx; # bounding box cell around character $gfx->strokecolor('lightblue'); if ($plane->wxMissingByEnc($ci)) { $gfx->fillcolor(1.0, 0.7, 0.7); } $gfx->move($gLLx+($sx*$x) ,$gLLy+($sy*$y)+$fx); $gfx->line($gLLx+($sx*$x) ,$gLLy+($sy*$y)+$u); $gfx->line($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)+$u); $gfx->line($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)+$fx); $gfx->close(); if ($plane->wxMissingByEnc($ci)) { $gfx->fillstroke(); $gfx->fillcolor('black'); } else { $gfx->stroke(); } # baseline $gfx->strokecolor('gray'); $gfx->move($gLLx+($sx*$x) ,$gLLy+($sy*$y)); $gfx->line($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)); $gfx->stroke(); # character data $txt2->translate($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)-6); $txt2->text_right($ci); $txt2->translate($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)-11); if (defined $plane->uniByEnc($ci)) { $txt2->text_right(sprintf('U+%04X',$plane->uniByEnc($ci))); } else { $txt2->text_right('U+????'); } $txt2->translate($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)-16); $txt2->text_right($plane->glyphByEnc($ci)); $txt2->translate($gLLx+($sx*$x)+$wx,$gLLy+($sy*$y)-21); $txt2->text_right(sprintf('wx=%i',$plane->wxByEnc($ci))); } # loop through columns (x) } # loop through rows (yp/y) print STDERR "\n"; } # loop through "sub" fonts (planes) $pdf->saveas("$0.$fn.$ec.pdf"); $pdf->end(); } # loop through each encoding (ec) } # loop for each font name (fn) exit; __END__