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 |
|
|
my $limit = ''; |
16 |
|
|
$limit = '-f 1 -l 1'; |
17 |
|
|
|
18 |
|
|
foreach my $zoom ( 1 .. 12 ) { |
19 |
|
|
|
20 |
|
|
my $dpi = $zoom * 25; |
21 |
|
|
|
22 |
|
|
my $ppm = "tmp-$dpi"; |
23 |
|
|
my $tmp = "$ppm-000001.ppm"; |
24 |
|
|
|
25 |
|
|
print "rendering pdf $pdf in $dpi dpi to $tmp\n"; |
26 |
|
|
|
27 |
|
|
system "pdftoppm $limit -r $dpi -aa yes -aaVector yes $pdf $ppm"; |
28 |
|
|
|
29 |
|
|
die "can't render" unless -f $tmp; |
30 |
|
|
|
31 |
|
|
my $img = Imager->new; |
32 |
|
|
$img->read(file=>$tmp) or die "Can't load $tmp: ", $img->errstr; |
33 |
|
|
|
34 |
|
|
my $x_size = $img->getwidth(); |
35 |
|
|
my $y_size = $img->getheight(); |
36 |
|
|
|
37 |
|
|
print "loaded $tmp $x_size*$y_size pixels\n"; |
38 |
|
|
|
39 |
|
|
my $tiles_x = int( $x_size / 256 ); |
40 |
|
|
my $tiles_y = int( $y_size / 256 ); |
41 |
|
|
|
42 |
|
|
print "creating in $tiles_x*$tiles_y tiles...\n"; |
43 |
|
|
|
44 |
|
|
for my $y ( 0 .. $tiles_y ) { |
45 |
|
|
for my $x ( 0 .. $tiles_x ) { |
46 |
|
|
|
47 |
|
|
my $size = { |
48 |
|
|
left => $x * 256, |
49 |
|
|
bottom => $y_size - $y * 256, |
50 |
|
|
width => $x == $tiles_x ? $x_size % 256 : 256, |
51 |
|
|
height => $y == $tiles_y ? $y_size % 256 : 256, |
52 |
|
|
}; |
53 |
|
|
|
54 |
|
|
my $tile = $img->crop( %$size ) or die "can't crop $x*$y ",dump( $size ); |
55 |
|
|
|
56 |
|
|
if ( ( $x == $tiles_x ) || ( $y == $tiles_y ) ) { |
57 |
|
|
warn "## expand tile to full size\n"; |
58 |
|
|
my $t2 = Imager->new(xsize => 256, ysize => 256); |
59 |
|
|
$t2->paste( |
60 |
|
|
top => 256 - $size->{height}, |
61 |
|
|
left => 0, |
62 |
|
|
src => $tile, |
63 |
|
|
); |
64 |
|
|
$tile = $t2; |
65 |
|
|
} |
66 |
|
|
|
67 |
|
|
# emulate TileCache disk layout |
68 |
|
|
my $path = sprintf("tiles/basic/%02d/%03d/%03d/%03d/%03d/%03d/%03d.png", |
69 |
|
|
$zoom - 1, # starts with 0 |
70 |
|
|
int( $x / 1000000 ), |
71 |
|
|
int( $x / 1000 ) % 1000, |
72 |
|
|
$x % 1000, |
73 |
|
|
int( $y / 1000000 ), |
74 |
|
|
int( $y / 1000 ) % 1000, |
75 |
|
|
$y % 1000 |
76 |
|
|
); |
77 |
|
|
|
78 |
|
|
my $dir = $path; |
79 |
|
|
$dir =~ s,/[^/]+$,,; |
80 |
|
|
mkpath $dir unless -d $dir; |
81 |
|
|
|
82 |
|
|
$tile->write( file => $path ) or die $tile->errstr; |
83 |
|
|
|
84 |
|
|
undef $tile; |
85 |
|
|
|
86 |
|
|
print "# $x*$y -> $path\n"; |
87 |
|
|
|
88 |
|
|
} |
89 |
|
|
} |
90 |
|
|
} |
91 |
|
|
|
92 |
|
|
|