--- loncom/interface/printout.pl 2006/04/24 21:31:03 1.94.2.1
+++ loncom/interface/printout.pl 2006/06/20 09:39:47 1.104
@@ -25,20 +25,17 @@
# http://www.lon-capa.org/
#
-BEGIN {
- eval "use Apache2::compat();";
-};
use lib '/home/httpd/lib/perl';
use LONCAPA::loncgi;
use File::Path;
use File::Basename;
use IO::File;
use Image::Magick;
-use Apache::lonhtmlcommon;
+use Apache::lonhtmlcommon();
use Apache::lonnet;
-use Apache::loncommon;
+use Apache::loncommon();
use Apache::lonlocal;
-use Apache::lonmsg;
+use Apache::lonmsg();
use LONCAPA::Enrollment;
use strict;
@@ -164,8 +161,8 @@ END
}
&Apache::lonlocal::get_language_handle();
&Apache::loncommon::content_type(undef,'text/html');
- my $bodytag=&Apache::loncommon::bodytag('Creating PDF','','');
- print $bodytag;
+
+ print(&Apache::loncommon::start_page('Creating PDF'));
my $identifier = $ENV{'QUERY_STRING'};
my $texfile = $env{'cgi.'.$identifier.'.file'};
@@ -237,7 +234,8 @@ print "Return $eps_f"; # Debugging
@@ -358,7 +356,10 @@ foreach $texfile (@texfile) {
\%prog_state,$dvi_file);
if ($tableofcontents eq 'yes') {
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
- "for $status_statement now LaTeXing file for table of contents",
+ "for $status_statement First LaTeX of file for table of contents",
+ \%prog_state,$dvi_file);
+ &busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null",
+ "for $status_statement Second LaTeX of file for table of contents",
\%prog_state,$dvi_file);
} #to create table of contents
my $idxname=$name_file;
@@ -476,7 +477,27 @@ foreach $texfile (@texfile) {
"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";
+ my $latex_file = $name_file;
+ $latex_file =~ s/\.dvi/\.tex/;
+ &repaginate($new_name_file, $latex_file, $numberofcolumns);
+ #
+ # Now have to re-latex, re dvips again to
+ # get the repaginated postscript.
+ #
+ &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+ "for $status_statement first latex to repaginate",
+ \%prog_state, $name_file);
+ &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+ "for $status_statement second latex to repaginate",
+ \%prog_state, $name_file);
+ &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+ "for $status_statement third latex to repaginate",
+ \%prog_state, $name_file);
+ &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
+ "for $status_statement dvips to repaginate",
+ \%prog_state, $new_name_file);
+
+ print "\nPDF output file (see link below)
\n";
$new_name_file =~ m/^(.*)\./;
my $ps_file = my $tempo_file = $1.'temporar.ps';
my $pdf_file = $1.'.pdf';
@@ -550,6 +571,21 @@ foreach $texfile (@texfile) {
"for $status_statement now Converting to PS",
\%prog_state,$new_name_file);
if (-e $new_name_file) {
+ my $latex_file = $name_file;
+ $latex_file =~ s/\.dvi/\.tex/;
+ &repaginate($new_name_file, $latex_file, $numberofcolumns);
+ &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+ "for $status_statement first latex to repaginate",
+ \%prog_state, $name_file);
+ &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+ "for $status_statement second latex to repaginate",
+ \%prog_state, $name_file);
+ &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+ "for $status_statement third latex to repaginate",
+ \%prog_state, $name_file);
+ &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';
@@ -628,8 +664,9 @@ if ($number_of_files>1) {
print "
A ZIP file of all the PDFs.";
}
if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }
-
+print(&Apache::loncommon::end_page());
my $done;
+
sub REAPER {
$done=1;
}
@@ -639,6 +676,7 @@ sub busy_wait_command {
$SIG{CHLD} = \&REAPER;
$done=0;
+ print("
Doing : $command"); my $pid=open(CMD,"$command |"); if ($advanced_role) { &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message); @@ -658,7 +696,134 @@ sub busy_wait_command { $SIG{CHLD}='IGNORE'; close(CMD); } + print("
End
"); + +# Repagninate +# What we need to do: +# - Count the number of pages in each student. +# - Rewrite the latex file replacing the \specials that +# mark the end of student with an appropriate number of newlines. +# parameters: +# psfile - Postscript filename +# latexfile - LaTeX filename +# columns - number of columns. +sub repaginate { + + # We will try to do this in 2 passes through the postscript since + # the postscript is potentially large, to do 2 passes, the first pass + # must be able to calculate the total number of document pages so that + # at the beginning of the second pass we already know how to replace + # %%Pages: + + # Figure out + # 1. Number of pages in the document + # 2. Maximum number of pages in a student + # 3. Number of pages in each student. + + my ($postscript_filename, $latex_filename, $num_columns) = @_; + open(PSFILE, "<$postscript_filename"); + my $line; + my $total_pages; # Total pages in document. + my $seen_pages = 0; # There are several %%Pages only the first is useful + my $student_number = 0; # Index of student we're working on. + my @pages_in_student; # For each student his/her initial page count. + my $max_pages = 0; # Pages in 'longest' student. + my $page_number = 0; + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + "Counting pages for student: ".$student_number+1); + + while ($line =