#!/usr/bin/perl -s use Time::HiRes qw[tv_interval gettimeofday]; use Time::Piece; our ($big, $from, $to, $prefix, $opaque, $h, $v); sub progress($$$) { return if $v; printf STDERR "\r[%s%%|ETA %s] %- 50s" => @_ } sub format_time($) { my $t = Time::Piece->strptime(int($_[0]),"%s"); $t->hms } sub execute($) { my $cmd = shift; print "[$cmd]\n" if defined $v; system $cmd; } if ($h) { print "-big -v -from -to -prefix -opaque -h\n"; exit 0; } my $filename = shift; my $info = `pdfinfo $filename`; my ($pages) = grep { /Pages:\s+\d+/ } split /\n/, $info; $pages =~ /(\d+)/; $pages = $1; $from ||= 1; $to ||= $pages; print STDERR "$filename has $pages pages.\n"; my $t0 = [gettimeofday]; my $eta = format_time(1_000_000); my $nr_pages = $to - $from + 1; print STDERR "Extracting $nr_pages (from $from to $to)\n"; print STDERR "..."; for my $i ($from..$to) { my $percent = sprintf "%6.2f" => (($i-$from)/$nr_pages)*100; progress $percent, $eta => "Extracting page $i from PDF"; my $name = sprintf("%04d", $i); $name = $prefix.$name if defined($prefix); execute "pdftops -f $i -l $i $filename $name.ps"; progress $percent, $eta => "Converting page $i to $name.png"; $opaque = defined($opaque) ? '-background white -flatten' : ''; if ($big) { execute "convert -density 600x600 $name.ps -density 600x600 $opaque $name.png"; } else { execute "convert -density 300x300 $name.ps -density 300x300 $opaque $name.png"; } progress $percent, $eta => "Removing temporary files."; unlink "$name.ps"; if ($i % 2) { my $elapsed = tv_interval $t0; ## $i-$from+1 = $elapsed ## $to-$i == $x $eta = format_time(($elapsed * ($to-$i))/($i-$from+1)); } } progress 100, '00:00:00' => "DONE"; printf STDERR "\n";