--- loncom/interface/printout.pl 2006/10/30 11:40:49 1.111 +++ loncom/interface/printout.pl 2007/09/21 20:56:30 1.126 @@ -1,6 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # +# $Id: printout.pl,v 1.126 2007/09/21 20:56:30 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,6 +39,7 @@ use Apache::loncommon(); use Apache::lonlocal; use Apache::lonmsg(); use LONCAPA::Enrollment; +use LONCAPA::Configuration; use strict; @@ -127,8 +129,8 @@ sub send_error_mail { foreach my $line (@$texfile) { $message .= "$line\n"; } - my (undef, %receivers) = &Apache::lonfeedback::decide_receiver(undef, 0, - 1,1,1); + my (undef, %receivers) = &Apache::lonmsg::decide_receiver(undef, 0, + 1,1,1); # print "
sending...section: $env{'request.course.sec'}"; foreach my $dest (keys %receivers) { # print "
dest is $dest"; @@ -160,6 +162,8 @@ Your cookie information is incorrect. END return; } + +my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')}; &Apache::lonlocal::get_language_handle(); &Apache::loncommon::content_type(undef,'text/html'); @@ -187,9 +191,9 @@ END print "Return to last resource.

"; my $figfile = $texfile; - $figfile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.dat/; + $figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/; my $duefile = $texfile; - $duefile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.due/; + $duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/; #do we have figures? # print "Figure file: $figfile\n"; if (-e $figfile) { @@ -205,7 +209,7 @@ print "ReturnReturnReturnReturn\n"; # print "
Advanced role
"; print "The link to "; - $logfilename=~s/\/home\/httpd//; + $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; print "
Your log file "; print "\n"; #link tooriginal LaTeX file (included according Michael Hamlin desire) @@ -449,7 +457,7 @@ foreach $texfile (@texfile) { print $tex_temporary_file 'LOGFILE
'.$body_tex_file.'
'."\n"; print "

"; print "The link to "; - $texfile=~s/\/home\/httpd//; + $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; print "Your original LaTeX file "; print "\n"; my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing"); @@ -515,7 +523,7 @@ foreach $texfile (@texfile) { if ($tableofindex eq 'yes') { my $idxname = $latex_file; $idxname =~ s/\.tex$/\.idx/; - &busy_wait_command("makindex $idxname", + &busy_wait_command("makeindex $idxname", "Re-creating index file", \%prog_state, $idxname); &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", @@ -523,9 +531,44 @@ foreach $texfile (@texfile) { \%prog_state, $dvi_file); } - &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null", + &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", "for $status_statement dvips to repaginate", \%prog_state, $new_name_file); + # + # One last little hinky kinky thing. + # It's just possible that some fonts could not be maded + # at the resolution of the pdf print driver. + # In that case a file called missfont.log will have been + # created that will contain the commands that were attempted + # to create the missing fonts. If we basically + # take all the 8000 strings in that file, and + # replace them with 600 (the ljfour resolution) + # run the commands in that file and redvips, + # we'll be able to print the missing glyphs at 600dpi. + # + # Supposedly it is possible to tune TeX/Metafont to do this + # right but I failed to get that to work when following the + # docs at the tug site, hence this rather kludgey fix. + # + # We make the (I think) reasonable assumption that + # missing glyphs won't change the pagination and I think + # this is true because TeX/dvips will leave a space + # instead of these glyphs based on the font metrics + # (fancy way to say there will be a blank the size of the missing + # glyphs). + # + my $print_directory = dirname($name_file); + my $missfonts_file = $print_directory."/missfont.log"; + #print("
Missing fonts file is: $missfonts_file"); + if (-e $missfonts_file) { + #print("
Missing fonts file exists\n"); + &create_missing_fonts($missfonts_file,\%prog_state); + &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", + "for $status_statement dvips generated missing fonts", + \%prog_state, $new_name_file); + } + + # print "\n

PDF output file (see link below)

\n"; $new_name_file =~ m/^(.*)\./; my $ps_file = my $tempo_file = $1.'temporar.ps'; @@ -564,13 +607,15 @@ foreach $texfile (@texfile) { $texps =~ s/\.tex/\.ps/; my @garb = ($texaux,$texdvi,$texps); # unlink @garb; - unlink $duefile; + unlink($duefile); print "Your PDF document"; + unlink($missfonts_file); + } if ($advanced_role) { print "

"; print "The link to "; - $logfilename=~s/\/home\/httpd//; + $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; print "Your log file "; print "\n"; #link tooriginal LaTeX file (included according Michael Hamlin desire) @@ -583,10 +628,11 @@ foreach $texfile (@texfile) { print $tex_temporary_file 'LOGFILE
'.$body_tex_file.'
'."\n"; print "

"; print "The link to "; - $texfile=~s/\/home\/httpd//; + $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; print "Your original LaTeX file "; print "\n"; } + } else { #LaTeX successfully parsed tex file $name_file =~ s/\.tex/\.dvi/; @@ -599,6 +645,39 @@ foreach $texfile (@texfile) { &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", "for $status_statement now Converting to PS", \%prog_state,$new_name_file); + # + # One last little hinky kinky thing. + # It's just possible that some fonts could not be maded + # at the resolution of the pdf print driver. + # In that case a file called missfont.log will have been + # created that will contain the commands that were attempted + # to create the missing fonts. If we basically + # take all the 8000 strings in that file, and + # replace them with 600 (the ljfour resolution) + # run the commands in that file and redvips, + # we'll be able to print the missing glyphs at 600dpi. + # + # Supposedly it is possible to tune TeX/Metafont to do this + # right but I failed to get that to work when following the + # docs at the tug site, hence this rather kludgey fix. + # + # We make the (I think) reasonable assumption that + # missing glyphs won't change the pagination and I think + # this is true because TeX/dvips will leave a space + # instead of these glyphs based on the font metrics + # (fancy way to say there will be a blank the size of the missing + # glyphs). + # + my $print_directory = dirname($name_file); + my $missfonts_file = $print_directory."/missfont.log"; + #print("
Missing fonts file is: $missfonts_file"); + if (-e $missfonts_file) { + #print("
Missing fonts file exists\n"); + &create_missing_fonts($missfonts_file,\%prog_state); + &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", + "for $status_statement dvips generated missing fonts", + \%prog_state, $new_name_file); + } if (-e $new_name_file) { my $latex_file = $name_file; $latex_file =~ s/\.dvi/\.tex/; @@ -627,6 +706,7 @@ foreach $texfile (@texfile) { &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", "for $status_statement dvips to repaginate", \%prog_state, $new_name_file); + print "
"; $new_name_file =~ m/^(.*)\./; my $ps_file = my $tempo_file = $1.'temporar.ps'; @@ -680,10 +760,12 @@ foreach $texfile (@texfile) { $texps =~ s/\.tex/\.ps/; my @garb = ($texlog,$texaux,$texdvi,$texps); # unlink @garb; - unlink $duefile; + unlink($duefile); print "$link_text - click here to download pdf"; print "\n"; } + unlink($missfonts_file); + } } else { print "LaTeX file $texfile was not created successfully"; @@ -701,7 +783,7 @@ if ($number_of_files>1) { print("
Zip Output:\n");
     system($statement);
     print("
"); - $zipfile=~s/\/home\/httpd//; + $zipfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; print "
A ZIP file of all the PDFs."; } if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } @@ -787,7 +869,7 @@ sub repaginate { # if ($line =~ /^%%Page:/) { - my @pageinfo = split(/ /, $line); + my @pageinfo = split(/\s+/, $line); if ($page_number < $pageinfo[1]) { $page_number = $pageinfo[1]; } elsif ($pageinfo[2] ne 1) { @@ -869,3 +951,57 @@ sub repaginate { } +# +# Create missing fonts given a latex missfonts.log file. +# This file will have lines like: +# +# mktexpk --mfmode ljfour --bdpi 8000 --mag 1+0/8000 --dpi 8000 tcrm0500 +# +# We want to execute those lines with the 8000's changed to 600's +# in order to match the resolution of the ljfour printer. +# Of course if some wiseguy has changed the default printer from ljfour +# in the dvips's config.ps file that will break so we'll also +# ensure that --mfmode is ljfour. +# +sub create_missing_fonts { + my ($fontfile, $state) = @_; + + # Open and read in the font file..we'll read it into the array + # font_commands. + # + open(my $font_handle, $fontfile); + my @font_commands = <$font_handle>; + + # make the list contain each command only once + my %uniq; + @font_commands = map { $uniq{$_}++ == 0 ? $_ : () } @font_commands; + + # Now process each command replacing the appropriate 8000's with + # 600's ensuring that font names with 8000's in them are not corrupted. + # and if the --mfmode is not ljfour we turn it into ljfour. + # Then we execute the command. + # + + foreach my $command (@font_commands) { + #print("
Raw command: $command"); + $command =~ s/ 8000/ 600/g; # dpi directives. + $command =~ s/\/8000/\/600/g; # mag directives. + #print("
After dpi replacements: $command"); + + my @cmdarray = split(/ /,$command); + for (my $i =0; $i < scalar(@cmdarray); $i++) { + if ($cmdarray[$i] eq '--mfmode') { + $cmdarray[$i+1] = "ljfour"; + } + } + #print("
before reassembly : (@cmdarray)"); + $command = join(" ", (@cmdarray)); + + #print("
Creating fonts via command: $command"); + &busy_wait_command("$command 1>/dev/null 2>/dev/null", + "Creating missing font", + $state); + + } + +}