package PPD::Paper; use PPD; sub mm($) { my ($mm) = @_; return int($mm/25.4*72 + 0.5); } # Media parameters: # Name human-readable name # W width in PS points # H height in PS points my %media = ( 'A0' => { Name => 'A0', W => mm(841), H => mm(1189) }, 'A1' => { Name => 'A1', W => mm(594), H => mm(841) }, 'A2' => { Name => 'A2', W => mm(420), H => mm(594) }, 'A3' => { Name => 'A3', W => mm(297), H => mm(420) }, 'A4' => { Name => 'A4', W => mm(210), H => mm(297) }, 'A5' => { Name => 'A5', W => mm(148), H => mm(210) }, 'A6' => { Name => 'A6', W => mm(105), H => mm(148) }, 'B0' => { Name => 'B0', W => mm(1000), H => mm(1414) }, 'B1' => { Name => 'B1', W => mm(707), H => mm(1000) }, 'B2' => { Name => 'B2', W => mm(500), H => mm(707) }, 'B3' => { Name => 'B3', W => mm(353), H => mm(500) }, 'B4' => { Name => 'B4', W => mm(250), H => mm(353) }, 'B5' => { Name => 'B5', W => mm(176), H => mm(250) }, 'B6' => { Name => 'B6', W => mm(125), H => mm(176) }, 'C0' => { Name => 'C0', W => mm(917), H => mm(1297) }, 'C1' => { Name => 'C1', W => mm(648), H => mm(917) }, 'C2' => { Name => 'C2', W => mm(458), H => mm(648) }, 'C3' => { Name => 'C3', W => mm(324), H => mm(458) }, 'C4' => { Name => 'C4', W => mm(229), H => mm(354) }, 'C5' => { Name => 'C5', W => mm(162), H => mm(229) }, 'C6' => { Name => 'C6', W => mm(114), H => mm(162) }, 'C7' => { Name => 'C7', W => mm(81), H => mm(114) }, 'C8' => { Name => 'C8', W => mm(57), H => mm(81) }, 'Letter' => { Name => 'US Letter', W => 612, H => 792 }, 'Legal' => { Name => 'US Legal', W => 612, H => 1008 }, ); # add_papers({ # MinW => pt, # Minimum paper width (default: 0) # MaxW => pt, # Maximum paper width (default: 595) # MinH => pt, # Minimum paper height (default: 0) # MaxH => pt, # Maximum paper height (default: 842) # MarginH => pt, # Horizontal margin (default: 0) # MarginV => pt, # Vertical margin (default: 0) # DefPaper => paper, # Default paper type (default: A4) # PSPageSize => PS, # PS code for setting PageSize (subroutine called with ref to media object) # PSPageRegion => PS, # The same for PageRegion (default: use PSPageSize) # }) sub add_papers($) { # Scan available paper formats my ($o) = @_; my $minw = $o->{MinW} // 0; my $maxw = $o->{MaxW} // 595; my $minh = $o->{MinH} // 0; my $maxh = $o->{MaxH} // 842; my $margh = $o->{MarginH} // 0; my $margv = $o->{MarginV} // 0; my %real_media = (); for my $p (keys %media) { my $m = $media{$p}; $m->{W} >= $minw && $m->{W} <= $maxw && $m->{H} >= $minh && $m->{H} <= $maxh or next; $real_media{$p} = $m; $m->{Key} = $p; } $o->{DefPaper} //= 'A4'; define_ui_group('Media', { Name => 'Media settings' }); option({ Key => 'PageSize', Name => 'Page Size', Choice => 'PickAny', Priority => 30, Values => [ map { my $k = $_; my $m = $real_media{$_}; { Key => $k, Name => ($m->{Name} // $k), PS => &{$o->{PSPageSize}}($m), } } sort keys %real_media ], Default => $o->{DefPaper}, }); option({ Key => 'PageRegion', Name => 'Page Region', Choice => 'PickAny', Priority => 40, Values => [ map { my $k = $_; my $m = $real_media{$_}; { Key => $k, Name => ($m->{Name} // $k), PS => &{$o->{PSPageRegion} // $o->{PSPageSize}}($m), } } sort keys %real_media ], Default => $o->{DefPaper}, }); option({ Key => 'ImageableArea', Values => [ map { my $k = $_; my $m = $real_media{$_}; { Key => $k, Name => ($m->{Name} // $k), PS => sprintf("%d %d %d %d", $margh, $margv, $m->{W} - $margh, $m->{H} - $margv), } } sort keys %real_media ], Default => $o->{DefPaper}, }); option({ Key => 'PaperDimension', Values => [ map { my $k = $_; my $m = $real_media{$_}; { Key => $k, Name => ($m->{Name} // $k), PS => sprintf("%d %d", $m->{W}, $m->{H}), } } sort keys %real_media ], Default => $o->{DefPaper}, }); } 42;