Source for file Xml2PdfTextTag.php

Documentation is available at Xml2PdfTextTag.php

  1. <?php
  2. /**
  3.  * Xml2PdfTextTag.
  4.  * @filesource
  5.  *
  6.  * @author guillaume l. <guillaume@geelweb.org>
  7.  * @link http://www.geelweb.org
  8.  * @license http://opensource.org/licenses/bsd-license.php BSD License
  9.  * @copyright copyright © 2006, guillaume luchet
  10.  * @package Xml2Pdf
  11.  * @version 0.6.10.8
  12.  */
  13.  
  14. // dependances {{{
  15. /**
  16.  * include parent class
  17.  */
  18. require_once('Xml2PdfTag.php');
  19.  
  20. // }}}
  21.  
  22. /**
  23.  * Text tags.
  24.  *
  25.  * Xml2PdfTextTag define the properties and method used to for tags used to
  26.  * write content in the Pdf document. The content can be write using styles
  27.  * information define with {@link Xml2PdfTag_stylesheets styles sheet}.
  28.  *
  29.  * This class extends {@link Xml2PdfTag Xml2PdfTag}, the tag properties define
  30.  * by this parent class (like id) are available in Xml2PdfTextTag.
  31.  *
  32.  * <b>tag properties:</b>
  33.  * - <b>font</b>        - string -   font (eg times)
  34.  * - <b>fontsize</b>    - integer -  font size (eg 10)
  35.  * - <b>fontcolor</b>   - string -   font color (eg #000000)
  36.  * - <b>fontstyle</b>   - string -   font style [B[U[I]]]
  37.  * - <b>lineheight</b>  - integer -  line height (eg 5)
  38.  * - <b>textalign</b>   - string -   text alignment [L|R|C|J]
  39.  *
  40.  * @author guillaume l. <guillaume@geelweb.org>
  41.  * @link http://www.geelweb.org
  42.  * @license http://opensource.org/licenses/bsd-license.php BSD License
  43.  * @copyright copyright © 2006, guillaume luchet
  44.  * @package Xml2Pdf
  45.  * @version 0.6.10.8
  46.  */
  47. Class Xml2PdfTextTag extends Xml2PdfTag {
  48.     // class properties {{{
  49.     
  50.         
  51.     /**
  52.      * true if use styles tag to write then content.
  53.      * @var boolean 
  54.      */
  55.     protected $useStyle = false;
  56.     
  57.     /**
  58.      * font.
  59.      * @var string 
  60.      */
  61.     public $font = PDF_DEFAULT_FONT;
  62.     
  63.     /**
  64.      * font style.
  65.      * @var string 
  66.      */
  67.     public $fontStyle = PDF_DEFAULT_FONTSTYLE;
  68.     
  69.     /**
  70.      * font size.
  71.      * @var integer 
  72.      */
  73.     public $fontSize = PDF_DEFAULT_FONTSIZE;
  74.     
  75.     /**
  76.      * font color.
  77.      * @var string 
  78.      */
  79.     public $fontColor = PDF_DEFAULT_FONTCOLOR;
  80.     
  81.     /**
  82.      * text alignment.
  83.      * @var string 
  84.      */
  85.     public $textAlign = PDF_DEFAULT_TEXTALIGN;
  86.     
  87.     /**
  88.      * line height.
  89.      * @var integer 
  90.      */
  91.     public $lineHeight = PDF_DEFAULT_LINEHEIGHT;
  92.     
  93.     /**
  94.      * used styles stack.
  95.      * @var array 
  96.      */
  97.     protected $styleStack;
  98.    
  99.     /**
  100.      * current x pos.
  101.      * @var float 
  102.      */
  103.     private $_x = 0;
  104.  
  105.     /**
  106.      * indentation.
  107.      * @var integer 
  108.      */
  109.     private $_indent = 0;
  110.     
  111.     // }}}
  112.     // Xml2PdfTextTag::__construct() {{{
  113.  
  114.     
  115.     /**
  116.      * Constructor.
  117.      *
  118.      * Parse the tag properties.
  119.      *
  120.      * @param object Pdf $pdf object Pdf
  121.      * @param array $tagProperties tag properties
  122.      * @return void 
  123.      */
  124.     public function __construct($pdf$tagProperties{
  125.         parent::__construct($pdf$tagProperties);
  126.         // parse the tag properties for text
  127.         if(isset($tagProperties['FONT'])) {
  128.             $this->font = $tagProperties['FONT'];
  129.         }
  130.         if(isset($tagProperties['FONTSTYLE'])) {
  131.             $this->fontStyle = $tagProperties['FONTSTYLE'];
  132.         }
  133.         if(isset($tagProperties['FONTCOLOR'])) {
  134.             $this->fontColor = $tagProperties['FONTCOLOR'];
  135.         }
  136.         if(isset($tagProperties['FONTSIZE'])) {
  137.             $this->fontSize = $tagProperties['FONTSIZE'];
  138.         }
  139.         if(isset($tagProperties['TEXTALIGN'])) {
  140.             $this->textAlign = $tagProperties['TEXTALIGN'];
  141.         }
  142.         if(isset($tagProperties['LINEHEIGHT'])) {
  143.             $this->lineHeight = $tagProperties['LINEHEIGHT'];
  144.         }
  145.     
  146.     
  147.     // }}}
  148.     // Xml2PdfTextTag::close() {{{
  149.  
  150.     
  151.     /**
  152.      * Manage the trext writing.
  153.      *
  154.      * @return void 
  155.      */
  156.     public function close({
  157.         if($this->useStyle{
  158.             $this->render();
  159.         else {
  160.             $this->_cleanContent();
  161.             $this->pdf->setFont($this->font$this->fontStyle
  162.                                 $this->fontSize);
  163.             $fontColor Xml2Pdf::convertColor($this->fontColor);
  164.             $this->pdf->setTextColor($fontColor['r']$fontColor['g']
  165.                                      $fontColor['b']);
  166.             $this->pdf->MultiCell(190$this->lineHeight$this->content
  167.                                   false$this->textAlignfalse);
  168.         }
  169.     
  170.     
  171.     // }}}
  172.     // Xml2PdfTextTag::render() {{{
  173.  
  174.     
  175.     /**
  176.      * Text renderer.
  177.      *
  178.      * Write the text in the PDF if the tag use styles tags.
  179.      *
  180.      * @return void 
  181.      */
  182.     public function render({
  183.         // first style is text style!
  184.         $this->styleStack[0array(
  185.             'font'       => $this->font,
  186.             'font-size'  => $this->fontSize,
  187.             'font-style' => $this->fontStyle,
  188.             'color'      => $this->fontColor,
  189.             'indent'     => 0)
  190.         $this->_setStyle();
  191.  
  192.         $this->_x = 10;
  193.         
  194.         while(!empty($this->content)) {
  195.             $line $this->_makeLine();
  196.             if(!empty($line)) {
  197.                 $this->_printLine($line);
  198.             }
  199.         }
  200.         $this->pdf->Ln();
  201.     
  202.     
  203.     // }}}
  204.     // Xml2PdfTextTag::_parseContent() {{{
  205.  
  206.     
  207.     /**
  208.      * Parse the content.
  209.      *
  210.      * Return a part of the content.
  211.      * <code>
  212.      * array(0 => 'string', // text witch have been extract or tag name
  213.      * 1 => 'string', // c if return closing tag, o if return opening tag, s if return space, t if return text
  214.      * 2 => 'string'  // text witch don't be parsed.
  215.      * );
  216.      * </code>
  217.      * Return false if all the content have been parsed.
  218.      *
  219.      * @return mixed 
  220.      */
  221.     private function _parseContent({
  222.         if(empty($this->content)) {
  223.             return false;
  224.         }
  225.         $regs array();
  226.         $result array();
  227.         if(ereg('^(</([^>]+)>).*'$this->content$regs)) {
  228.             // Balise fermante
  229.             $result[1'c';
  230.             $result[2trim($regs[2]);
  231.         else if(ereg('^(<([^>]+)>).*'$this->content$regs)) {
  232.             // Balise ouvrante
  233.             $regs[2ereg_replace('^a''a '$regs[2])// Rustine : l'espace disparaît
  234.             $result[1'o';
  235.             $result[2trim($regs[2]);
  236.  
  237.             // Présence d'attributs
  238.             if(ereg('(.+) (.+)=\'(.+)\' *'$regs[2])) {
  239.                 $params split(" +",$regs[2]);
  240.                 $result[2trim($params[0]);
  241.                 while(list($i$coupleeach($params)) {
  242.                     if($i>0{
  243.                         $couple explode('=',$couple);
  244.                         $couple[0trim($couple[0]);
  245.                         $couple[1trim($couple[1]);
  246.                         $end strlen($couple[1]2;
  247.                         $result[$couple[0]] substr($couple[1]1$end);
  248.                     }
  249.                 }
  250.             }
  251.         else if(ereg('^( ).*'$this->content$regs)) {
  252.             // Espace
  253.             $result[1's';
  254.             $result[2$regs[1];
  255.         else if(ereg('^([^< ]+).*'$this->content$regs)) {
  256.             // Texte
  257.             $result[1't';
  258.             $result[2trim($regs[1]);
  259.         }
  260.         // Elagage
  261.         $begin = isset($regs[1])?strlen($regs[1]):0;
  262.         $end strlen($this->content);
  263.         $this->content = substr($this->content$begin$end);
  264.         $result[0$this->content
  265.         return $result;
  266.     
  267.     
  268.     // }}}
  269.     // Xml2PdfTextTag::_makeLine() {{{
  270.  
  271.     
  272.     /**
  273.      * Buil the next line to write.
  274.      *
  275.      * @return string 
  276.      */
  277.     private function _makeLine({
  278.         $line='';
  279.         $continue=true;
  280.         $result=true;
  281.         while ($continue && $result{
  282.             $result $this->_parseContent();
  283.             if(in_array($result[1]array('s''t'))) {
  284.                 //echo 'text or space : ';
  285.                 $line .= $result[2];
  286.                 $this->_setStyle();
  287.             elseif (in_array($result[1]array('c''o'))) {
  288.                 if($result[1== 'o'{
  289.                   //  echo "open : ";
  290.                     // on ajoute le tag de style
  291.                     $this->_setStyle();
  292.                     $this->styleStack[$this->pdf->styles[$result[2]];
  293.                 elseif($result[1== 'c'{
  294.                 //    echo 'close : ';
  295.                     // on enlève le style
  296.                    
  297.                     $foo array_pop($this->styleStack);
  298.                     $this->_indent=0;
  299.                     if(isset($foo['indent'])) {
  300.                         $this->_indent=$foo['indent'];
  301.                     }
  302.                 }
  303.                 $continue false;
  304.                 if(empty($line)) {
  305.                     $continue true;
  306.                 }
  307.             }
  308.         }
  309.         //echo $line . "<br><br>";
  310.         return $line;
  311.     
  312.     
  313.     // }}}
  314.     // Xml2PdfTextTag::_printLine(string) {{{
  315.  
  316.     
  317.     /**
  318.      * Write a line.
  319.      *
  320.      * @param string $line 
  321.      * @return boolean 
  322.      */
  323.     private function _printLine($line{
  324.         $width $this->pdf->getStringWidth($line);
  325.         $this->pdf->setX($this->_x);
  326.         $this->_x += $width;
  327.         
  328.         if($this->_x > 190{
  329.             $tmp $line;
  330.             $this->_x -= $width;
  331.             $maxWidth 190 $this->_x;
  332.             $this->_x = 10;
  333.             while(!empty($tmp)) {
  334.                 $spacePos = -1;
  335.                 $lineLength strlen($tmp);
  336.                 $foo '';
  337.                 $indent 0;
  338.                 for($i=$i<$lineLength $i++{
  339.                     $char $tmp{$i}
  340.                     if($char == " "{
  341.                         $spacePos $i;
  342.                         $foo .= " ";
  343.                         //continue;
  344.                     }
  345.                     $foo .= $char;
  346.                     if($this->pdf->getStringWidth($foo$maxWidth{
  347.                         // ca dépasse, faut couper
  348.                         if($spacePos == -1{
  349.                             $spacePos $i;
  350.                         }
  351.                         $foo substr($tmp0$spacePos);
  352.                         $tmp substr($tmp$spacePos$lineLength-$spacePos);
  353.                         $spacePos = -1;
  354.                         $indent 1;
  355.                         break;  
  356.                     }
  357.                     if($i==$lineLength-1{
  358.                         $foo $tmp;
  359.                         $tmp '';
  360.                         $indent $this->_indent;
  361.                     }
  362.                 }
  363.                 $this->pdf->Cell($this->pdf->getStringWidth($foo)$this->lineHeight$foo0$indent'L'0);
  364.                 $this->_x = $this->pdf->GetX();
  365.                 $maxWidth=190;
  366.             }
  367.         else {
  368.             $this->pdf->Cell($width$this->lineHeight$line0$this->_indent'L'0);
  369.             if($this->_indent==2{
  370.                 $this->_x=10;
  371.             }
  372.         }
  373.     
  374.     
  375.     // }}}
  376.     // Xml2PdfTextTag::_setStyle() {{{
  377.  
  378.     
  379.     /**
  380.      * Search the styles information and put them.
  381.      *
  382.      * @return void 
  383.      */
  384.     private function _setStyle({
  385.         $fontStyle '';
  386.         $fontColor null;
  387.         $font null;
  388.         $fontSize null;
  389.         //$indentSetted = false;
  390.         $count count($this->styleStack)
  391.         for($i=$count-$i>=$i--{
  392.             if(empty($fontColor&& isset($this->styleStack[$i]['color'])) {
  393.                 $fontColor $this->styleStack[$i]['color'];
  394.             }
  395.             if(empty($font&& isset($this->styleStack[$i]['font'])) {
  396.                 $font $this->styleStack[$i]['font'];
  397.             }
  398.             if(empty($fontSize&& isset($this->styleStack[$i]['font-size'])) {
  399.                 $fontSize $this->styleStack[$i]['font-size'];
  400.             }
  401.             /*if(!$indentSetted && isset($this->styleStack[$i]['indent'])) {
  402.                 $this->_indent = $this->styleStack[$i]['indent'];
  403.                 $indentSetted = true;
  404.             }*/
  405.  
  406.             if(isset($this->styleStack[$i]['font-style']&& !empty($this->styleStack[$i]['font-style'])) {
  407.                 if(false!==strpos($fontStyletrim($this->styleStack[$i]['font-style']))) {
  408.                     continue;
  409.                 }
  410.                 $fontStyle .= trim($this->styleStack[$i]['font-style']);
  411.             }
  412.         }
  413.         $this->pdf->setFont($font$fontStyle$fontSize);
  414.         $fontColor Xml2Pdf::convertColor($fontColor);
  415.         $this->pdf->setTextColor($fontColor['r']$fontColor['g']$fontColor['b']);
  416.     
  417.     
  418.     // }}}
  419.     // Xml2PdfTextTag::_cleanContent() {{{
  420.     
  421.         
  422.     /**
  423.      * Remove the styles information to the content.
  424.      *
  425.      * @return void 
  426.      */
  427.     private function _cleanContent({
  428.         $content '';
  429.         while(!empty($this->content)) {
  430.             $content .= $this->_makeLine();
  431.         }
  432.         $this->content = $content;
  433.     }
  434.  
  435.     // }}}
  436. }
  437. ?>

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