--- loncom/interface/printout.pl 2008/03/11 01:48:57 1.132 +++ loncom/interface/printout.pl 2008/03/18 09:48:11 1.133 @@ -1,7 +1,7 @@ #!/usr/bin/perl # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc. # -# $Id: printout.pl,v 1.132 2008/03/11 01:48:57 www Exp $ +# $Id: printout.pl,v 1.133 2008/03/18 09:48:11 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -165,145 +165,79 @@ END } my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')}; - &Apache::lonlocal::get_language_handle(); - &Apache::loncommon::content_type(undef,'text/html'); +&Apache::lonlocal::get_language_handle(); +&Apache::loncommon::content_type(undef,'text/html'); $env{'request.noversionuri'} = '/cgi-bin/printout.pl'; - 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'}; +my $laystyle = $env{'cgi.'.$identifier.'.layout'}; +my $numberofcolumns = $env{'cgi.'.$identifier.'.numcol'}; +my $paper = $env{'cgi.'.$identifier.'.paper'}; +my $selectionmade = $env{'cgi.'.$identifier.'.selection'}; +my $tableofcontents = $env{'cgi.'.$identifier.'.tableofcontents'}; +my $tableofindex = $env{'cgi.'.$identifier.'.tableofindex'}; +my $advanced_role = $env{'cgi.'.$identifier.'.role'}; +my $number_of_files = $env{'cgi.'.$identifier.'.numberoffiles'}+1; +my $student_names = $env{'cgi.'.$identifier.'.studentnames'}; +my $backref = &Apache::lonnet::unescape($env{'cgi.'.$identifier.'.backref'}); + + +my @names_pack=(); +if ($student_names=~/_END_/) { + @names_pack=split(/_ENDPERSON_/,$student_names); +} +if ($backref) { + print('

'.&mt("[_1]Return[_2] to editing resource.", + "","").'

'); +} +my $figfile = $texfile; +$figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/; +my $duefile = $texfile; +$duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/; + + +#------------------------------------------------------------------------------------- +# +# Each print may have associated with it a file that contains a set of figures +# that need to be converted to .eps from whatever form they were in when included +# in the resource. The name of the figure file is in $figfile. If it exists, +# it contains the names of the files that need to be converted, one per line. +# + +if (-e $figfile) { + # print "$figfile exists\n"; + my %done_conversion; + my $temporary_file=IO::File->new($figfile) || die "Couldn't open fig file $figfile for reading: $!\n"; + my @content_of_file = <$temporary_file>; + close $temporary_file; + my $noteps; + my %prog_state; + if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Converting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80'); } + print('
'); + foreach my $not_eps (@content_of_file) { + chomp($not_eps); + if ($not_eps ne '') { + $not_eps=~s|\/\.\/|\/|g; + if (!$done_conversion{$not_eps}) { # Only convert multiple includes once. + &convert_figure($not_eps); + $done_conversion{$not_eps} = 1; + } + } + } + if ($advanced_role) { + &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); + } + unlink($figfile); +} +# End of figure conversion section: +# +#-------------------------------------------------------------------------------------------- + - my $identifier = $ENV{'QUERY_STRING'}; - my $texfile = $env{'cgi.'.$identifier.'.file'}; - my $laystyle = $env{'cgi.'.$identifier.'.layout'}; - my $numberofcolumns = $env{'cgi.'.$identifier.'.numcol'}; - my $paper = $env{'cgi.'.$identifier.'.paper'}; - my $selectionmade = $env{'cgi.'.$identifier.'.selection'}; - my $tableofcontents = $env{'cgi.'.$identifier.'.tableofcontents'}; - my $tableofindex = $env{'cgi.'.$identifier.'.tableofindex'}; - my $advanced_role = $env{'cgi.'.$identifier.'.role'}; - my $number_of_files = $env{'cgi.'.$identifier.'.numberoffiles'}+1; - my $student_names = $env{'cgi.'.$identifier.'.studentnames'}; - my $backref = &Apache::lonnet::unescape($env{'cgi.'.$identifier.'.backref'}); - - my @names_pack=(); - if ($student_names=~/_END_/) { - @names_pack=split(/_ENDPERSON_/,$student_names); - } - if ($backref) { - print('

'.&mt("[_1]Return[_2] to editing resource.", - "","").'

'); - } - my $figfile = $texfile; - $figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/; - my $duefile = $texfile; - $duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/; - #do we have figures? - # print "Figure file: $figfile\n"; - if (-e $figfile) { - # print "$figfile exists\n"; - my %done_conversion; - my $temporary_file=IO::File->new($figfile) || die "Couldn't open fig file $figfile for reading: $!\n"; - my @content_of_file = <$temporary_file>; - close $temporary_file; - my $noteps; - my %prog_state; - if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Converting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80'); } - print('
'); - foreach my $not_eps (@content_of_file) { - chomp($not_eps); - if ($not_eps ne '') { - # print "Converting $not_eps"; # Debugging. - my $status_statement='EPS picture for '.$not_eps; - # print "$status_statement\n"; - $not_eps=~s|\/\.\/|\/|g; - my $eps_f = $not_eps; - # $eps_f =~ s/\.[^.]*$/\.eps/i; - if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) { - $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/; - $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f; - } elsif ($eps_f=~/$perlvar{'lonDocRoot'}\/res\//) { - $eps_f=~m/$perlvar{'lonDocRoot'}\/res\/(.+)/; - $eps_f = $perlvar{'lonPrtDir'}.'/'.$1; - } elsif ($eps_f=~/$perlvar{'lonUsersDir'}\//) { - $eps_f=~/$perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/; - $eps_f = $perlvar{'lonPrtDir'}.'/'.$1.'/'.$2; - } - $eps_f =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX. - # - # 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|$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); - } - } - } - } - } - if ($advanced_role) { - &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); - } - unlink($figfile); - } #print "$texfile\n"; #name of the tex file for debugging only my @texfile=($texfile); if ($number_of_files>1) { @@ -1033,3 +967,85 @@ sub create_missing_fonts { } } +# +# Convert a figure file to encapsulated postscript: +# At present, this is using a lot of file scoped globals to pass data around. +# Parameters: +# not_eps - The name of the file to convert which, presumably, is not +# already an eps file. +# +sub convert_figure { + my ($not_eps) = @_; + + + my $status_statement='EPS picture for '.$not_eps; + my $eps_f = $not_eps; + if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) { + $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/; + $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f; + } elsif ($eps_f=~/$perlvar{'lonDocRoot'}\/res\//) { + $eps_f=~m/$perlvar{'lonDocRoot'}\/res\/(.+)/; + $eps_f = $perlvar{'lonPrtDir'}.'/'.$1; + } elsif ($eps_f=~/$perlvar{'lonUsersDir'}\//) { + $eps_f=~/$perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/; + $eps_f = $perlvar{'lonPrtDir'}.'/'.$1.'/'.$2; + } + $eps_f =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX. + # + # 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($not_eps, qr/\.(ps|eps)/i); + if ($sext =~/ps$/i) { + &File::Path::mkpath($path,0,0777); + copy("$not_eps", "$eps_f"); + } else { + + $eps_f .= '.eps'; # Just append the eps ext. + my $path=$eps_f; + $path =~ s/\/([^\/]+)\.eps$//; + &File::Path::mkpath($path,0,0777); + $not_eps =~ s/^\s+//; + $not_eps =~ s/\s+$//; + $not_eps =~ s/ /\\ /g; + if ($advanced_role) { + my $prettyname=$not_eps; + $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|; + $prettyname=~s|$perlvar{'lonDocRoot'}/|/|; + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + 'Converting to EPS '.$prettyname); + } + system("convert $not_eps $eps_f"); + 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); + } + } + } + +}