--- openlayers/pdf2tiles.pl 2008/02/24 21:01:20 19 +++ openlayers/pdf2tiles.pl 2008/02/24 21:24:39 20 @@ -12,33 +12,62 @@ my $pdf = shift @ARGV || die "usage: $0 filename.pdf"; -my $limit = ''; -$limit = '-f 1 -l 1'; +my $from_page = 1; +my $to_page = 4; my $tiles_path = 'tiles/basic'; -rmtree $tiles_path if -d $tiles_path; -mkpath $tiles_path || die "can't create $tiles_path: $!"; + +foreach my $path ( $tiles_path, 'ppm' ) { + rmtree $path if -d $path; + mkpath $path || die "can't create $path: $!"; +} foreach my $zoom ( 1 .. 12 ) { my $dpi = $zoom * 15; - my $ppm = sprintf("tmp-%03d", $dpi); - my $tmp = "$ppm-000001.ppm"; + my $ppm = sprintf("ppm/%03d", $dpi); + + print "rendering pdf $pdf pages $from_page-$to_page in $dpi dpi\n"; + + my $cmd = "pdftoppm -f $from_page -l $to_page -r $dpi -aa yes -aaVector yes $pdf $ppm"; + system($cmd) == 0 or die "can't start $cmd: $?"; + + my @page_imgs; + + # size of all pages + my ( $x_size, $y_size ) = (0,0); + + foreach my $page ( $from_page .. $to_page ) { + + my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page); + die "can't find page $tmp" unless -f $tmp; + + my $img = Imager->new; + $img->read(file=>$tmp) or die "Can't load $tmp: ", $img->errstr; + + $x_size += $img->getwidth(); + my $h = $img->getheight(); + $y_size = $h if $h > $y_size; + + push @page_imgs, $img; + } - print "rendering pdf $pdf in $dpi dpi to $tmp\n"; + print "loaded $from_page-$to_page of $x_size*$y_size pixels\n"; - system "pdftoppm $limit -r $dpi -aa yes -aaVector yes $pdf $ppm"; + my $back_color = Imager::Color->new(255, 127, 127); - die "can't render" unless -f $tmp; + my $img = Imager->new( xsize => $x_size, ysize => $y_size ); + $img->box(filled=>1, color=>$back_color); - my $img = Imager->new; - $img->read(file=>$tmp) or die "Can't load $tmp: ", $img->errstr; + my $x_pos = 0; - my $x_size = $img->getwidth(); - my $y_size = $img->getheight(); + foreach my $page_img ( @page_imgs ) { + $img->paste( left => $x_pos, top => 0, img => $page_img ); + $x_pos += $page_img->getwidth(); + } - print "loaded $tmp $x_size*$y_size pixels\n"; + undef @page_imgs; my $tiles_x = int( $x_size / 256 ); my $tiles_y = int( $y_size / 256 );