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

package main;

use warnings;
use strict;
use CAM::PDF;
use Getopt::Long;
use Pod::Usage;
use English qw(-no_match_vars);

our $VERSION = '1.52';

my %opts = (
            verbose    => 0,
            help       => 0,
            version    => 0,
            );

Getopt::Long::Configure('bundling');
GetOptions('v|verbose'    => \$opts{verbose},
           'h|help'       => \$opts{help},
           'V|version'    => \$opts{version},
           ) or pod2usage(1);
if ($opts{help})
{
   pod2usage(-exitstatus => 0, -verbose => 2);
}
if ($opts{version})
{
   print "CAM::PDF v$CAM::PDF::VERSION\n";
   exit 0;
}

if (@ARGV < 1)
{
   pod2usage(1);
}

while (@ARGV > 0)
{
   my $file = shift;

   # prompt for password
   my $doc = CAM::PDF->new($file, q{}, q{}, 1) || die "$CAM::PDF::errstr\n";
   
   if ($file eq q{-})
   {
      $file = 'STDIN';
   }
   my $size = length $doc->{content};
   my $pages = $doc->numPages();
   my @prefs = $doc->getPrefs();
   my $pdfversion = $doc->{pdfversion};
   my $pdfinfo = $doc->{trailer}->{Info};
   $pdfinfo &&= $doc->getValue($pdfinfo);

   my @pagesize = (0,0);
   my $p = $doc->{Pages};
   my $box = $p->{MediaBox};
   if ($box)
   {
      $box = $box->{value};
      @pagesize = ($box->[2]->{value} - $box->[0]->{value},
                   $box->[3]->{value} - $box->[1]->{value});
   }

   print "File:         $file\n";
   print "File Size:    $size bytes\n";
   print "Pages:        $pages\n";
   if ($pdfinfo)
   {
      my $date = qr/(\d{4})(\d{2})(\d{2})/xms;
      my $time = qr/(\d{2})(\d{2})(\d{2})/xms;
      my $tz = qr/([+-Z])(\d{2})\'(\d{2})\'/xms;
      foreach my $key (sort keys %{$pdfinfo})
      {
         my $val = $pdfinfo->{$key}->{value};
         if ($pdfinfo->{$key}->{type} eq 'string' && $val &&
             $val =~ m{ \A
                        D: $date $time $tz
                        \z
                      }xms)
         {
            my ($Y,$M,$D,$h,$m,$s,$sign,$tzh,$tzm) = ($1,$2,$3,$4,$5,$6,$7,$8,$9);
            if ($sign eq 'Z')
            {
               $sign = q{+};
            }
            require Time::Local;
            my $timegm = Time::Local::timegm($s,$m,$h,$D,$M-1,$Y-1900);
            my $tzshift = $sign . ($tzh*3600 + $tzm*60);
            $timegm += $tzshift;
            $val = localtime $timegm;
         }
         printf "%-13s %s\n", $key.q{:}, $val;
      }
   }
   print 'Page Size:    '.($pagesize[0] ? "$pagesize[0] x $pagesize[1] pts" : 'variable')."\n";
   print 'Optimized:    '.($doc->isLinearized()?'yes':'no')."\n";
   print "PDF version:  $pdfversion\n";
   print "Security\n";
   if ($prefs[0] || $prefs[1])
   {
      print "  Passwd:     '$prefs[0]', '$prefs[1]'\n";
   }
   else
   {
      print "  Passwd:     none\n";
   }
   print '  Print:      '.($prefs[2]?'yes':'no')."\n";
   print '  Modify:     '.($prefs[3]?'yes':'no')."\n";
   print '  Copy:       '.($prefs[4]?'yes':'no')."\n";
   print '  Add:        '.($prefs[5]?'yes':'no')."\n";
   if (@ARGV > 0)
   {
      print "---------------------------------\n";
   }
}


__END__

=for stopwords pdfinfo.pl

=head1 NAME

pdfinfo.pl - Print information about PDF file(s)

=head1 SYNOPSIS

 pdfinfo.pl [options] file.pdf [file.pdf ...]

 Options:
   -v --verbose        print diagnostic messages
   -h --help           verbose help message
   -V --version        print CAM::PDF version

=head1 DESCRIPTION

Prints to STDOUT various basic details about the specified PDF
file(s).

=head1 SEE ALSO

CAM::PDF

=head1 AUTHOR

See L<CAM::PDF>

=cut