[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--