[LON-CAPA-cvs] cvs: loncom /interface lonprintout.pm

foxr foxr@source.lon-capa.org
Fri, 17 Apr 2009 10:08:42 -0000


This is a MIME encoded message

--foxr1239962922
Content-Type: text/plain

foxr		Fri Apr 17 10:08:42 2009 EDT

  Modified files:              
    /loncom/interface	lonprintout.pm 
  Log:
  see BZ5899
  - Support for printing pdf's in folder prints.
  - I think this works in other contexts as well, but more testing is
    needed.  It's certainly no worse that before.
  
  
--foxr1239962922
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20090417100842.txt"

Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.549 loncom/interface/lonprintout.pm:1.550
--- loncom/interface/lonprintout.pm:1.549	Wed Feb 18 07:06:15 2009
+++ loncom/interface/lonprintout.pm	Fri Apr 17 10:08:42 2009
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.549 2009/02/18 07:06:15 raeburn Exp $
+# $Id: lonprintout.pm,v 1.550 2009/04/17 10:08:42 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -40,6 +40,9 @@
 use Apache::admannotations;
 use Apache::lonenc;
 use Apache::entities;
+use Apache::londefdef;
+
+use File::Basename;
 
 use HTTP::Response;
 
@@ -111,6 +114,65 @@
     return $result;
 }
 
+# include_pdf - PDF files are included into the 
+# output as follows:
+#  - The PDF, if necessary, is replicated.
+#  - The PDF is added to the list of files to convert to postscript (along with the images).
+#  - The LaTeX is added to include the final converted postscript in the file as an included
+#    job.  The assumption is that the includedpsheader.ps header will be included.
+#
+# Parameters:
+#   pdf_uri   - URI of the PDF file to include.
+#   
+# Returns:
+#  The LaTeX to include.
+#
+# Assumptions:
+#    The uri is actually a PDF file
+#    The postscript will have the includepsheader.ps included.
+#
+#
+sub include_pdf {
+    my ($pdf_uri) = @_;
+
+    # Where is the file? If not local we'll need to repcopy it:'
+
+    my $file = &Apache::lonnet::filelocation('', $pdf_uri);
+    if (! -e $file) {
+	&Apache::lonnet::repcopy($file);
+	$file = &Apache::lonnet::filelocation('',$pdf_uri);
+    }
+
+    #  The file isn ow replicated locally.. or it did not exist in the first place
+    # (unlikely).  If it did exist, add the pdf to the set of files/images that
+    # need tob e converted for this print job:
+
+    $file =~ s|(.*)/res/|/home/httpd/html/res/|;
+
+    open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");
+    print FILE ("$file\n");
+    close (FILE);
+
+    # Construct the special to put out.  To do this we need to get the
+    # resulting filename after conversion.  The file will have the same name
+    # but will be in the user's spool directory with converted images.
+
+    my $dirname = "/home/httpd/prtspool/$env{'user.name'}/";
+    my ( $base, $path,  $ext) = &fileparse($file, '.pdf');
+#    my $destname = $dirname.'/'.$base.'.eps'; # Not really an eps but easier in printout.pl
+    $base =~ s/ /\_/g;
+
+
+    my $output = &print_latex_header()."\\begin{document}\n";
+    $output    .= '\special{ps: _begin_job_ ('
+	.$base.'.pdf.eps'.
+	')run _end_job_}';
+
+    return $output;
+
+
+}
+
 
 #
 #   ssi_with_retries - Does the server side include of a resource.
@@ -1021,12 +1083,12 @@
 	$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";
     }
     if ($layout eq 'album') {
-	    $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
+	    $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
     } elsif ($layout eq 'book') {
 	if ($choice ne 'All class print') { 
-	    $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
+	    $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
 	} else {
-	    $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
+	    $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
 	}
 	if ($papersize eq 'a4') {
 	    $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/;
@@ -1149,41 +1211,8 @@
 
 sub print_latex_header {
     my $mode=shift;
-    my $output='\documentclass[letterpaper,twoside]{article}\raggedbottom';
-    if (($mode eq 'batchmode') || (!$perm{'pav'})) {
-	$output.='\batchmode';
-    }
-    $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
-   	    '\usepackage{multirow}'."\n".
-	     '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
-	     '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
-	     '\usepackage{wrapfig}'.
-	     '\usepackage{picins}\usepackage{calc}'."\n".
-	     '\usepackage[T1]{fontenc}'."\n".
-             '\usepackage{lmodern}'."\n".
-	     '\usepackage[postscript]{ucs}'."\n".
-	     '\usepackage[utf8x]{inputenc}'."\n".
-	     '\usepackage{pifont}'  . "\n".
-	     '\usepackage{latexsym}'."\n".
-	     '\usepackage{amsmath}'.
-	     '\usepackage{amssymb}'.
-	     '\usepackage{amsfonts}'.
-	     '\usepackage{amsthm}'.
-	     '\usepackage{amscd}'.
-	     '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
-	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
-	     '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".
-	     '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n".
-	     '\setlength{\abovedisplayshortskip}{-0.04in}'."\n".
-	     '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n".
-	     '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n".
-	     '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n".
-	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n".
-	     '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n".
-	     '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n".
-	     '\setlength{\abovedisplayshortskip}{-0.04in}'."\n".
-	     '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n";
-    return $output;	     
+
+    return &Apache::londefdef::latex_header($mode);
 }
 
 sub path_to_problem {
@@ -1443,7 +1472,10 @@
 							$helper, %form, 
 							$LaTeXwidth);
 	    }
-	}  
+	}
+	elsif ($urlp =~ /\.pdf$/i) {
+	    $result .= &include_pdf($urlp);
+	}
     }
     if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
     return $result;
@@ -1634,6 +1666,7 @@
 
 		
 
+	    
 	    }
 	    # Print annotations.
 
@@ -1677,7 +1710,7 @@
 		    $texversion    =~ s/(\\end{document})/$annotation$1/;
 		}
 		$result .= $texversion;
-	} elsif ($cleanURL =~/.tex$/) {
+	} elsif ($cleanURL =~/\.tex$/) {
 	    # For this sort of print of a single LaTeX file,
 	    # We can just print the LaTeX file as it is uninterpreted in any way:
 	    #
@@ -1690,6 +1723,8 @@
 
 	    $do_postprocessing = 0; # Don't massage the result.
 
+	} elsif ($cleanURL =~ /\.pdf$/i) {
+	    $result .= &include_pdf($cleanURL);
 	} else {
 	    $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
 				  $helper->{'VARS'}->{'symb'});
@@ -1838,11 +1873,28 @@
 
 		if ($flag_latex_header_remove ne 'NO') {
 		    $texversion = &latex_header_footer_remove($texversion);
-		} else {
+		} else {	
 		    $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
 		}
 		$result .= $texversion;
 		$flag_latex_header_remove = 'YES'; 
+	    } elsif ($urlp=~ /\.pdf$/i) {
+		if ($i > 0) {
+		    $result .= '\cleardoublepage';
+		}
+		$result .= &include_pdf($urlp);
+		if ($i != $#master_seq) {
+		    if ($numberofcolumns eq '1') {
+			$result .= '\newpage';
+		    } else {
+			# the \\'s seem to be needed to let LaTeX know there's something
+			# on the page since LaTeX seems to not like to clear an empty page.
+			#
+			$result .= '\\ \cleardoublepage';
+		    }
+		}
+		$flag_latex_header_remove = 'YES';
+
 	    } else {
 		$texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'},
 					 $master_seq[$i]);
@@ -1854,7 +1906,9 @@
 		$result .= $texversion;
 		$flag_latex_header_remove = 'YES';   
 	    }	    
-	    if (&Apache::loncommon::connection_aborted($r)) { last; }
+	    if (&Apache::loncommon::connection_aborted($r)) { 
+		last; 
+	    }
 	}
 	&Apache::lonxml::clear_problem_counter();
 	if ($flag_page_in_sequence eq 'YES') {
@@ -2392,7 +2446,7 @@
 		}
 	    }
 	    $remove_latex_header = 'YES';
-	}
+	} 
 	if (&Apache::loncommon::connection_aborted($r)) { last; }
     }
     my $courseidinfo = &get_course();
@@ -2501,7 +2555,6 @@
 	    return '<message type="warning">'.$message.'</message>';
         }
     } else {
-        &Apache::lonnet::logthis('Retrieval of resources to check for folders set to be randomly ordered failed - could not create navmap object');
         $message = "Retrieval of information about ordering of resources failed."; 
         return '<message type="warning">'.$message.'</message>';
     }
@@ -2581,7 +2634,6 @@
 	
     }
 
-
     # Detect whether we're coming from construction space
     if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
         $helper->{VARS}->{'filename'} = "~$1/$2";
@@ -2698,7 +2750,6 @@
     }
 
     if (($helper->{'VARS'}->{'construction'} ne '1' ) &&
-
 	$helper->{VARS}->{'postdata'} &&
 	$helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence

--foxr1239962922--