) {
+ 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;
@@ -271,20 +606,184 @@ END
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";
}
- #got what we needed reset ENV in case it is to big for system
- %ENV=%origENV;
-
+}
+print "
";
+if ($number_of_files>1) {
+ my $zipfile=$texfile[0];
+ $zipfile=~s/\.tex/\.zip/;
+ my $statement="zip $zipfile";
+ foreach my $file (@texfile) {
+ $file=~s/\.tex/.\pdf/;
+ $statement.=' '.$file;
+ }
+ print("Zip Output:\n");
+ system($statement);
+ print("
");
+ $zipfile=~s/\/home\/httpd//;
+ 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;
+}
-
+sub busy_wait_command {
+ my ($command,$message,$progress_win,$output_file)=@_;
+
+ $SIG{CHLD} = \&REAPER;
+ $done=0;
+ print(" Doing : $command");
+ my $pid=open(CMD,"$command |");
+ if ($advanced_role) {
+ &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 ($advanced_role) {
+ &Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,
+ $message.$extra_msg);
+ }
+ }
+ $SIG{CHLD}='IGNORE';
+ close(CMD);
+}
+ print("
End
");
+# Repagninate a postscript file.
+# 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 {
+
+ # 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) = @_;
+ 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.
+ while ($line = ) {
+ my $page_number = 0;
+
+ # Check for total pages (%%Pages:)
+
+ if (($line =~ /^%%Pages:/) && (!$seen_pages)) {
+ my @pageinfo = split(/ /,$line);
+ $total_pages = $pageinfo[1];
+ $seen_pages = 1;
+ }
+ # Check for %%Page: n m $page_number will be the
+ # biggest of these until we see an endofstudent.
+ # Note that minipages generate spurious %Page: 1 1's so
+ # 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:/) {
+ my @pageinfo = split(/ /, $line);
+ if ($page_number < $pageinfo[1]) {
+ $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);
+
+ # 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!!
+
+ # 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.
+ #
+
+ $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 ($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--;
+ }
+ $student_number++;
+ }
+ print PSOFILE ($line);
+ }
+ close(PSOFILE);
+ close(PSFILE);
+ rename($postscript_filename."repaginating", $postscript_filename);
+}
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.