/[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 21 - (hide annotations)
Sun Feb 24 23:53:26 2008 UTC (16 years, 2 months ago) by dpavlin
File MIME type: text/plain
File size: 3406 byte(s)
- deduce starting dpi from test rendering in 100 dpi
- background for partial tiles
- stop rendering at 300 dpi
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 21 print "redering test 100dpi page to get pixel size\n";
26     system("pdftoppm -f 1 -l 1 -r 100 $pdf ppm/test") == 0 or die "can't render test: $?";
27     my $test = 'ppm/test-000001.ppm';
28     open(my $fh, '<', $test) || die "can't open $test: $!";
29     my $res = <$fh>;
30     $res = <$fh>;
31     my ( $x_res, $y_res ) = split(/\s+/,$res);
32     print "## 100 dpi resolution = $x_res*$y_res\n";
33     close($fh);
34 dpavlin 17
35 dpavlin 21 $x_res *= ( $to_page - $from_page + 1 );
36 dpavlin 17
37 dpavlin 21 print "## total size = $x_res*$y_res\n";
38    
39     # initial width = 2 tiles
40     my $start_dpi = int( 100 / ( $x_res / 512 ) );
41    
42     foreach my $zoom ( 1 .. 10 ) {
43    
44     my $dpi = $start_dpi * $zoom;
45    
46 dpavlin 20 my $ppm = sprintf("ppm/%03d", $dpi);
47 dpavlin 17
48 dpavlin 20 print "rendering pdf $pdf pages $from_page-$to_page in $dpi dpi\n";
49 dpavlin 17
50 dpavlin 20 my $cmd = "pdftoppm -f $from_page -l $to_page -r $dpi -aa yes -aaVector yes $pdf $ppm";
51     system($cmd) == 0 or die "can't start $cmd: $?";
52 dpavlin 17
53 dpavlin 20 my @page_imgs;
54 dpavlin 17
55 dpavlin 20 # size of all pages
56     my ( $x_size, $y_size ) = (0,0);
57 dpavlin 17
58 dpavlin 20 foreach my $page ( $from_page .. $to_page ) {
59 dpavlin 17
60 dpavlin 20 my $tmp = sprintf("ppm/%03d-%06d.ppm", $dpi, $page);
61     die "can't find page $tmp" unless -f $tmp;
62 dpavlin 17
63 dpavlin 21 my $p_img = Imager->new;
64     $p_img->read(file=>$tmp) or die "Can't load $tmp: ", $p_img->errstr;
65 dpavlin 20
66 dpavlin 21 $x_size += $p_img->getwidth();
67     my $h = $p_img->getheight();
68 dpavlin 20 $y_size = $h if $h > $y_size;
69    
70 dpavlin 21 push @page_imgs, $p_img;
71 dpavlin 20 }
72    
73     print "loaded $from_page-$to_page of $x_size*$y_size pixels\n";
74    
75     my $back_color = Imager::Color->new(255, 127, 127);
76    
77     my $img = Imager->new( xsize => $x_size, ysize => $y_size );
78     $img->box(filled=>1, color=>$back_color);
79    
80     my $x_pos = 0;
81    
82     foreach my $page_img ( @page_imgs ) {
83     $img->paste( left => $x_pos, top => 0, img => $page_img );
84     $x_pos += $page_img->getwidth();
85     }
86    
87     undef @page_imgs;
88    
89 dpavlin 17 my $tiles_x = int( $x_size / 256 );
90     my $tiles_y = int( $y_size / 256 );
91    
92 dpavlin 18 print "creating in $tiles_x*$tiles_y tiles\n";
93 dpavlin 17
94     for my $y ( 0 .. $tiles_y ) {
95     for my $x ( 0 .. $tiles_x ) {
96    
97     my $size = {
98     left => $x * 256,
99     bottom => $y_size - $y * 256,
100     width => $x == $tiles_x ? $x_size % 256 : 256,
101     height => $y == $tiles_y ? $y_size % 256 : 256,
102     };
103    
104     my $tile = $img->crop( %$size ) or die "can't crop $x*$y ",dump( $size );
105    
106     if ( ( $x == $tiles_x ) || ( $y == $tiles_y ) ) {
107     warn "## expand tile to full size\n";
108     my $t2 = Imager->new(xsize => 256, ysize => 256);
109 dpavlin 21 $t2->box(filled=>1, color=>$back_color);
110 dpavlin 17 $t2->paste(
111     top => 256 - $size->{height},
112     left => 0,
113     src => $tile,
114     );
115     $tile = $t2;
116     }
117    
118     # emulate TileCache disk layout
119 dpavlin 18 my $path = sprintf("%s/%02d/%03d/%03d/%03d/%03d/%03d/%03d.png",
120     $tiles_path,
121 dpavlin 17 $zoom - 1, # starts with 0
122     int( $x / 1000000 ),
123     int( $x / 1000 ) % 1000,
124     $x % 1000,
125     int( $y / 1000000 ),
126     int( $y / 1000 ) % 1000,
127     $y % 1000
128     );
129    
130     my $dir = $path;
131     $dir =~ s,/[^/]+$,,;
132     mkpath $dir unless -d $dir;
133    
134     $tile->write( file => $path ) or die $tile->errstr;
135    
136     undef $tile;
137    
138     print "# $x*$y -> $path\n";
139    
140     }
141     }
142 dpavlin 21
143     # break if zoom level over 300dpi
144     last if $dpi > 300;
145 dpavlin 17 }
146    
147    

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26