--- loncom/interface/printout.pl 2009/11/17 01:21:08 1.137.2.1 +++ loncom/interface/printout.pl 2010/08/26 08:32:58 1.146.4.1 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.137.2.1 2009/11/17 01:21:08 raeburn Exp $ +# $Id: printout.pl,v 1.146.4.1 2010/08/26 08:32:58 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -45,9 +45,14 @@ use strict; my $busy_wait_timeout = 30; + +my $debugging = 0; + sub debug { - my ($text) = @_; - print "$text
\n"; + if ($debugging) { + my ($text) = @_; + print "$text
\n"; + } } # Determine if a user is operating as a student for this course/domain. @@ -118,7 +123,7 @@ sub send_error_mail { if (&is_student()) { # build the subject and message body: - # print "sending message to course coordinators.
"; + &debug("sending message to course coordinators."); # Todo: Convert badurl into a url from file path: @@ -137,9 +142,9 @@ sub send_error_mail { } my (undef, %receivers) = &Apache::lonmsg::decide_receiver(undef, 0, 1,1,1); - # print "
sending...section: $env{'request.course.sec'}"; + &debug("sending...section: $env{'request.course.sec'}"); foreach my $dest (keys %receivers) { - # print "
dest is $dest"; + &debug("dest is $dest"); my @destinfo = split(/:/,$dest); my $user = $destinfo[0]; my $dom = $destinfo[1]; @@ -173,7 +178,17 @@ my %perlvar=%{&LONCAPA::Configuration::r &Apache::lonlocal::get_language_handle(); &Apache::loncommon::content_type(undef,'text/html'); $env{'request.noversionuri'} = '/cgi-bin/printout.pl'; -print(&Apache::loncommon::start_page('Creating PDF')); +# Breadcrumbs +#FIXME: Choose better/different breadcrumbs?!? Links? +my $brcrum = [{'href' => '', + 'text' => 'Helper'}, #FIXME: Different origin possible than print out helper? + {'href' => '', + 'text' => 'Preparing Printout'}, + {'href' => '', + 'text' => 'Creating PDF'}]; +print(&Apache::loncommon::start_page('Creating PDF', + undef, + {'bread_crumbs' => $brcrum,})); my $identifier = $ENV{'QUERY_STRING'}; my $texfile = $env{'cgi.'.$identifier.'.file'}; @@ -211,8 +226,11 @@ $duefile =~ s/^(.*_printout)_\d+_\d+_\d+ # it contains the names of the files that need to be converted, one per line. # +&debug("Figure file is $figfile"); + if (-e $figfile) { - # print "$figfile exists\n"; + &debug( "Figure file exists"); + &debug("$figfile exists"); my %done_conversion; my $temporary_file=IO::File->new($figfile) || die "Couldn't open fig file $figfile for reading: $!\n"; my @content_of_file = <$temporary_file>; @@ -223,6 +241,7 @@ if (-e $figfile) { print('
'); foreach my $not_eps (@content_of_file) { chomp($not_eps); + &debug( "Being asked to convert $not_eps"); if ($not_eps ne '') { $not_eps=~s|\/\.\/|\/|g; if (!$done_conversion{$not_eps}) { # Only convert multiple includes once. @@ -403,7 +422,8 @@ foreach $texfile (@texfile) { my $papera=$paper; if ($papera eq 'letter') {$papera='';} if ($papera ne '') {$papera='-t'.$papera;} - my $comma = "dvips $papera -Ppdf -G0 -o $new_name_file"; + my $extra_ps_header = $perlvar{'lonLib'} .'/includepsheader.ps'; + my $comma = "dvips $papera -h $extra_ps_header -Ppdf -G0 -o $new_name_file"; &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null", "for $status_statement now Converting to PS", \%prog_state,$new_name_file); @@ -459,12 +479,14 @@ foreach $texfile (@texfile) { $papera=~s/t/p/; if ($laystyle eq 'album' and $numberofcolumns eq '2') { $comma = "psnup $papera -2 -s1.0 $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); } elsif ($laystyle eq 'book' and $numberofcolumns eq '2') { - $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)"'; - &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null", + $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)" '.$new_name_file; + &debug("PSTOPS 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); } else { @@ -491,7 +513,7 @@ foreach $texfile (@texfile) { close(FFHS); $ps_file=$new_ps_file; } - &busy_wait_command("ps2pdf $ps_file $pdf_file 1>/dev/null 2>/dev/null", + &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); @@ -845,6 +867,7 @@ sub create_missing_fonts { # sub convert_figure { my ($not_eps) = @_; + &debug("in convert_figure"); my $status_statement='EPS picture for '.$not_eps; my $eps_f = $not_eps; @@ -888,7 +911,24 @@ sub convert_figure { &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, 'Converting to EPS '.$prettyname); } - system("convert $not_eps $eps_f"); + # + # If the file is a PDF, need to use pdftops to convert it to a ps file. + # otherwise use imagemagik: + # + if($not_eps =~/\.(pdf|PDF)$/) { + + # + # For whatever reason, pure postscript conversions have to be + # in the same dir as the base file: + # + $eps_f = &basename($eps_f); + $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f; + + &debug("Converting pdf $not_eps to postscript: $eps_f"); + system("pdftops $not_eps $eps_f"); + } else { + system("convert $not_eps $eps_f"); + } if (not -e $eps_f) { # converting an animated gif creates either: @@ -972,7 +1012,7 @@ sub analyze_logfile { if ($advanced_role) { #LaTeX failed to parse tex file - print "

".&mt('LaTeX could not successfully parse your tex file.')."

"; + print "

".&mt('LaTeX could not successfully parse your TeX file.')."

"; print &mt('It probably has errors in it.')."
"; if ($badtext) { print &mt('With very high probability this error occured in [_1].',$badtext) @@ -1025,13 +1065,15 @@ sub analyze_logfile { # $name_file - is the name of the LaTeX file. # $identifier - is the unique LaTeX identifier.l - print "
"; + print '

'; if ($badtext) { print &mt('There are errors in [_1].',$badtext); } else { print &mt('There are errors.'); } - print "
".&mt('These errors prevent this resource from printing correctly.'); + print '

' + .&mt('These errors prevent this resource from printing correctly.'); + my $tex_handle = IO::File->new($texfile); my @tex_contents = <$tex_handle>; &send_error_mail($identifier, $badresource, $body_log_file, \@tex_contents);