/[flash]/openlayers/pdf2tiles.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /openlayers/pdf2tiles.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 19 by dpavlin, Sun Feb 24 21:01:20 2008 UTC revision 22 by dpavlin, Mon Feb 25 00:19:40 2008 UTC
# Line 12  use Data::Dump qw/dump/; Line 12  use Data::Dump qw/dump/;
12    
13  my $pdf = shift @ARGV || die "usage: $0 filename.pdf";  my $pdf = shift @ARGV || die "usage: $0 filename.pdf";
14    
15  my $limit = '';  my $debug = 1;
16  $limit = '-f 1 -l 1';  
17    my $from_page   = 1;
18    my $to_page             = 4;
19    
20  my $tiles_path = 'tiles/basic';  my $tiles_path = 'tiles/basic';
 rmtree $tiles_path if -d $tiles_path;  
 mkpath $tiles_path || die "can't create $tiles_path: $!";  
21    
22  foreach my $zoom ( 1 .. 12 ) {  foreach my $path ( $tiles_path, 'ppm' ) {
23            rmtree $path if -d $path;
24            mkpath $path || die "can't create $path: $!";
25    }
26    
27    print "redering test 100dpi page to get pixel size\n";
28    system("pdftoppm -f 1 -l 1 -r 100 $pdf ppm/test") == 0 or die "can't render test: $?";
29    my $test = 'ppm/test-000001.ppm';
30    open(my $fh, '<', $test) || die "can't open $test: $!";
31    my $res = <$fh>;
32    $res = <$fh>;
33    my ( $x_res, $y_res ) = split(/\s+/,$res);
34    print "## 100 dpi resolution = $x_res*$y_res\n";
35    close($fh);
36    
37    $x_res *= ( $to_page - $from_page + 1 );
38    
39    print "## total size = $x_res*$y_res\n";
40    
41    # initial width = 2 tiles
42    my $curr_w = 256 * 2;
43    
44    my $start_dpi = int( 100 / ( $x_res / $curr_w ) );
45    
46          my $dpi = $zoom * 15;  foreach my $zoom ( 1 .. 10 ) {
47    
48          my $ppm = sprintf("tmp-%03d", $dpi);          my $dpi = $start_dpi * $zoom;
         my $tmp = "$ppm-000001.ppm";  
49    
50          print "rendering pdf $pdf in $dpi dpi to $tmp\n";          my $ppm = sprintf("ppm/%03d", $dpi);
51    
52          system "pdftoppm $limit -r $dpi -aa yes -aaVector yes $pdf $ppm";          print "rendering pdf $pdf pages $from_page-$to_page in $dpi dpi\n";
53    
54          die "can't render" unless -f $tmp;          my $cmd = "pdftoppm -f $from_page -l $to_page -r $dpi -aa yes -aaVector yes $pdf $ppm";
55            system($cmd) == 0 or die "can't start $cmd: $?";
56    
57          my $img = Imager->new;          my @page_imgs;
         $img->read(file=>$tmp) or die "Can't load $tmp: ", $img->errstr;  
58    
59          my $x_size = $img->getwidth();          # size of all pages
60          my $y_size = $img->getheight();          my ( $x_size, $y_size ) = (0,0);
61    
62            foreach my $page ( $from_page .. $to_page ) {
63    
64                    my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page);
65                    die "can't find page $tmp" unless -f $tmp;
66    
67                    my $p_img = Imager->new;
68                    $p_img->read(file=>$tmp) or die "Can't load $tmp: ", $p_img->errstr;
69    
70                    $x_size += $p_img->getwidth();
71                    my $h = $p_img->getheight();
72                    $y_size = $h if $h > $y_size;
73    
74                    push @page_imgs, $p_img;
75            }
76    
77          print "loaded $tmp $x_size*$y_size pixels\n";          print "loaded $from_page-$to_page of $x_size*$y_size pixels\n";
78    
79            my $back_color = Imager::Color->new(255, 127, 127);
80    
81            sub pad {
82                    my $s = shift;
83                    return 256 - ( $s % 256);
84            }
85    
86            my ( $full_x, $full_y ) = ( $x_size + pad( $x_size ), $y_size + pad( $y_size ) );
87    
88            my $img = Imager->new( xsize => $full_x, ysize => $full_y );
89            $img->box(filled=>1, color=>$back_color);
90    
91            my $x_pos = int( pad( $x_size ) / 2 );
92            my $y_pos = int( pad( $y_size ) / 2 );
93    
94            foreach my $page_img ( @page_imgs ) {
95                    $img->paste( left => $x_pos, top => $y_pos, img => $page_img );
96                    $x_pos += $page_img->getwidth();
97            }
98    
99            undef @page_imgs;
100    
101            $img->write( file => sprintf("zoom-%03d.jpg", $dpi ) ) if $debug;
102    
103          my $tiles_x = int( $x_size / 256 );          my $tiles_x = int( $x_size / 256 );
104          my $tiles_y = int( $y_size / 256 );          my $tiles_y = int( $y_size / 256 );
105    
106          print "creating in $tiles_x*$tiles_y tiles\n";          print "creating in $tiles_x*$tiles_y tiles from $full_x*$full_y\n";
107    
108          for my $y ( 0 .. $tiles_y ) {          for my $y ( 0 .. $tiles_y ) {
109                  for my $x ( 0 .. $tiles_x ) {                  for my $x ( 0 .. $tiles_x ) {
110    
111                          my $size = {                          my $size = {
112                                  left    => $x * 256,                                  left    => $x * 256,
113                                  bottom  => $y_size - $y * 256,                                  bottom  => $full_y - $y * 256,
114                                  width   => $x == $tiles_x ? $x_size % 256 : 256,                                  width   => 256,
115                                  height  => $y == $tiles_y ? $y_size % 256 : 256,                                  height  => 256,
116                          };                          };
117    
118                          my $tile = $img->crop( %$size ) or die "can't crop $x*$y ",dump( $size );                          my $tile = $img->crop( %$size ) or die "can't crop $x*$y ",dump( $size );
119    
                         if ( ( $x == $tiles_x ) || ( $y == $tiles_y ) ) {  
                                 warn "## expand tile to full size\n";  
                                 my $t2 = Imager->new(xsize => 256, ysize => 256);  
                                 $t2->paste(  
                                         top => 256 - $size->{height},  
                                         left => 0,  
                                         src => $tile,  
                                 );  
                                 $tile = $t2;  
                         }  
   
120                          # emulate TileCache disk layout                          # emulate TileCache disk layout
121                          my $path = sprintf("%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.png",                          my $path = sprintf("%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.png",
122                                  $tiles_path,                                  $tiles_path,
# Line 88  foreach my $zoom ( 1 .. 12 ) { Line 137  foreach my $zoom ( 1 .. 12 ) {
137    
138                          undef $tile;                          undef $tile;
139    
140                          print "# $x*$y -> $path\n";                          printf("# %2d*%-2d -> %s\n", $x, $y, $path);
141    
142                  }                  }
143          }          }
144    
145            # break if zoom level over 300dpi
146            last if $dpi > 300;
147  }  }
148                    
149    

Legend:
Removed from v.19  
changed lines
  Added in v.22

  ViewVC Help
Powered by ViewVC 1.1.26