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

Contents of /openlayers/pdf2tiles.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 20 - (show 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 #!/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 my $from_page = 1;
16 my $to_page = 4;
17
18 my $tiles_path = 'tiles/basic';
19
20 foreach my $path ( $tiles_path, 'ppm' ) {
21 rmtree $path if -d $path;
22 mkpath $path || die "can't create $path: $!";
23 }
24
25 foreach my $zoom ( 1 .. 12 ) {
26
27 my $dpi = $zoom * 15;
28
29 my $ppm = sprintf("ppm/%03d", $dpi);
30
31 print "rendering pdf $pdf pages $from_page-$to_page in $dpi dpi\n";
32
33 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
36 my @page_imgs;
37
38 # size of all pages
39 my ( $x_size, $y_size ) = (0,0);
40
41 foreach my $page ( $from_page .. $to_page ) {
42
43 my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page);
44 die "can't find page $tmp" unless -f $tmp;
45
46 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 my $tiles_x = int( $x_size / 256 );
73 my $tiles_y = int( $y_size / 256 );
74
75 print "creating in $tiles_x*$tiles_y tiles\n";
76
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 my $path = sprintf("%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.png",
102 $tiles_path,
103 $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