Source for file Xml2Pdf.php

Documentation is available at Xml2Pdf.php

  1. <?php
  2. /**
  3.  * Xml2Pdf.
  4.  *
  5.  * @filesource
  6.  *
  7.  * @author guillaume l. <guillaume@geelweb.org>
  8.  * @link http://www.geelweb.org
  9.  * @license http://opensource.org/licenses/bsd-license.php BSD License
  10.  * @copyright copytight © 2006, guillaume luchet
  11.  * @package Xml2Pdf
  12.  * @version 0.6.10.9
  13.  *
  14.  * @todo bench : recursion
  15.  * @todo add tag <include file="include_file.xml" />
  16.  */
  17.  
  18. // dependances {{{
  19.  
  20. /**
  21.  * include config file.
  22.  */
  23. require_once('Xml2Pdf.config.php');
  24.  
  25. /**
  26.  * include the class Pdf.
  27.  */
  28. require_once('Pdf.php');
  29.  
  30. // }}}
  31.  
  32.  
  33. /**
  34.  * Parse an XML file and convert it on PDF document.
  35.  *
  36.  * Parse an XML content using the
  37.  * {@link http://php.net/manual/en/ref.xml.php PHP XML parser functions}
  38.  * then convert it on PDF document using
  39.  * {@link http://www.fpdf.org FPDF}.
  40.  *
  41.  * For each tag XML, the parser try to instantiate the corresponding object
  42.  * searching it in the tag plugin directory. eg, to a tag named custom, it'll
  43.  * search the file <b>xml2pdf.tag.custom.php</b>, then it'll instantiate the
  44.  * class <b>Xml2PdfTag_custom</b>.
  45.  *
  46.  * The tag plugins class must have the following method :
  47.  * - void __construtc(object Pdf, array) or void __construct(object Pdf, array, object Pdf)
  48.  * - void addContent(string)
  49.  * - void close()
  50.  *
  51.  * Example of plugin class :
  52.  * <code>
  53.  * class Xml2PdfTag_custom {
  54.  *     /**
  55.  *      * objet représentant la balise mère.
  56.  *      {@*} 
  57.  *     public $parent;
  58.  *
  59.  *     /**
  60.  *      * objet Pdf.
  61.  *      {@*} 
  62.  *     public $pdf;
  63.  *
  64.  *     /**
  65.  *      * contenu de la balise.
  66.  *      {@*} 
  67.  *     public $content;
  68.  *
  69.  *     /**
  70.  *      * Constructeur :
  71.  *      *
  72.  *      * il peut prendre seulement deux paramètres, dans ce cas, la balise mère
  73.  *      * ne sera pas connu.
  74.  *      {@*} 
  75.  *     public function __construct($pdf, $tagProperties, $parent) {
  76.  *         // here you can parse the tagProperties
  77.  *     }
  78.  *     
  79.  *     /**
  80.  *      * ajoute le contenu.
  81.  *      {@*} 
  82.  *     public function addContent($content) {
  83.  *         // ici vous pouvez gérer les actions à effectué sur le contenu de
  84.  *         // la balise
  85.  *     }
  86.  *
  87.  *     /**
  88.  *      * méthode appelé quand la balise est fermée.
  89.  *      {@*} 
  90.  *     public function close() {
  91.  *         // ici vous pouvez mettre l'action à effectué quand la balise
  92.  *         // à été analysé
  93.  *     }
  94.  * }
  95.  * </code>
  96.  *
  97.  * To simplify the plugin class code, you can extends your plugin class with
  98.  * {@link Xml2PdfTag Xml2PdfTag} or {@link Xml2PdfTextTag Xml2PdfTextTag}.
  99.  *
  100.  * @author guillaume l. <guillaume@geelweb.org>
  101.  * @link http://www.geelweb.org
  102.  * @license http://opensource.org/licenses/bsd-license.php BSD License
  103.  * @copyright copyright © 2006, guillaume luchet
  104.  * @package Xml2Pdf
  105.  * @tutorial Xml2Pdf/Xml2Pdf.pkg
  106.  * @version 0.6.10.8
  107.  */
  108. Class Xml2Pdf {
  109.     // class properties {{{ 
  110.         /**
  111.      * XML content.
  112.      * @var string 
  113.      */
  114.     private $_xml = null;
  115.     
  116.     /**
  117.      * object Pdf.
  118.      * @var object Pdf 
  119.      */
  120.     private $_pdf = null;
  121.     
  122.     /**
  123.      * tags stack.
  124.      * @var array 
  125.      */
  126.     private $_tagStack = array();
  127.     
  128.     /**
  129.      * True if the tag does not be parsed.
  130.      * @var boolean 
  131.      */
  132.     private $_donotparse = false;
  133.     
  134.     // }}}
  135.     // Xml2Pdf::__construct() {{{
  136.  
  137.     
  138.     /**      
  139.      * Constructor.
  140.      *
  141.      * @param string $xml xml file or content
  142.      * @return void 
  143.      */
  144.     public function __construct($xml{
  145.         set_exception_handler(array('Xml2Pdf''showException'));
  146.         $this->_xml = $this->_getXmlContent($xml);
  147.         $this->_pdf = new Pdf();
  148.     }
  149.     
  150.     // }}}
  151.     // Xml2Pdf::render() {{{
  152.  
  153.     
  154.     /**
  155.      * Build the document.
  156.      *
  157.      * Parse the XML content, build the PDF document then return it.
  158.      *
  159.      * @return object Pdf 
  160.      */
  161.     public function render({
  162.         $this->_parse();
  163.         return $this->_pdf;
  164.     
  165.     
  166.     // }}}
  167.     // Xml2Pdf::_parse() {{{
  168.  
  169.     
  170.     /**
  171.      * Parse the XML content.
  172.      *
  173.      * Parse the XML content using PHP XML parser functions.
  174.      *
  175.      * @return boolean 
  176.      */
  177.     private function _parse({
  178.         $xml_parser xml_parser_create(XML_ENCODING);
  179.  
  180.         xml_set_object ($xml_parser$this);
  181.         xml_set_character_data_handler ($xml_parser'_parseContent');
  182.         xml_set_element_handler($xml_parser'_parseOpeningTag''_parseClosingTag');
  183.  
  184.         if(!xml_parse ($xml_parser$this->_xml)) {
  185.             throw new Exception(sprintf('xml error %s at line %d',
  186.                 xml_error_string(xml_get_error_code($xml_parser)),
  187.                 xml_get_current_line_number($xml_parser)));
  188.         }
  189.         xml_parser_free($xml_parser);
  190.         return true;
  191.     
  192.     
  193.     // }}}
  194.     // Xml2Pdf::_parseOpeningTag() {{{
  195.  
  196.     
  197.     /**
  198.      * Parse the opening tag.
  199.      *
  200.      * Try to instantitate the tag plugin class.
  201.      *
  202.      * @param object $parser parser xml
  203.      * @param string $tag tag name
  204.      * @param array $tagProperties tag properties
  205.      * @return void 
  206.      */
  207.     private function _parseOpeningTag($parser$tag$tagProperties{
  208.         if(isset($this->_pdf->styles[$tag])) {
  209.             $this->_parseContent($parser'<'.$tag.'>');
  210.             return;
  211.         }
  212.         if($this->_donotparse{
  213.             $tagToText '<' strtolower($tag);
  214.             foreach ($tagProperties as $key=>$value{
  215.                 $tagToText .= ' ' strtolower($key'="' $value '"';
  216.             }
  217.             $tagToText .= '/>';
  218.             $this->_parseContent($parser$tagToText);
  219.             return;
  220.         }
  221.         $tagName strtolower($tag);
  222.         $pluginFileName 'xml2pdf.tag.' $tagName '.php';
  223.         $pluginFilePath XML2PDF_PLUGINS_TAGS_PATH '/' $pluginFileName;
  224.         $pluginClass 'Xml2PdfTag_' $tagName;
  225.         if(file_exists($pluginFilePath)) {
  226.             require_once($pluginFileName);
  227.             if(!class_exists($pluginClass)) {
  228.                 throw new Exception(
  229.                     sprintf('Xml2Pdf error : unknow plugin class %s for tag %s',
  230.                     $pluginClass$tagName));
  231.                 die();
  232.             }
  233.             try {
  234.                 $parent array_pop($this->_tagStack);
  235.                 array_push($this->_tagStack$parent);
  236.                 $this->_tagStack[new $pluginClass($this->_pdf$tagProperties$parent);
  237.                 if($tag == 'LITERAL'{
  238.                     $this->_donotparse = true;
  239.                 }
  240.             catch(Exception $e{
  241.                 $this->_tagStack[new $pluginClass($this->_pdf$tagProperties);
  242.             }
  243.         else {
  244.             throw new Exception(sprintf('Xml2Pdf parsing error : unknow plugin file %s for tag %s',
  245.                 $pluginFileName$tagName));
  246.             die();
  247.         }
  248.     
  249.     
  250.     // }}}
  251.     // Xml2Pdf::_parseClosingTag(object, string) {{{
  252.  
  253.     
  254.     /**
  255.      * Parse closing tags.
  256.      *
  257.      * Call the method close() of the last tag of the tags stack.
  258.      *
  259.      * @param object $parser xml parser.
  260.      * @param string $tag tag name.
  261.      * @return void 
  262.      */
  263.     private function _parseClosingTag($parser$tag{
  264.         if(isset($this->_pdf->styles[$tag])) {
  265.             $this->_parseContent($parser'</'.$tag.'>');
  266.             return;
  267.         }
  268.         if($tag == 'LITERAL'{
  269.             $this->_donotparse = false;
  270.         }
  271.         if ($this->_donotparse{
  272.             $this->_parseContent($parser'</'.strtolower($tag).'>');
  273.             return;
  274.         }
  275.         $tagObject array_pop($this->_tagStack);
  276.         $result $tagObject->close();
  277.     
  278.     
  279.     // }}}
  280.     // Xml2Pdf::_parseContent(object, content) {{{
  281.  
  282.     
  283.     /**
  284.      * Parse the tag content.
  285.      *
  286.      * Call the method addContent() of the last tag of the tags stack.
  287.      *
  288.      * @param object $parser analyseur xml
  289.      * @param string $content contenue
  290.      * @return void 
  291.      */
  292.     private function _parseContent($parser$content{
  293.         $tagObject array_pop($this->_tagStack);
  294.         $tagObject->addContent($content);
  295.         array_push($this->_tagStack$tagObject);
  296.     
  297.     
  298.     // }}}
  299.     // Xml2Pdf::showException() {{{
  300.  
  301.     
  302.     /**
  303.      * Show an error message.
  304.      *
  305.      * It's also the exception handler.
  306.      *
  307.      * @param object $exception objet Exception
  308.      * @return void 
  309.      */
  310.     static function showException($exception{
  311.         throw $exception;
  312.         echo '<pre>';
  313.         print_r('Xml2Pdf error : ' $exception->getMessage());
  314.         echo '</pre>';
  315.     
  316.     
  317.     // }}}
  318.     // Xml2Pdf::_getXmlContent(string) {{{
  319.  
  320.     
  321.     /**
  322.      * Get the xml content of a file.
  323.      *
  324.      * @return string 
  325.      */
  326.     private function _getXmlContent($xml{
  327.         if(file_exists($xml)) {
  328.             $xml implode(''file($xml));
  329.         else if(is_string($xml)) {
  330.             $xml $xml;
  331.         }
  332.         return $xml;
  333.     
  334.     
  335.     // }}}
  336.     // Xml2Pdf::convertColor(string) {{{
  337.     
  338.         
  339.     /**
  340.      * Convert an hexadecimal color on RGB color.
  341.      *
  342.      * @param string $color coulor.
  343.      * @return array 
  344.      */
  345.     static function convertColor($color{
  346.         if(is_array($color)) {
  347.             return $color;
  348.         }
  349.         $array array();
  350.         $array['r'substr((string)$color,1,2);
  351.         $array['g'substr((string)$color,3,2);
  352.         $array['b'substr((string)$color,5,2);
  353.  
  354.         $array['r'hexdec($array['r']);
  355.         $array['g'hexdec($array['g']);
  356.         $array['b'hexdec($array['b']);
  357.         return $array;
  358.     }
  359.  
  360.     // }}}
  361.     // Xml2Pdf::getColor() // {{{
  362.     
  363.         
  364.     /**
  365.      * Generate a RGB color.
  366.      *
  367.      * @return array 
  368.      * @access public
  369.      */
  370.     static function getColor({
  371.         $array array();
  372.         $array['r'rand(128255);
  373.         $array['g'rand(128255);
  374.         $array['b'rand(128255);
  375.         return $array;
  376.     }
  377.     
  378.     // }}}
  379. }
  380. ?>

Documentation generated on Wed, 11 Oct 2006 22:27:17 +0200 by phpDocumentor 1.3.0