--- loncom/interface/printout.pl 2006/06/12 11:21:07 1.100 +++ loncom/interface/printout.pl 2006/11/13 11:18:46 1.113 @@ -29,6 +29,7 @@ use lib '/home/httpd/lib/perl'; use LONCAPA::loncgi; use File::Path; use File::Basename; +use File::Copy; use IO::File; use Image::Magick; use Apache::lonhtmlcommon(); @@ -161,7 +162,8 @@ END } &Apache::lonlocal::get_language_handle(); &Apache::loncommon::content_type(undef,'text/html'); - print(&Apache::loncommon::start_page('Creating PDF')); + + print(&Apache::loncommon::start_page('Creating PDF')); my $identifier = $ENV{'QUERY_STRING'}; my $texfile = $env{'cgi.'.$identifier.'.file'}; @@ -203,13 +205,12 @@ print "ReturnReturn $eps_f"; # Debugging - system("convert $not_eps $eps_f"); - # check is eps exist in prtspool - if (not -e $eps_f) { - # converting an animated gif creates either: - # anim.gif.eps.0 - # or - # anim.gif-0.eps - for (my $i=0;$i<10000;$i++) { - if (-e $eps_f.'.'.$i) { - rename($eps_f.'.'.$i, $eps_f); - last; - } - my $anim_eps = $eps_f; - $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i; - if (-e $anim_eps) { - rename($anim_eps, $eps_f); - last; + # + # If the file is already an .eps or .ps file, + # We really just need to copy it from where it was to prtspool + # but with the spaces substituted to _'s. + # + my ($nsname,$path, $sext) = fileparse($eps_f, qr/\.(ps|eps)/i); + if ($sext =~/ps$/i) { + # print "$not_eps is a postscript file. copy to $path\n"; + File::Path::mkpath($path,0,0777); + print "Made path: $path"; +# $not_eps =~ s/^\s+//; +# $not_eps =~ s/\s+$//; +# $not_eps =~ s/ /\__/g; + print "Copying $not_eps to $eps_f\n"; + copy("$not_eps", "$eps_f"); + # print "Copy complete\n"; + } else { + + $eps_f .= '.eps'; # Just append the eps ext. + my $path=$eps_f; + $path =~ s/\/([^\/]+)\.eps$//; + # print "Final file path: $path "; # Debugging + File::Path::mkpath($path,0,0777); + $not_eps =~ s/^\s+//; + $not_eps =~ s/\s+$//; + $not_eps =~ s/ /\\ /g; + if ( exists($done_conversion{$not_eps})) { next; } + if ($advanced_role) { + 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; + # print "Converting $not_eps -> $eps_f"; # Debugging + system("convert $not_eps $eps_f"); + # check is eps exist in prtspool + if (not -e $eps_f) { + # converting an animated gif creates either: + # anim.gif.eps.0 + # or + # anim.gif-0.eps + for (my $i=0;$i<10000;$i++) { + if (-e $eps_f.'.'.$i) { + rename($eps_f.'.'.$i, $eps_f); + last; + } + my $anim_eps = $eps_f; + $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i; + if (-e $anim_eps) { + rename($anim_eps, $eps_f); + last; + } } } - } - # imagemagick 6.2.0-6.2.7 fails to properly handle - # convert anim.gif anim.gif.eps - # it creates anim.eps instead. - if (not -e $eps_f) { - my $eps_f2 = $eps_f; - $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i; - if(-e $eps_f2) { - rename($eps_f2,$eps_f); + + # imagemagick 6.2.0-6.2.7 fails to properly handle + # convert anim.gif anim.gif.eps + # it creates anim.eps instead. + if (not -e $eps_f) { + my $eps_f2 = $eps_f; + $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i; + if(-e $eps_f2) { + rename($eps_f2,$eps_f); + } } } @@ -475,8 +498,39 @@ foreach $texfile (@texfile) { "for $status_statement now Converting to PS", \%prog_state,$new_name_file); if (-e $new_name_file) { - &repaginate_postscript($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); + if ($tableofcontents eq 'yes') { + &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); + } + if ($tableofindex eq 'yes') { + my $idxname = $latex_file; + $idxname =~ s/\.tex$/\.idx/; + &busy_wait_command("makindex $idxname", + "Re-creating index file", + \%prog_state, $idxname); + &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", + "for $status_statement now Recreting index (latex)", + \%prog_state, $dvi_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 "\n

PDF 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,7 +604,33 @@ foreach $texfile (@texfile) { "for $status_statement now Converting to PS", \%prog_state,$new_name_file); if (-e $new_name_file) { - &repaginate_postscript($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); + if ($tableofcontents eq 'yes') { + &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); + } + if ($tableofindex eq 'yes') { + my $idxname = $latex_file; + $idxname =~ s/\.tex$/\.idx/; + &busy_wait_command("makeindex $idxname", + "Re-creating index file", + \%prog_state, $idxname); + &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null", + "for $status_statement now Recreting index (latex)", + \%prog_state, $dvi_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'; @@ -631,6 +711,7 @@ if ($number_of_files>1) { if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } print(&Apache::loncommon::end_page()); my $done; + sub REAPER { $done=1; } @@ -660,14 +741,16 @@ sub busy_wait_command { close(CMD); } - -# Repagninate a postscript file. +# Repagninate # What we need to do: # - Count the number of pages in each student. -# - Add pages between each student so that each student's output is -# the maximum number of pages. -# -sub repaginate_postscript { +# - 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 @@ -680,20 +763,22 @@ sub repaginate_postscript { # 2. Maximum number of pages in a student # 3. Number of pages in each student. - my ($postscript_filename) = @_; + 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, + &mt("Counting pages for student: [_1]",1)); + while ($line = ) { - my $page_number = 0; # Check for total pages (%%Pages:) - if (($line =~ "^%%Pages:") && (!$seen_pages)) { + if (($line =~ /^%%Pages:/) && (!$seen_pages)) { my @pageinfo = split(/ /,$line); $total_pages = $pageinfo[1]; $seen_pages = 1; @@ -704,84 +789,87 @@ sub repaginate_postscript { # we only are looking for the largest n (n is page number at the # bottom of the page, m the page number within the document. # - if ($line =~ "^%%Page:") { + + if ($line =~ /^%%Page:/) { my @pageinfo = split(/ /, $line); if ($page_number < $pageinfo[1]) { $page_number = $pageinfo[1]; + } elsif ($pageinfo[2] ne 1) { + # current page count reset, and it's not because of a + # minipage + # - save the page_number, reset and, if necessary + # update max_pages. + push(@pages_in_student, $page_number); + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + &mt("Counting pages for student: [_1]", scalar(@pages_in_student))); + if ($page_number > $max_pages) { + $max_pages = $page_number; + } + $page_number = $pageinfo[1]; } } - # ENDOFSTUDENTSTAMP - save the page_number, reset and, if necessary - # udpate max_pages. - # - if ($line =~ "ENDOFSTUDENTSTAMP") { - $pages_in_student[$student_number] = $page_number; - $student_number++; - - if ($page_number > $max_pages) { - $max_pages = $page_number; - } - $page_number = 0; - - } } - close(PSFILE); + # file ended so one more student + push(@pages_in_student, $page_number); + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + &mt("Counting pages for student: [_1]",scalar(@pages_in_student))); + if ($page_number > $max_pages) { + $max_pages = $page_number; + } + $page_number = 0; - # Figure out how many total pages we need to add and adjust the - # $total_pages accordingly: - # - my $add_pages = 0; - for (my $i =0; $i < $student_number; $i++) { - $add_pages += ($max_pages - $pages_in_student[$i]); - } - # If we don't need to add any pages, we're done! - # You might think that we don't need to do anything if - # there are no pages to add, however we still need to at least strip out - # the ENDOFSTUDENTSTAMP stamps...as they are not postscript comments!! + close(PSFILE); - - # Now pass 2; we're going to write the new. ps file: - # - Modify its first %%Pages: line so that it has the new correct number of - # pages - # - For each student, insert as many blank pages as needed (and - # associated structured comments) to expand a student out to - # max_pages pages. - # - Remove the ENDOFSTUDENTSTAMP lines. - # + # If 2 columns, max_pages must go to an even number of columns: - $total_pages += $add_pages; - $student_number = 0; - - open(PSFILE, "<$postscript_filename"); - open(PSOFILE,">$postscript_filename"."repaginating"); # unique if original fname is. - $seen_pages = 0; # Reset seen %%Pages flag... - while ($line = ) { - if (($line =~ "^%%Pages:") && (!$seen_pages)) { - $line = "%%Pages: $total_pages\n"; - $seen_pages = 1; + + if ($num_columns == 2) { + if ($max_pages % 2) { + $max_pages++; } - if ($line =~ "ENDOFSTUDENTSTAMP") { - $add_pages = ($max_pages - $pages_in_student[$student_number]); - $line = "\n"; - my $last_student_page = $pages_in_student[$student_number]; - my $last_total_page = $student_number*$max_pages + $last_student_page; - while ($add_pages) { - $line .= "%Page: $last_student_page $last_total_page\n"; - my $bop = $last_total_page-1; - $line .= "TeXDict begin $last_student_page $bop bop eop end\n"; - $last_student_page++; - $last_total_page++; - $add_pages--; + } + + # Now rewrite the LaTex file, substituting our \special + # with an appropriate number of \newpage directives. + + my $outfilename = $latex_filename."temp"; + + open(LATEXIN, "<$latex_filename"); + open(LATEXOUT, ">$outfilename"); + + + my $student_number = 0; # Index of student we're working on. + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + "Repaginating student ".$student_number+1); + + while (my $line = ) { + if ($line eq "\\special{ps:ENDOFSTUDENTSTAMP}\n") { + # only end of student stamp if next line is ENDOFSTUDENTSTAMP: + + + # End of student replace with 0 or more newpages. + + my $addlines = $max_pages - $pages_in_student[$student_number]; + while($addlines) { + print LATEXOUT '\clearpage \strut \clearpage'; + + $addlines--; } + $student_number++; + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + "Repaginating student ".$student_number+1); + + } else { + print LATEXOUT $line; } - print PSOFILE $line; } - close PSOFILE; - close PSFILE; - rename($postscript_filename."repaginating", $postscript_filename); + close(LATEXIN); + close(LATEXOUT); + rename($outfilename, $latex_filename); }