The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use WWW::Mechanize::Firefox;
use Getopt::Long;
use Pod::Usage;

GetOptions(
    'mozrepl|m:s' => \my $mozrepl,
    'outfile|o:s' => \my $outfile,
    'tab|t:s' => \my $tab,
    'target-width|tw:s' => \my $target_w,
    'target-height|th:s' => \my $target_h,
    'target-scale|s:s' => \my $target_scale,
    'target-scale-x|sx:s' => \my $target_scale_w,
    'target-scale-y|sy:s' => \my $target_scale_h,
    'current|c' => \my $current,
) or pod2usage();
$outfile ||= 'screenshot.png';

my @args;
if (! @ARGV) {
    push @args, tab => 'current';
};

if ($tab) {
    $tab = qr/$tab/;
} elsif ($current) {
    $tab = $current
};

my $mech = WWW::Mechanize::Firefox->new(
    launch => 'firefox',
    create => 1,
    tab => $tab,
    autoclose => (!$tab),
    @args
);

if (@ARGV) {
    $mech->get($ARGV[0]);
};

my $png = $mech->content_as_png(undef,undef,
    {
        width => $target_w,
        height => $target_h,
        scalex => ($target_scale_w||$target_scale),
        scaley => ($target_scale_h||$target_scale),
    }
);

open my $out, '>', $outfile
    or die "Couldn't create '$outfile': $!";
binmode $out;
print {$out} $png;

=head1 NAME

screenshot.pl - take a screenshot of a webpage

=head1 SYNOPSIS

screenshot.pl [options] [url]

Options:
   --outfile        name of output file
   --mozrepl        connection string to Firefox
   --tab            name of the tab title to use
   --current        use currently active tab
   --target-width   width of target image (in pixels)
   --target-height  height of target image (in pixels)
   --target-scale   scale of target image (ratio)

=head1 OPTIONS

=over 4

=item B<--outfile>

Name of the output file. The image will always be written
in PNG format.

=item B<--mozrepl>

Connection information for the mozrepl instance to use.

=back

=head1 DESCRIPTION

B<This program> will take a screenshot
of the given URL (including plugins) and
write it to the given file or the file C<screenshot.png>.

=cut