diff options
| author | ivan <ivan> | 2008-06-02 02:16:14 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2008-06-02 02:16:14 +0000 | 
| commit | f163fa1c9f616fbbb5413e6fad09bd08957b0c3a (patch) | |
| tree | e977c147e429ff32ba0a20565c6bfd54f2eb049c | |
| parent | 15a02054fe0f91eda70003b8d1cf29497d19aa91 (diff) | |
use IPC::Run to run pslatex & add a timeout, this should prevent hanging on template errors
| -rw-r--r-- | FS/FS/Misc.pm | 83 | ||||
| -rw-r--r-- | FS/FS/cust_bill.pm | 44 | 
2 files changed, 79 insertions, 48 deletions
| diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index 54467a1fb..7a6a3b5b1 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -5,6 +5,8 @@ use vars qw ( @ISA @EXPORT_OK $DEBUG );  use Exporter;  use Carp;  use Data::Dumper; +use IPC::Run qw( run timeout );   # for _pslatex +use IPC::Run3; # for do_print... should just use IPC::Run i guess  #do NOT depend on any FS:: modules here, causes weird (sometimes unreproducable  #until on client machine) dependancy loops.  put them in FS::Misc::Something  #instead @@ -13,7 +15,7 @@ use Data::Dumper;  @EXPORT_OK = qw( send_email send_fax                   states_hash counties state_label                   card_types -                 generate_ps do_print +                 generate_ps generate_pdf do_print                 );  $DEBUG = 0; @@ -500,12 +502,7 @@ sub generate_ps {    my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc;    chdir($dir); -  my $sfile = shell_quote $file; - -  system("pslatex $sfile.tex >/dev/null 2>&1") == 0 -    or die "pslatex $file.tex failed; see $file.log for details?\n"; -  system("pslatex $sfile.tex >/dev/null 2>&1") == 0 -    or die "pslatex $file.tex failed; see $file.log for details?\n"; +  _pslatex($file);    system('dvips', '-q', '-t', 'letter', "$file.dvi", '-o', "$file.ps" ) == 0      or die "dvips failed"; @@ -537,14 +534,82 @@ sub generate_ps {  } +=item generate_pdf FILENAME + +Returns an PDF rendition of the LaTex file, as a scalar.  FILENAME does not +contain the .tex suffix and is unlinked by this function. + +=cut + +use String::ShellQuote; + +sub generate_pdf { +  my $file = shift; + +  my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; +  chdir($dir); + +  #system('pdflatex', "$file.tex"); +  #system('pdflatex', "$file.tex"); +  #! LaTeX Error: Unknown graphics extension: .eps. + +  _pslatex($file); + +  my $sfile = shell_quote $file; + +  #system('dvipdf', "$file.dvi", "$file.pdf" ); +  system( +    "dvips -q -t letter -f $sfile.dvi ". +    "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ". +    "     -c save pop -" +  ) == 0 +    or die "dvips | gs failed: $!"; + +  open(PDF, "<$file.pdf") +    or die "can't open $file.pdf: $! (error in LaTeX template?)\n"; + +  unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex"); + +  my $pdf = ''; +  while (<PDF>) { +    $pdf .= $_; +  } + +  close PDF; + +  return $pdf; + +} + +sub _pslatex { +  my $file = shift; + +  #my $sfile = shell_quote $file; + +  my @cmd = ( +    'latex', '-interaction=batchmode', +    '\AtBeginDocument{\RequirePackage{pslatex}}', +    '\def\PSLATEXTMP{\futurelet\PSLATEXTMP\PSLATEXTMPB}', +    '\def\PSLATEXTMPB{\ifx\PSLATEXTMP\nonstopmode\else\input\fi}', +    '\PSLATEXTMP', +    "$file.tex" +  ); + +  my $timeout = 60; #? + +  for ( 1, 2 ) { +    run( \@cmd, '>'=>'/dev/null', '2>'=>'/dev/null', timeout($timeout) ) +      or die "pslatex $file.tex failed; see $file.log for details?\n"; +  } + +} +  =item print ARRAYREF  Sends the lines in ARRAYREF to the printer.  =cut -use IPC::Run3; -  sub do_print {    my $data = shift; diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index 2abd8403a..1f837de84 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -12,7 +12,7 @@ use String::ShellQuote;  use HTML::Entities;  use Locale::Country;  use FS::UID qw( datasrc ); -use FS::Misc qw( send_email send_fax generate_ps do_print ); +use FS::Misc qw( send_email send_fax generate_ps generate_pdf do_print );  use FS::Record qw( qsearch qsearchs dbh );  use FS::cust_main_Mixin;  use FS::cust_main; @@ -2303,8 +2303,8 @@ sub print_ps {    my ($file, $lfile) = $self->print_latex(@_);    my $ps = generate_ps($file);    unlink($lfile); -  $ps; +  $ps;  }  =item print_pdf [ TIME [ , TEMPLATE ] ] @@ -2322,44 +2322,10 @@ sub print_pdf {    my $self = shift;    my ($file, $lfile) = $self->print_latex(@_); +  my $pdf = generate_pdf($file); +  unlink($lfile); -  my $dir = $FS::UID::conf_dir. "/cache.". $FS::UID::datasrc; -  chdir($dir); - -  #system('pdflatex', "$file.tex"); -  #system('pdflatex', "$file.tex"); -  #! LaTeX Error: Unknown graphics extension: .eps. - -  my $sfile = shell_quote $file; - -  system("pslatex $sfile.tex >/dev/null 2>&1") == 0 -    or die "pslatex $file.tex failed; see $file.log for details?\n"; -  system("pslatex $sfile.tex >/dev/null 2>&1") == 0 -    or die "pslatex $file.tex failed; see $file.log for details?\n"; - -  #system('dvipdf', "$file.dvi", "$file.pdf" ); -  system( -    "dvips -q -t letter -f $sfile.dvi ". -    "| gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$sfile.pdf ". -    "     -c save pop -" -  ) == 0 -    or die "dvips | gs failed: $!"; - -  open(PDF, "<$file.pdf") -    or die "can't open $file.pdf: $! (error in LaTeX template?)\n"; - -  unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex"); -  unlink("$lfile"); - -  my $pdf = ''; -  while (<PDF>) { -    $pdf .= $_; -  } - -  close PDF; - -  return $pdf; - +  $pdf;  }  =item print_html [ TIME [ , TEMPLATE [ , CID ] ] ] | 
