--- loncom/interface/printout.pl 2024/07/11 12:15:16 1.170 +++ loncom/interface/printout.pl 2024/11/09 16:08:15 1.177 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.170 2024/07/11 12:15:16 raeburn Exp $ +# $Id: printout.pl,v 1.177 2024/11/09 16:08:15 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -161,6 +161,36 @@ sub send_error_mail { } } +sub get_pstops_offsets { + my ($paper) = @_; + my ($origwidth,$origheight,$origunits,$ptype,$xoff,$yoffl,$yoffr); + $ptype = "-p$paper"; + if ($paper eq 'letter') { + $origwidth = 11.0; + $origheight = 8.5; + $origunits = 'in'; + $xoff = $origheight - 0.9; + $yoffl = 0.0; + } elsif ($paper eq 'legal') { + $ptype = ''; + $origwidth = 14.0; + $origheight = 8.5; + $origunits = 'in'; + $xoff = $origheight - 3.0; + $yoffl = 0.5; + } elsif ($paper eq 'a4') { + $origwidth = 29.7; + $origheight = 21.0; + $origunits = 'cm'; + $xoff = $origheight; + $yoffl = 0.7; + } + if (($origwidth ne '') && ($yoffl ne '')) { + $yoffr = $origwidth/2 + $yoffl; + } + return ($ptype,$xoff,$yoffl,$yoffr,$origunits); +} + $|=1; if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { print </dev/null 2>/dev/null", @@ -507,7 +536,9 @@ foreach $texfile (@texfile) { $new_name_file =~ m/^(.*)\./; my $ps_file = my $tempo_file = $1.'temporar.ps'; my $pdf_file = $1.'.pdf'; - $papera=~s/t/p/; + unless ($paper eq '') { + $papera='-p'.$paper; + } #---- # The code below uses fixps to make pdf include in sequences work. # @@ -544,7 +575,19 @@ foreach $texfile (@texfile) { last if ($device ne ''); } if ($device ne '') { - $comma = "gs -sDEVICE=$device -dLanguageLevel=1.5 -permit-file-read=* "; + my ($major,$minor); + if (open(PIPE,"gs -v |grep 'GPL Ghostscript' 2>&1 |")) { + my $info = ; + close(PIPE); + chomp($info); + if ($info =~ /Ghostscript\s+(\d+)\.(\d+)/) { + ($major,$minor) = ($1,$2); + } + } + $comma = "gs -sDEVICE=$device -dLanguageLevel=1.5 "; + if (($major > 9) || (($major == 9) && ($minor >= 50))) { + $comma .= '--permit-file-read=* '; + } &busy_wait_command("$comma -o $tempo_file $new_name_file 2>/dev/null 1>/dev/null", "for $status_statement now validating PS", \%prog_state, $tempo_file); @@ -557,8 +600,36 @@ foreach $texfile (@texfile) { } } if ($laystyle eq 'album' and $numberofcolumns eq '2') { - $comma = "psnup $papera -2 -s1.0 $new_name_file"; - &debug("PSNUP command: $comma"); + my $canscale; + if (open(PIPE,"psnup --version 2>&1 |")) { + while () { + chomp(); + next if (/pstops:\s+invalid\s+option/); + if (/^psnup\s+release\s+(\d+)\s+patchlevel\s+(\d+)/) { + if (($1 == 1) && ($2 < 90)) { + $canscale = 1; + } + last; + } elsif (/^psnup\s+(\d+)\.(\d+)/) { + if (($1 == 1) && ($2 < 90)) { + $canscale = 1; + } + last; + } + } + close(PIPE); + } + if ($canscale) { + $comma = "psnup $papera -2 -s1.0 $new_name_file"; + &debug("PSNUP command: $comma"); + } elsif (($paper eq 'letter') || ($paper eq 'legal') || ($paper eq 'a4')) { + my ($ptype,$xoff,$yoffl,$yoffr,$units) = &get_pstops_offsets($paper); + $comma = "pstops $ptype '2:0L\@1.0($xoff$units,$yoffl$units)+1L\@1.0($xoff$units,$yoffr$units)' $new_name_file"; + &debug("PSTOPS command: $comma"); + } else { + $comma = "psnup $papera -2 $new_name_file"; + &debug("PSNUP command: $comma"); + } &busy_wait_command("$comma $tempo_file 1>/dev/null 2>/dev/null", "for $status_statement now Modifying PS layout", \%prog_state,$tempo_file); @@ -571,7 +642,8 @@ foreach $texfile (@texfile) { } else { $ps_file=$new_name_file; } - my $addtoPSfile={'legal'=>'<< /PageSize [612 1008] >> setpagedevice', + my $addtoPSfile={'letter'=>'<< /PageSize [612 792] >> setpagedevice', + 'legal'=>'<< /PageSize [612 1008] >> setpagedevice', 'tabloid'=>'<< /PageSize [792 1224] >> setpagedevice', 'executive'=>,'<< /PageSize [540 720] >> setpagedevice', 'a2'=>'<< /PageSize [1195.02 1690.09] >> setpagedevice', @@ -579,19 +651,17 @@ foreach $texfile (@texfile) { 'a4'=>'<< /PageSize [595.2 842] >> setpagedevice', 'a5'=>'<< /PageSize [421.1 595.2] >> setpagedevice', 'a6'=>'<< /PageSize [298.75 421.1] >> setpagedevice', - }; - if ($paper ne 'letter') { - open(FFH,'<',$ps_file) || die "Couldn't open ps file $ps_file for reading: $!\n"; - my $new_ps_file='new'.$ps_file; - open(FFHS,'>',$new_ps_file) || die "Couldn't open new ps file $new_ps_file for reading: $!\n"; - print FFHS $addtoPSfile->{$paper}."\n"; - while () { - print FFHS $_; - } - close(FFH); - close(FFHS); - $ps_file=$new_ps_file; + }; + open(FFH,'<',$ps_file) || die "Couldn't open ps file $ps_file for reading: $!\n"; + my $new_ps_file='new'.$ps_file; + open(FFHS,'>',$new_ps_file) || die "Couldn't open new ps file $new_ps_file for reading: $!\n"; + print FFHS $addtoPSfile->{$paper}."\n"; + while () { + print FFHS $_; } + close(FFH); + close(FFHS); + $ps_file=$new_ps_file; &busy_wait_command("ps2pdf13 $ps_file $pdf_file 1>/dev/null 2>/dev/null", "for $status_statement now Converting PS to PDF", \%prog_state,$pdf_file);