--- loncom/interface/lonprintout.pm 2008/12/15 23:12:26 1.545.2.1
+++ loncom/interface/lonprintout.pm 2009/06/02 12:20:14 1.554
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.545.2.1 2008/12/15 23:12:26 raeburn Exp $
+# $Id: lonprintout.pm,v 1.554 2009/06/02 12:20:14 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,6 +40,9 @@ use Apache::lonnavmaps;
use Apache::admannotations;
use Apache::lonenc;
use Apache::entities;
+use Apache::londefdef;
+
+use File::Basename;
use HTTP::Response;
@@ -111,6 +114,65 @@ sub annotate {
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();
+ $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 @@ sub page_format_transformation {
$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 IndexCreation {
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,21 @@ sub print_construction_sequence {
$helper, %form,
$LaTeXwidth);
}
- }
+ }
+ elsif ($urlp =~ /\.pdf$/i) {
+ my $texversion;
+ if ($member != 0) {
+ $texversion .= '\cleardoublepage';
+ }
+
+ $texversion .= &include_pdf($urlp);
+ $texversion = &latex_header_footer_remove($texversion);
+ if ($member != $#order) {
+ $texversion .= '\\ \cleardoublepage';
+ }
+
+ $result .= $texversion;
+ }
}
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
return $result;
@@ -1505,7 +1548,7 @@ ENDPART
my ($result,$selectionmade) = ('','');
my $number_of_columns = 1; #used only for pages to determine the width of the cell
my @temporary_array=split /\|/,$format_from_helper;
- my ($laystyle,$numberofcolumns,$papersize)=@temporary_array;
+ my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array;
if ($laystyle eq 'L') {
$laystyle='album';
} else {
@@ -1526,6 +1569,7 @@ ENDPART
my %form;
$form{'grade_target'} = 'tex';
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth);
+ $form{'pdfFormFields'} = $pdfFormFields;
# If form.showallfoils is set, then request all foils be shown:
# privilege will be enforced both by not allowing the
@@ -1542,7 +1586,7 @@ ENDPART
&Apache::lonnet::appenv({'construct.style' =>
$helper->{'VARS'}->{'style_file'}});
} elsif ($env{'construct.style'}) {
- &Apache::lonnet::delenv('construct\\.style');
+ &Apache::lonnet::delenv('construct.style');
}
@@ -1633,6 +1677,7 @@ ENDPART
+
}
# Print annotations.
@@ -1658,7 +1703,7 @@ ENDPART
&& $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') {
#printing content of sequence from the construction space
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;
- $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+# $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
$result .= &print_construction_sequence($currentURL, $helper, %form,
$LaTeXwidth);
$result .= '\end{document}';
@@ -1676,7 +1721,7 @@ ENDPART
$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:
#
@@ -1689,6 +1734,9 @@ ENDPART
$do_postprocessing = 0; # Don't massage the result.
+ } elsif ($cleanURL =~ /\.pdf$/i) {
+ $result .= &include_pdf($cleanURL);
+ $result .= '\end{document}';
} else {
$result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
$helper->{'VARS'}->{'symb'});
@@ -1782,6 +1830,7 @@ ENDPART
} else {
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+ $texversion =~ s/\\begin{document}//;
my $title = &Apache::lonnet::gettitle($master_seq[$i]);
$title = &Apache::lonxml::latex_special_symbols($title);
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
@@ -1817,6 +1866,7 @@ ENDPART
$assignment,
$courseidinfo,
$name);
+
if ($numberofcolumns eq '1') {
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';
} else {
@@ -1837,11 +1887,28 @@ ENDPART
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]);
@@ -1853,7 +1920,9 @@ ENDPART
$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') {
@@ -1907,7 +1976,7 @@ ENDPART
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
#loop over students
- my $flag_latex_header_remove = 'NO';
+ my $flag_latex_header_remove = 'NO';
my %moreenv;
$moreenv{'instructor_comments'}='hide';
$moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
@@ -2237,7 +2306,7 @@ ENDPART
# If there's been an unrecoverable SSI error, report it to the user
if ($ssi_error) {
my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk');
- $r->print('
'.
+ $r->print('
'.&mt('An unrecoverable network error occurred:').'
'.
&mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:').
'
'.$ssi_last_error_resource.'
'.$ssi_last_error.
'
'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'
'.
@@ -2344,6 +2413,7 @@ sub print_resources {
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+ $header =~ s/\\begin{document}//; #<<<<<
my $title = &Apache::lonnet::gettitle($curresline);
$title = &Apache::lonxml::latex_special_symbols($title);
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
@@ -2379,7 +2449,13 @@ sub print_resources {
$rendered =~ s/\\end{document}//;
}
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
-
+ } elsif($res_url = ~/\.pdf$/) {
+ my $url = &Apache::lonnet::clutter($res_url);
+ my $rendered = &include_pdf($url);
+ if ($remove_latex_header ne 'NO') {
+ $rendered = &latex_header_footer_remove($rendered);
+ }
+ $current_output .= $rendered;
} else {
my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline);
if ($remove_latex_header ne 'NO') {
@@ -2391,9 +2467,11 @@ sub print_resources {
}
}
$remove_latex_header = 'YES';
- }
+ }
if (&Apache::loncommon::connection_aborted($r)) { last; }
}
+
+
my $courseidinfo = &get_course();
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
my $header_line =
@@ -2402,7 +2480,6 @@ sub print_resources {
my $header_start = ($columns_in_format == 1) ? '\lhead'
: '\fancyhead[LO]';
$header_line = $header_start.'{'.$header_line.'}';
-
if ($current_output=~/\\documentclass/) {
$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /;
} else {
@@ -2486,17 +2563,22 @@ sub get_randomly_ordered_warning {
my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'};
my $navmap = Apache::lonnavmaps::navmap->new();
- my $res = $navmap->getResourceByUrl($map);
- if ($res) {
- my $func =
- sub { return ($_[0]->is_map() && $_[0]->randomorder); };
- my @matches = $navmap->retrieveResources($res, $func,1,1,1);
- if (@matches) {
- $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order.";
- }
- }
- if ($message) {
- return ''.&mt('Layout Options').'
'
.&Apache::loncommon::start_data_table()
.&Apache::loncommon::start_data_table_header_row()
.''.$PageLayout.' '
.''.$NumberOfColumns.' '
.''.$PaperType.' '
+ .''.$pdfFormLabel.' '
.&Apache::loncommon::end_data_table_header_row()
.&Apache::loncommon::start_data_table_row()
.''
@@ -3466,9 +3550,9 @@ sub render {
my $i;
for ($i = 1; $i <= $maxColumns; $i++) {
if ($i == 2) {
- $result .= "\n";
+ $result .= ''."\n";
} else {
- $result .= "\n";
+ $result .= ''."\n";
}
}
@@ -3484,15 +3568,21 @@ sub render {
$_=~/(\w+)/;
my $papersize=$1;
if ($paperSize[$i]=~/$DefaultPaperSize/) {
- $result .= "\n";
+ $result .= ''."\n";
} else {
- $result .= "\n";
+ $result .= ''."\n";
}
$i++;
}
$result .= <
+
+
+
HTML
$result.=&Apache::loncommon::end_data_table_row()
.&Apache::loncommon::end_data_table();
@@ -3507,7 +3597,7 @@ sub postprocess {
my $helper = Apache::lonhelper->getHelper();
$helper->{VARS}->{$var} =
$env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
- $env{"form.$var.paper"};
+ $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};
return 1;
}
@@ -3619,50 +3709,36 @@ sub render {
} else {
$size{'margin'} += 2.54;
}
- my %text = ('format' => 'How should each column be formatted?',
- 'width' => 'Width:',
- 'height' => 'Height:',
- 'margin' => 'Left Margin:',);
- %text = &Apache::lonlocal::texthash(%text);
-
- $result .= <
$text{'width'} | -- | - - | -
$text{'height'} | -- | - - | -
$text{'margin'} | -- | - - | -
'.$lt{'format'}.'
' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'width'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'height'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'margin'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box(); + #Hint: Some instructors like to leave scratch space for the student by + # making the width much smaller than the width of the page.
return $result; }