Source for file jResponseLatexToPdf.class.php

Documentation is available at jResponseLatexToPdf.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  core_response
  5. @author      Aubanel Monnier
  6. @contributor Laurent Jouanneau, Thomas, Johannb
  7. @copyright   2007 Aubanel Monnier, 2009 Thomas, 2009-2010 Laurent Jouanneau
  8. @link        http://aubanel.info
  9. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  10. */
  11.  
  12. /**
  13. * pdf response, generated from a latex content
  14. @package  jelix
  15. @subpackage core_response
  16. @since 1.0b2
  17. */
  18. class jResponseLatexToPdf extends jResponse {
  19.     /**
  20.     * @var string 
  21.     */
  22.     protected $_type = 'ltx2pdf';
  23.     /**
  24.      * selector of the main template file
  25.      * This template should contains the body content, and is used by the $body template engine
  26.      * @var string 
  27.      */
  28.     public $bodyTpl = '';
  29.     /**
  30.      * The template engine used to generate the content
  31.      * @var jTpl 
  32.      */
  33.     public $body = null;
  34.     /**
  35.      * Authors of the document
  36.      * @var array 
  37.      */
  38.     public $authors = array();
  39.     /**
  40.      * Document title
  41.      * @var string 
  42.      */
  43.     public $title = '';
  44.     /**
  45.      * Document date
  46.      * @var string 
  47.      * @since 1.2
  48.      */
  49.     public $date = '\today';
  50.     
  51.     /**
  52.      * Contains the list of commands to write in the preamble.
  53.      * @var array 
  54.      */
  55.     protected $_commands=array();
  56.  
  57.     /**
  58.      * complete path to the pdflatex executable
  59.      * @var string 
  60.      */
  61.     public $pdflatexPath='pdflatex';
  62.  
  63.     /**
  64.      * path to the cache directory.
  65.      * default is directory responseLatexToPdf in temp directory
  66.      * @since 1.0
  67.      */
  68.     public $cachePath'';
  69.  
  70.     /**
  71.      * Document file name
  72.      * @var string 
  73.      * @since 1.2
  74.      */
  75.     public $outputFileName = 'document.pdf';
  76.  
  77.     /**
  78.      * constructor;
  79.      * setup the template engine
  80.      */
  81.     function __construct (){
  82.         $this->cachePath = jApp::tempPath('responseLatexToPdf/');
  83.         $this->body = new jTpl();
  84.         parent::__construct();
  85.     }
  86.  
  87.     /**
  88.      * Add a command to the preamble, e.g. \documentclass[a4,11pt]{article}
  89.      * @param string $command name of the command to add
  90.      * @param string $argument argument of the command to add
  91.      * @param array $options options of the command to add
  92.      */
  93.     public function addCommand($command$argument$options=array()){
  94.         $cmd '\\'.$command;
  95.         if (count($options)) 
  96.             $cmd.='['.join(',',$options).']';
  97.         $this->_commands []$cmd.'{'.$argument.'}';
  98.     }
  99.  
  100.     /**
  101.      * A list of commands that can be safely used as default, or as a template for the _commonProcess function
  102.      * Tis function is called if the command stack is empty (useful to get quicly started)
  103.      */
  104.     public function addDefaultCommands(){
  105.         $this->addCommand('documentclass''article'array('a4''11pt'));
  106.         $this->addCommand('usepackage''fontenc'array('T1'));
  107.         $this->addCommand('usepackage''graphicx');
  108.         $this->addCommand('usepackage''geometry'array('pdftex'));
  109.         $this->addCommand('geometry''hmargin=1cm, vmargin=1cm');
  110.     }
  111.  
  112.     /**
  113.      * output the pdf content
  114.      *
  115.      * @return boolean    true if the generated content is ok
  116.      */
  117.     function output(){
  118.         
  119.         if($this->_outputOnlyHeaders){
  120.             $this->sendHttpHeaders();
  121.             return true;
  122.         }
  123.         
  124.         $this->_commonProcess();
  125.         if (count($this->_commands<= 0//No commands, likewise we need some...
  126.             $this->addDefaultCommands();
  127.  
  128.         $data =  join("\n"$this->_commands).'
  129. \begin{document}
  130. \title{'.$this->title.'}
  131. \author{';
  132.         foreach ($this->authors as $a
  133.             $data.= $a.'\\\\'."\n";
  134.         $data.= '}
  135. \date{'.$this->date.'}
  136. ';
  137.         $data.=$this->body->fetch($this->bodyTpl);
  138.         $data.= '
  139.  
  140. \end{document}';
  141.  
  142.         $fbase='cache-'.md5($data);
  143.  
  144.         $texFile=$this->cachePath.$fbase.'.tex';
  145.         $pdfFile=$this->cachePath.$fbase.'.pdf';
  146.  
  147.         if (file_exists($pdfFile)){
  148.             // Naïve cache: we have an md5 on the content of the tex file. If the pdf 
  149.             // corresponding to this content already exists, just serve it. 
  150.             // No managment of cache deletion :o/
  151.             jFile::write($texFile$data);
  152.             $output=array();
  153.             $retVal=1;    
  154.             exec($this->pdflatexPath.' --interaction batchmode --output-directory '.$this->cachePath.' '.$texFile$output$retval);
  155.             if($retVal!=0){
  156.                 $outputStr=implode('<br />',$output);
  157.                 throw new jException('jelix~errors.ltx2pdf.exec',array($this->pdflatexPath$outputStr));
  158.             }
  159.         }
  160.         $this->_httpHeaders['Content-Type']='application/pdf';
  161.         $this->_httpHeaders['Content-length']=@filesize($pdfFile);
  162.         $this->_httpHeaders['Content-Disposition']='attachment; filename='.$this->outputFileName;
  163.         $this->sendHttpHeaders();
  164.  
  165.         readfile($pdfFile);
  166.         return true;
  167.     }
  168.  
  169.     /**
  170.      * The method you can overload in your inherited response
  171.      * overload it if you want to add processes (additionnal commands, content etc..)
  172.      * for all actions
  173.      */
  174.     protected function _commonProcess(){
  175.  
  176.     }
  177.  
  178.     /**
  179.      * Clears the cache directory
  180.      */
  181.     public function clearCache(){
  182.         jFile::removeDir($this->cachePathfalse);
  183.     }
  184.  
  185. }

Documentation generated on Mon, 26 Oct 2015 21:55:40 +0100 by phpDocumentor 1.4.3