--- loncom/interface/printout.pl 2004/02/13 21:17:50 1.47 +++ loncom/interface/printout.pl 2004/12/20 21:15:20 1.71 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.47 2004/02/13 21:17:50 sakharuk Exp $ +# $Id: printout.pl,v 1.71 2004/12/20 21:15:20 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,14 +27,17 @@ # use lib '/home/httpd/lib/perl'; -use Time::Local; use LONCAPA::loncgi(); use File::Path; use IO::File; use Image::Magick; use Apache::lonhtmlcommon; +use Apache::lonnet(); +use Apache::loncommon; +use Apache::lonlocal; - +use strict; +$|=1; my %origENV=%ENV; if (! &LONCAPA::loncgi::check_cookie_and_load_env()) { print <\n"; + &Apache::lonlocal::get_language_handle(); + &Apache::loncommon::content_type(undef,'text/html'); + my $bodytag=&Apache::loncommon::bodytag('Creating PDF','',''); + print $bodytag; my $identifier = $ENV{'QUERY_STRING'}; my $texfile = $ENV{'cgi.'.$identifier.'.file'}; my $laystyle = $ENV{'cgi.'.$identifier.'.layout'}; my $numberofcolumns = $ENV{'cgi.'.$identifier.'.numcol'}; + my $paper = $ENV{'cgi.'.$identifier.'.paper'}; my $selectionmade = $ENV{'cgi.'.$identifier.'.selection'}; my $tableofcontents = $ENV{'cgi.'.$identifier.'tableofcontents'}; my $tableofindex = $ENV{'cgi.'.$identifier.'tableofindex'}; my $advans_role = $ENV{'cgi.'.$identifier.'role'}; - my $back_ref = $ENV{'cgi.'.$identifier.'backref'}; my $number_of_files = $ENV{'cgi.'.$identifier.'numberoffiles'}+1; my $student_names = $ENV{'cgi.'.$identifier.'studentnames'}; - my $backref = $ENV{'cgi.'.$identifier.'backref'}; + my $backref = &Apache::lonnet::unescape($ENV{'cgi.'.$identifier.'backref'}); + + my $adv = $ENV{'request.role.adv'}; + my @names_pack=(); if ($student_names=~/_END_/) { @names_pack=split(/_ENDPERSON_/,$student_names); @@ -80,24 +87,28 @@ END #do we have figures? if (-e $figfile) { my %done_conversion; - my $temporary_file=IO::File->new($figfile) || die "Couldn't open file for reading: $!\n"; + my $temporary_file=IO::File->new($figfile) || die "Couldn't open fig file $figfile for reading: $!\n"; my @content_of_file = <$temporary_file>; close $temporary_file; my $noteps; - my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Pictures CreationPrint Status','Pictires Status window',$#content_of_file); - foreach $not_eps (@content_of_file) { + my %prog_state; + if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Coverting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80'); } + foreach my $not_eps (@content_of_file) { + chomp($not_eps); if ($not_eps ne '') { my $status_statement='EPS picture for '.$not_eps; - &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'last PDF file '.$not_eps); $not_eps=~s|\/\.\/|\/|g; my $eps_f = $not_eps; $eps_f =~ s/\.[^.]*$/\.eps/i; if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) { $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/; $eps_f = '/home/httpd/prtspool/'.$eps_f; - } else { - $eps_f=~m/\/home\/httpd\/html\/res\/(.+)/; + } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\//) { + $eps_f=~m/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\/(.+)/; $eps_f = '/home/httpd/prtspool/'.$1; + } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\//) { + $eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/; + $eps_f = '/home/httpd/prtspool/'.$1.'/'.$2; } my $path=$eps_f; $path=~s/\/([^\/]+)\.eps$//; @@ -108,8 +119,13 @@ END if ( exists($done_conversion{$not_eps})) { next; } + if ($adv) { + my $prettyname=$not_eps; + $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|; + $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|; + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Converting to EPS '.$prettyname); } $done_conversion{$not_eps}=1; - $status = $image->Read($not_eps); + my $status = $image->Read($not_eps); if ($status) {print " $status ";} $image->Set(page => '+100+200'); $status = $image->Write($eps_f); @@ -125,54 +141,77 @@ END } } } - &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); + if ($adv) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } + unlink($figfile); } #print "$texfile\n"; #name of the tex file for debugging only my @texfile=($texfile); if ($number_of_files>1) { - for (my $i=1;$i<=$number_of_files-1;$i++) { + @texfile=(); + for (my $i=1;$i<=$number_of_files;$i++) { my $new_texfile=$texfile; - $new_texfile=~s/\.tex/_add$i\.tex/; + $new_texfile=~s/\.tex/_$i\.tex/; push @texfile,$new_texfile; } } + my $ind=-1; -my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files); +my %prog_state; +print "Return to last resource.

"; +if ($adv) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Print Status','Class Print Status',$number_of_files,'inline','80'); } +print "
"; foreach $texfile (@texfile) { - my $final_statement="Back to where you started

Link to your PDF document: "; - my $status_statement='PDF document for '; - if ($number_of_files>1) { - $ind++; - my @stud_info=split(/_END_/,$names_pack[$ind]); - my @tempo_array=split(/:/,$stud_info[0]); - $final_statement='Link to PDF document for '.$tempo_array[3].' '; - $status_statement.=$tempo_array[3]; - if ($#stud_info>0) { - @tempo_array=split(/:/,$stud_info[-1]); - $final_statement.='- '.$tempo_array[3].': '; - $status_statement.=' - '.$tempo_array[3]; - } + my $status_statement=''; + my $link_text='download PDF'; + $ind++; + my @stud_info=split(/_END_/,$names_pack[$ind]); + my @tempo_array=split(/:/,$stud_info[0]); + my $name; + if ($tempo_array[3]) { + $name=$tempo_array[3]; + } else { + $name=$tempo_array[0].'@'.$tempo_array[1]; } -&Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'last PDF file '.$status_statement); + $link_text=''.$name.''; + $status_statement.=$name; + if ($#stud_info>0) { + @tempo_array=split(/:/,$stud_info[-1]); + if ($tempo_array[3]) { + $name=$tempo_array[3]; + } else { + $name=$tempo_array[0].'@'.$tempo_array[1]; + } + $link_text.=' - '.$name.''; + $status_statement.=' - '.$name; + } + if ($adv) { &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Creating PDF for '.$status_statement); } if (-e $texfile) { $texfile =~ m/^(.*)\/([^\/]+)$/; my $name_file = $2; my $path_file = $1.'/'; chdir $path_file; - system("latex $name_file 1>/dev/null 2>/dev/null"); + my $dvi_file= $name_file; $dvi_file =~ s/\.tex/\.dvi/; + &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", + "for $status_statement now LaTeXing file", + \%prog_state,$dvi_file); if ($tableofcontents eq 'yes') { - system("latex $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", + "for $status_statement now LaTeXing file for table of contents", + \%prog_state,$dvi_file); } #to create table of contents my $idxname=$name_file; $idxname=~s/\.tex$/\.idx/; if ($tableofindex eq 'yes') { - system("makeindex $idxname"); - system("latex $name_file 1>/dev/null 2>/dev/null"); + &busy_wait_command("makeindex $idxname", + "making index file", + \%prog_state,$idxname); + &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", + "for $status_statement now LaTeXing file for index section", + \%prog_state,$dvi_file); } #to create index #Do we have a latex error in the log file? - my $logfilename = $texfile; - $logfilename =~ s/\.tex$/\.log/; - my $temporary_file=IO::File->new($logfilename) || die "Couldn't open file for reading: $!\n"; + my $logfilename = $texfile; $logfilename =~ s/\.tex$/\.log/; + my $temporary_file=IO::File->new($logfilename) || die "Couldn't open log file $logfilename for reading: $!\n"; my @content_of_file = <$temporary_file>; close $temporary_file; my $body_log_file = join(' ',@content_of_file); @@ -188,7 +227,7 @@ foreach $texfile (@texfile) { if ($whereitbegins!=-1 and $whereitends!=-1) { print "With very high probability this error occured in ".substr($body_log_file,$whereitbegins+26,$whereitends-$whereitbegins-26)."

"; } - print "Here are the error messages in the LaTeX log file

"; + print "Here are the error messages in the LaTeX log file

";
 	  my $sygnal = 0;
 	  for (my $i=0;$i<=$#content_of_file;$i++) {
 	      if ($content_of_file[$i]=~m/^Runaway argument?/ or $content_of_file[$i]=~m/^!/) {
@@ -198,16 +237,17 @@ foreach $texfile (@texfile) {
 		  $sygnal = 0;
 	      } 
 	      if ($sygnal) {
-		  print "$content_of_file[$i]
"; + print "$content_of_file[$i]"; } } + print "
\n"; if ($advans_role) { print "The link to "; $logfilename=~s/\/home\/httpd//; print "Your log file "; print "\n"; #link tooriginal LaTeX file (included according Michael Hamlin desire) - my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open file for reading: $!\n"; + my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n"; my @tex_content_of_file = <$tex_temporary_file>; close $tex_temporary_file; my $body_tex_file = join(' ',@tex_content_of_file); @@ -223,7 +263,7 @@ foreach $texfile (@texfile) { } elsif ($body_log_file=~m//) { my $whereitbegins = index $body_log_file,''; - print "You are running LaTeX in the batch mode."; + print "You are running LaTeX in batch mode."; while ($whereitbegins != -1) { my $tempobegin=$whereitbegins; $whereitbegins = rindex $body_log_file,'STAMPOFPASSEDRESOURCESTART',$whereitbegins; @@ -235,24 +275,39 @@ foreach $texfile (@texfile) { $name_file =~ s/\.tex/\.dvi/; my $new_name_file = $name_file; $new_name_file =~ s/\.dvi/\.ps/; - my $comma = "dvips -Ppdf -G0 -o $new_name_file"; - system("$comma $name_file 1>/dev/null 2>/dev/null"); + my $papera=$paper; + if ($papera eq 'letter') {$papera='';} + if ($papera ne '') {$papera='-t'.$papera;} + my $comma = "dvips $papera -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); if (-e $new_name_file) { print "

PDF output file (see link below)

\n"; $new_name_file =~ m/^(.*)\./; - my $tempo_file = $1.'temporar.ps'; - my $name_file = $1.'.pdf'; + my $ps_file = my $tempo_file = $1.'temporar.ps'; + my $pdf_file = $1.'.pdf'; if ($laystyle eq 'album' and $numberofcolumns eq '2') { $comma = "psnup -2 -s1.0 $new_name_file"; - system("$comma $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + &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 -pletter "2:0+1(0.48w,0)"'; - system("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + my $papera=$paper; + if ($papera eq 'letter') {$papera='';} + if ($papera ne '') {$papera='-p'.$papera;} + $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)"'; + &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null", + "for $status_statement now Modifying PS layout", + \%prog_state,$tempo_file); + } else { - system("ps2pdf $new_name_file $name_file 1>/dev/null 2>/dev/null"); + $ps_file=$new_name_file; } + &busy_wait_command("ps2pdf $ps_file $pdf_file 1>/dev/null 2>/dev/null", + "for $status_statement now Converting PS to PDF", + \%prog_state, $pdf_file); + my $texlog = $texfile; my $texaux = $texfile; my $texdvi = $texfile; @@ -264,7 +319,7 @@ foreach $texfile (@texfile) { my @garb = ($texaux,$texdvi,$texps); # unlink @garb; unlink $duefile; - print "Your PDF document"; + print "Your PDF document"; if ($advans_role) { print "

"; print "The link to "; @@ -272,7 +327,7 @@ foreach $texfile (@texfile) { print "Your log file "; print "\n"; #link tooriginal LaTeX file (included according Michael Hamlin desire) - my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open file for reading: $!\n"; + my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n"; my @tex_content_of_file = <$tex_temporary_file>; close $tex_temporary_file; my $body_tex_file = join(' ',@tex_content_of_file); @@ -291,24 +346,57 @@ foreach $texfile (@texfile) { $name_file =~ s/\.tex/\.dvi/; my $new_name_file = $name_file; $new_name_file =~ s/\.dvi/\.ps/; - my $comma = "dvips -Ppdf -G0 -o $new_name_file"; - system("$comma $name_file 1>/dev/null 2>/dev/null"); + my $papera=$paper; + if ($papera eq 'letter') {$papera='';} + if ($papera ne '') {$papera='-t'.$papera;} + my $comma = "dvips $papera -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); if (-e $new_name_file) { - print "
$final_statement "; + print "
"; $new_name_file =~ m/^(.*)\./; - my $tempo_file = $1.'temporar.ps'; - my $name_file = $1.'.pdf'; + my $ps_file = my $tempo_file = $1.'temporar.ps'; + my $pdf_file = $1.'.pdf'; if ($laystyle eq 'album' and $numberofcolumns eq '2') { $comma = "psnup -2 -s1.0 $new_name_file"; - system("$comma $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + &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 -pletter "2:0+1(0.48w,0)"'; - system("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null"); - system("ps2pdf $tempo_file $name_file 1>/dev/null 2>/dev/null"); + $papera=~s/t/p/; + $comma = 'pstops '.$papera.' "2:0+1(0.48w,0)"'; + &busy_wait_command("$comma $new_name_file $tempo_file 1>/dev/null 2>/dev/null", + "for $status_statement now Modifying PS layout", + \%prog_state,$tempo_file); } else { - system("ps2pdf $new_name_file $name_file 1>/dev/null 2>/dev/null"); - } + $ps_file=$new_name_file; + } + my $addtoPSfile={'legal'=>'<< /PageSize [612 1008] >> setpagedevice', + 'tabloid'=>'<< /PageSize [792 1224] >> setpagedevice', + 'executive'=>,'<< /PageSize [540 720] >> setpagedevice', + 'a2'=>'<< /PageSize [1195.02 1690.09] >> setpagedevice', + 'a3'=>'<< /PageSize [842 1195.02] >> setpagedevice', + '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; + } + &busy_wait_command("ps2pdf $ps_file $pdf_file 1>/dev/null 2>/dev/null", + "for $status_statement now Converting PS to PDF", + \%prog_state,$pdf_file); + my $texlog = $texfile; my $texaux = $texfile; my $texdvi = $texfile; @@ -320,10 +408,10 @@ foreach $texfile (@texfile) { my @garb = ($texlog,$texaux,$texdvi,$texps); # unlink @garb; unlink $duefile; - print "Your PDF document"; + print "$link_text - click here to download pdf"; print "\n"; } - } + } } else { print "LaTeX file $texfile was not created successfully"; } @@ -337,12 +425,43 @@ if ($number_of_files>1) { $file=~s/\.tex/.\pdf/; $statement.=' '.$file; } - system("$statement"); + print("
Zip Output:\n");
+    system($statement);
+    print("
"); $zipfile=~s/\/home\/httpd//; - print "
Your ZIP file is here"; + print "
A ZIP file of all the PDFs."; } -&Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); +if ($adv) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } +my $done; +sub REAPER { + $done=1; +} + +sub busy_wait_command { + my ($command,$message,$progress_win,$output_file)=@_; + + $SIG{CHLD} = \&REAPER; + $done=0; + my $pid=open(CMD,"$command |"); + if ($adv) { + &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message); + } + while(!$done) { + sleep 1; + my $extra_msg; + if ($output_file) { + my $size=(stat($output_file))[7]; + $extra_msg=", $size bytes generated"; + } + if ($adv) { + &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win, + $message.$extra_msg); + } + } + $SIG{CHLD}='IGNORE'; + close(CMD); +}