/[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

Annotation of /openlayers/pdf2tiles.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 20 - (hide annotations)
Sun Feb 24 21:24:39 2008 UTC (16 years, 2 months ago) by dpavlin
File MIME type: text/plain
File size: 2758 byte(s)
render multiple pages
1 dpavlin 17 #!/usr/bin/perl -w
2    
3     # pdf2tiles.pl
4     #
5     # 02/24/08 01:22:36 CET Dobrica Pavlinusic <dpavlin@rot13.org>
6    
7     use strict;
8    
9     use Imager;
10     use File::Path;
11     use Data::Dump qw/dump/;
12    
13     my $pdf = shift @ARGV || die "usage: $0 filename.pdf";
14    
15 dpavlin 20 my $from_page = 1;
16     my $to_page = 4;
17 dpavlin 17
18 dpavlin 18 my $tiles_path = 'tiles/basic';
19    
20 dpavlin 20 foreach my $path ( $tiles_path, 'ppm' ) {
21     rmtree $path if -d $path;
22     mkpath $path || die "can't create $path: $!";
23     }
24    
25 dpavlin 17 foreach my $zoom ( 1 .. 12 ) {
26    
27 dpavlin 18 my $dpi = $zoom * 15;
28 dpavlin 17
29 dpavlin 20 my $ppm = sprintf("ppm/%03d", $dpi);
30 dpavlin 17
31 dpavlin 20 print "rendering pdf $pdf pages $from_page-$to_page in $dpi dpi\n";
32 dpavlin 17
33 dpavlin 20 my $cmd = "pdftoppm -f $from_page -l $to_page -r $dpi -aa yes -aaVector yes $pdf $ppm";
34     system($cmd) == 0 or die "can't start $cmd: $?";
35 dpavlin 17
36 dpavlin 20 my @page_imgs;
37 dpavlin 17
38 dpavlin 20 # size of all pages
39     my ( $x_size, $y_size ) = (0,0);
40 dpavlin 17
41 dpavlin 20 foreach my $page ( $from_page .. $to_page ) {
42 dpavlin 17
43 dpavlin 20 my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page);
44     die "can't find page $tmp" unless -f $tmp;
45 dpavlin 17
46 dpavlin 20 my $img = Imager->new;
47     $img->read(file=>$tmp) or die "Can't load $tmp: ", $img->errstr;
48    
49     $x_size += $img->getwidth();
50     my $h = $img->getheight();
51     $y_size = $h if $h > $y_size;
52    
53     push @page_imgs, $img;
54     }
55    
56     print "loaded $from_page-$to_page of $x_size*$y_size pixels\n";
57    
58     my $back_color = Imager::Color->new(255, 127, 127);
59    
60     my $img = Imager->new( xsize => $x_size, ysize => $y_size );
61     $img->box(filled=>1, color=>$back_color);
62    
63     my $x_pos = 0;
64    
65     foreach my $page_img ( @page_imgs ) {
66     $img->paste( left => $x_pos, top => 0, img => $page_img );
67     $x_pos += $page_img->getwidth();
68     }
69    
70     undef @page_imgs;
71    
72 dpavlin 17 my $tiles_x = int( $x_size / 256 );
73     my $tiles_y = int( $y_size / 256 );
74    
75 dpavlin 18 print "creating in $tiles_x*$tiles_y tiles\n";
76 dpavlin 17
77     for my $y ( 0 .. $tiles_y ) {
78     for my $x ( 0 .. $tiles_x ) {
79    
80     my $size = {
81     left => $x * 256,
82     bottom => $y_size - $y * 256,
83     width => $x == $tiles_x ? $x_size % 256 : 256,
84     height => $y == $tiles_y ? $y_size % 256 : 256,
85     };
86    
87     my $tile = $img->crop( %$size ) or die "can't crop $x*$y ",dump( $size );
88    
89     if ( ( $x == $tiles_x ) || ( $y == $tiles_y ) ) {
90     warn "## expand tile to full size\n";
91     my $t2 = Imager->new(xsize => 256, ysize => 256);
92     $t2->paste(
93     top => 256 - $size->{height},
94     left => 0,
95     src => $tile,
96     );
97     $tile = $t2;
98     }
99    
100     # emulate TileCache disk layout
101 dpavlin 18 my $path = sprintf("%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.png",
102     $tiles_path,
103 dpavlin 17 $zoom - 1, # starts with 0
104     int( $x / 1000000 ),
105     int( $x / 1000 ) % 1000,
106     $x % 1000,
107     int( $y / 1000000 ),
108     int( $y / 1000 ) % 1000,
109     $y % 1000
110     );
111    
112     my $dir = $path;
113     $dir =~ s,/[^/]+$,,;
114     mkpath $dir unless -d $dir;
115    
116     $tile->write( file => $path ) or die $tile->errstr;
117    
118     undef $tile;
119    
120     print "# $x*$y -> $path\n";
121    
122     }
123     }
124     }
125    
126    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26