diff --git a/src/lib/fpdf-easytable/formatedstring.php b/src/lib/fpdf-easytable/formatedstring.php
new file mode 100644
index 0000000..682842d
--- /dev/null
+++ b/src/lib/fpdf-easytable/formatedstring.php
@@ -0,0 +1,209 @@
+<?php
+ /**********************************************************************
+ * formateString                                                       *
+ *                                                                     *
+ * Version: 1.2                                                        *
+ * Date:    04-10-2017                                                 *
+ * Author:  Dan Machado                                                *
+ * Use within exfpdf class                                             *
+ **********************************************************************/
+ class formatedString{
+    public $parced_str;
+    public $style_map;
+    public $positions;
+    private $np;
+    public $iterator;
+    public $width;
+    public $lines;
+    public $linesmap;
+    public $used_fonts;
+
+    private function get_style($str){
+       $style=array('font-family'=>false, 'font-weight'=>false, 'font-style'=>false,
+       'font-size'=>false, 'font-color'=>false, 'href'=>'');
+       $tmp=explode(';', trim($str, '",\', '));
+       foreach($tmp as $x){
+          if($x && strpos($x,':')>0){
+             $r=explode(':',$x);
+             $r[0]=trim($r[0]);
+             $r[1]=trim($r[1]);
+             if(isset($style[$r[0]]) || $r[0]=='style'){
+                if($r[0]=='style' || $r[0]=='font-style'){
+                   $r[1]=strtoupper($r[1]);
+                   if(strpos($r[1], 'B')!==false){
+                      $style['font-weight']='B';
+                  }
+                  if(strpos($r[1], 'I')!==false){
+                     $style['font-style']='I';
+                  }
+                  if(strpos($r[1], 'U')!==false){
+                     $style['font-style'].='U';
+                  }
+               }
+               elseif($r[1]){
+                  if($r[0]=='href'){
+                     $style[$r[0]]=implode(':', array_slice($r,1));
+                  }
+                  else{
+                     $style[$r[0]]=$r[1];
+                  }
+               }
+            }
+         }
+      }
+      return $style;
+   }
+    
+
+   private function style_merge($style1, $style2){
+      $result=$style1;
+      foreach($style2 as $k=>$v){
+         if($v){
+            $result[$k]=$v;
+         }
+      }
+      return $result;
+   }
+
+   private function style_parcer($text, &$font_data){
+      $str=trim(strtr($text, array("\r"=>'', "\t"=>'')));
+      $rep=array('[bB]{1}'=>'B', '[iI]{1}'=>'I', '[iI]{1}[ ]*[bB]{1}'=>'BI', '[bB]{1}[ ]*[iI]{1}'=>'BI' );
+      foreach($rep as $a=>$v){
+         $str=preg_replace('/<[ ]*'.$a.'[ ]*>/', "<$v>", $str);
+         $str=preg_replace('/<[ ]*\/+[ ]*'.$a.'[ ]*>/', "</$v>", $str);
+      }
+      $str=preg_replace('/<BI>/', '<s "font-weight:B;font-style:I">', $str);
+      $str=preg_replace('/<\/BI>/', "</s>", $str);
+      $str=preg_replace('/<B>/', '<s "font-weight:B;">', $str);
+      $str=preg_replace('/<\/B>/', "</s>", $str);
+      $str=preg_replace('/<I>/', '<s "font-style:I;">', $str);
+      $str=preg_replace('/<\/I>/', "</s>", $str);
+      $open=array();
+      $total=array();
+      $lt="<s";
+      $rt="</s>";
+      $j=strpos($str, $lt, 0);
+      while($j!==false){
+            if($j>0 && ord($str[$j-1])==92){
+            $j=strpos($str, $lt, $j+1);
+            continue;
+         }
+         $k=strpos($str, '>',$j+1);
+         $open[$j]=substr($str, $j+2, $k-($j+2));
+         $total[]=$j;
+         $j=strpos($str, $lt, $j+1);
+      }
+      $j=strpos($str, $rt, 0);
+      while($j!==false){
+         $total[]=$j;
+         $j=strpos($str, $rt, $j+1);
+      }
+      sort($total);
+      
+      $cs='';
+      foreach($font_data as $k=>$v){
+         $cs.=$k . ':'. $v . '; ';
+      }
+      $cs=$this->get_style($cs);
+      $tmp=array($cs);
+      $blocks=array();
+      $blockstyle=array();
+      $n=count($total);
+      $k=0;
+      for($i=0; $i<$n; $i++){
+         $blocks[]=substr($str, $k, $total[$i]-$k);
+         $blockstyle[]=$cs;
+         if(isset($open[$total[$i]])){
+            $cs=$this->style_merge($cs, $this->get_style($open[$total[$i]]));
+            array_push($tmp, $cs);
+            $k=strpos($str, '>',$total[$i]+1)+1;
+         }
+         else{
+            $k=$total[$i]+4;
+            array_pop($tmp);
+            $l=count($tmp)-1;
+            $cs=$tmp[$l];
+         }
+      }
+      if($k<strlen($str)){
+         $blocks[]=substr($str, $k);
+         $blockstyle[]=$cs;
+      }
+      $n=count($blocks);
+      for($i=0; $i<$n; $i++){
+         $this->parced_str.=strtr($blocks[$i], array('\<s'=>'<s'));
+         if(strlen($blocks[$i])>0){
+            $blockstyle[$i]['style']=$blockstyle[$i]['font-weight'] . $blockstyle[$i]['font-style'];
+            unset($blockstyle[$i]['font-weight']);
+            unset($blockstyle[$i]['font-style']);
+            $this->style_map[strlen($this->parced_str)-1]=$blockstyle[$i];
+         }
+      }
+   }
+
+   public function __construct($text, $width, &$font_data){
+      $this->iterator=0;
+      $this->parced_str='';
+      $this->style_map=array();
+      $this->style_parcer($text, $font_data);
+      $this->positions=array_keys($this->style_map);
+      $this->np=(bool)count($this->positions);
+      $this->width=$width;
+      $this->lines=array('');
+      $this->linesmap[0]=array(0, 0, 0);
+      $this->used_fonts=array();
+   }
+
+   public function get_str(){
+      return $this->parced_str;
+   }
+
+   public function get_current_style($i){
+      if(!$this->np){
+         return '';
+      }
+      while($this->positions[$this->iterator]<$i){
+         $this->iterator++;
+      }
+      return $this->style_map[$this->positions[$this->iterator]];
+   }
+   
+
+      public function break_by_style($t){
+      $i=$this->linesmap[$t][0];
+      $j=$this->linesmap[$t][1];
+      $this->iterator=0;
+      $result=array('chunks'=>array(), 'style'=>array(), 'height'=>0, 'width'=>$this->linesmap[$t][2]);
+      if(strlen($this->parced_str)==0){
+         return $result;
+      }
+      $cs=$this->get_current_style($i);
+      $result['height']=$cs['font-size'];
+      $r=0;
+      $result['chunks'][$r]='';
+      $result['style'][$r]=$cs;
+      while($this->parced_str[$j]==' '){
+         $j--;
+      }
+      $tmp=$i;
+         for($k=$i; $k<=$j; $k++){
+         if($this->parced_str[$tmp]==' ' && $this->parced_str[$k]==' '){
+            $tmp=$k;
+            continue;
+         }
+            if($cs!=$this->get_current_style($k)) {
+            $r++;
+            $cs=$this->get_current_style($k);
+            $result['chunks'][$r]='';
+            $result['style'][$r]=$cs;
+            if($result['height']<$cs['font-size']){
+               $result['height']=$cs['font-size'];
+            }
+         }
+         $result['chunks'][$r].=$this->parced_str[$k];
+         $tmp=$k;
+      }
+      return $result;
+   }
+}
+?>
