The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

# Inspired by the script provided by SREZIC (https://rt.cpan.org/Ticket/Display.html?id=110723)

use strict;
use warnings;
use Getopt::Long;

use PDF::Create;
use PDF::Font;

my $usage =<<HELP;

verify-char-width [--font-name=<supported font name>] [--help]

Supported font names are as below:
    - Courier
    - Courier-Bold
    - Courier-BoldOblique
    - Courier-Oblique
    - Helvetica
    - Helvetica-Bold
    - Helvetica-BoldOblique
    - Helvetica-Oblique
    - Times-Bold
    - Times-BoldItalic
    - Times-Italic
    - Times-Roman
    - Symbol
HELP

my ($font_name, $help);
GetOptions("font-name=s" => \$font_name,
           "help"        => \$help) or die $usage;
(defined $help) && die $usage;

die "ERROR: Missing font name.\n"              unless defined $font_name;
die "ERROR: Invalid font name [$font_name].\n" unless (exists $PDF::Font::SUPPORTED_FONTS->{$font_name});

my $pdf  = PDF::Create->new(filename => sprintf("%s.pdf", lc($font_name)));
my $root = $pdf->new_page(MediaBox => $pdf->get_page_size('A4'));
my $page = $root->new_page;

my $font;
if ($font_name eq 'Symbol') {
    $font = $pdf->font(BaseFont => $font_name, Encoding => $font_name);
}
else {
    $font = $pdf->font(BaseFont => $font_name);
}

my $x = 20;
my $y = 800;

foreach my $char (32..126, 160..255) {
    my $chr = chr($char);
    my $str = $chr . ':' . $char;
    my $w = $page->string_width($font, $str) * 20;

    if ($x + 55 > 575) {
        $x = 20;
        $y -= 30;
    }

    $page->string($font, 20, $x, $y, $str);
    my $w_line = $page->string_width($font, $chr) * 20;

    $page->line($x, $y, $x+$w_line, $y);
    $page->line($x, $y+20, $x+$w_line, $y+20);
    $page->line($x, $y, $x, $y+20);
    $page->line($x+$w_line, $y, $x+$w_line, $y+20);

    $x += 65;
}

$pdf->close;

__END__