PDF, utilise FPDF
* Distribu� sous la licence LGPL.
*
* @author Laurent MINGUET
* @version 3.31
*/
if (!defined('__CLASS_HTML2PDF__'))
{
define('__CLASS_HTML2PDF__', '3.31');
require_once(dirname(__FILE__).'/_mypdf/mypdf.class.php'); // classe mypdf
require_once(dirname(__FILE__).'/parsingHTML.class.php'); // classe de parsing HTML
require_once(dirname(__FILE__).'/styleHTML.class.php'); // classe de gestion des styles
global $HTML2PDF_TABLEAU; $HTML2PDF_TABLEAU = array(); // tableau global necessaire � la gestion des tables imbriqu�es
global $HTML2PDF_TEXTES; $HTML2PDF_TEXTES = array(); // tableau comprennant le fichier de langue
class HTML2PDF
{
var $pdf = null; // objet PDF
var $style = null; // objet de style
var $parsing = null; // objet de parsing
var $langue = 'fr'; // langue des messages
var $sens = 'P'; // sens d'affichage Portrait ou Landscape
var $format = 'A4'; // format de la page : A4, A3, ...
var $encoding = ''; // charset encoding
var $background = array(); // informations sur le background
var $testTDin1page = true; // activer le test de TD ne devant pas depasser une page
var $testIsImage = true; // test si les images existes ou non
var $testIsDeprecated = false; // test si certaines fonctions sont deprecated
var $isSubPart = false; // indique que le convertisseur courant est un sous html
var $parse_pos = 0; // position du parsing
var $temp_pos = 0; // position temporaire pour multi tableau
var $page = 0; // numero de la page courante
var $sub_html = null; // sous html
var $sub_part = false; // indicateur de sous html
var $maxX = 0; // zone maxi X
var $maxY = 0; // zone maxi Y
var $maxE = 0; // nomre d'elements dans la zone
var $maxH = 0; // plus grande hauteur dans la ligne, pour saut de ligne � corriger
var $maxSave = array(); // tableau de sauvegarde des maximaux
var $currentH = 0; // hauteur de la ligne courante
var $firstPage = true; // premier page
var $defaultLeft = 0; // marges par default de la page
var $defaultTop = 0;
var $defaultRight = 0;
var $defaultBottom = 0;
var $margeLeft = 0; //marges r�elles de la page
var $margeTop = 0;
var $margeRight = 0;
var $margeBottom = 0;
var $marges = array(); // tableau de sauvegarde des differents etats des marges de la page courante
var $inLink = ''; // indique si on est � l'interieur d'un lien
var $lstAncre = array(); // liste des ancres d�tect�es ou cr��es
var $subHEADER = array(); // tableau des sous commandes pour faire l'HEADER
var $subFOOTER = array(); // tableau des sous commandes pour faire le FOOTER
var $subSTATES = array(); // tableau de sauvegarde de certains param�tres
var $defLIST = array(); // tableau de sauvegarde de l'etat des UL et OL
var $lstChamps = array(); // liste des champs
var $lstSelect = array(); // options du select en cours
var $previousCall = null; // dernier appel
var $pageMarges = array(); // marges sp�cifiques dues aux floats
var $isInThead = false; // indique si on est dans un thead
var $isInTfoot = false; // indique si on est dans un tfoot
var $isInOverflow = false; // indique si on est dans une div overflow
var $isInFooter = false; // indique si on est dans un footer ou non
var $isInDraw = null; // indique si on est en mode dessin
var $isAfterFloat = false; // indique si on est apres un float
var $forOneLine = false; // indique si on est dans un sous HTML ne servant qu'a calculer la taille de la prochaine ligne
var $isInForm = false; // indique si on est dans un formulaire. Contient dans ce cas l� l'action de celui-ci
var $DEBUG_actif = false; // indique si on est en mode debug
var $DEBUG_ok_usage = false; // indique l'existance de la fonction memory_get_usage
var $DEBUG_ok_peak = false; // indique l'existance de la fonction memory_get_peak_usage
var $DEBUG_level = 0; // niveau du debug
var $DEBUG_start_time = 0; //
var $DEBUG_last_time = 0; //
var $defaultFont = null; // fonte par d�faut si la fonte demand�e n'existe pas
/**
* Constructeur
*
* @param string sens portrait ou landscape
* @param string format A4, A5, ...
* @param string langue : fr, en, it...
* @param array marges par defaut, dans l'ordre (left, top, right, bottom)
* @return null
*/
function HTML2PDF($sens = 'P', $format = 'A4', $langue='fr', $marges = array(5, 5, 5, 8))
{
// sauvegarde des param�tres
$this->page = 0;
$this->sens = $sens;
$this->format = $format;
$this->encoding = 'ISO-8859-15';
$this->firstPage = true;
$this->langue = strtolower($langue);
// chargement du fichier de langue
HTML2PDF::textLOAD($this->langue);
// cr�ation de l' objet PDF
$this->pdf = new MyPDF($sens, 'mm', $format);
// initialisation des styles
$this->style = new styleHTML($this->pdf);
$this->style->FontSet();
$this->defLIST = array();
// initialisations diverses
$this->setTestTdInOnePage(true);
$this->setTestIsImage(true);
$this->setTestIsDeprecated(true);
$this->setDefaultFont(null);
// initialisation du parsing
$this->parsing = new parsingHTML($this->encoding);
$this->sub_html = null;
$this->sub_part = false;
// initialisation des marges
if (!is_array($marges)) $marges = array($marges, $marges, $marges, $marges);
$this->setDefaultMargins($marges[0], $marges[1], $marges[2], $marges[3]);
$this->setMargins();
$this->marges = array();
// initialisation des champs de formulaire
$this->lstChamps = array();
}
/**
* activer le debug mode
*
* @return null
*/
function setModeDebug()
{
list($usec, $sec) = explode(' ', microtime());
$this->DEBUG_actif = true;
$this->DEBUG_ok_usage = function_exists('memory_get_usage');
$this->DEBUG_ok_peak = function_exists('memory_get_peak_usage');
$this->DEBUG_start_time = (float)$sec + (float)$usec;
$this->DEBUG_last_time = (float)$sec + (float)$usec;
$this->DEBUG_stepline('step', 'time', 'delta', 'memory', 'peak');
$this->DEBUG_add('Init debug');
}
/**
* rajouter une ligne de debug
*
* @param string nom de l'etape
* @param boolean true=monter d'un niveau, false=descendre d'un niveau, null : ne rien faire
* @return null
*/
function DEBUG_add($nom, $level=null)
{
list($usec, $sec) = explode(' ', microtime());
if ($level===true) $this->DEBUG_level++;
$nom = str_repeat(' ',$this->DEBUG_level). $nom.($level===true ? ' Begin' : ($level===false ? ' End' : ''));
$time = (float)$sec + (float)$usec;
$usage = ($this->DEBUG_ok_usage ? memory_get_usage() : 0);
$peak = ($this->DEBUG_ok_peak ? memory_get_peak_usage() : 0);
$this->DEBUG_stepline(
$nom,
number_format(($time - $this->DEBUG_start_time)*1000, 1, '.', ' ').' ms',
number_format(($time - $this->DEBUG_last_time)*1000, 1, '.', ' ').' ms',
number_format($usage/1024, 1, '.', ' ').' Ko',
number_format($peak/1024, 1, '.', ' ').' Ko');
$this->DEBUG_last_time = $time;
if ($level===false) $this->DEBUG_level--;
return true;
}
/**
* affiche une ligne de debug
*
* @param string nom de l'etape
* @param string valeur 1
* @param string valeur 2
* @param string valeur 3
* @param string valeur 4
* @return null
*/
function DEBUG_stepline($nom, $val1, $val2, $val3, $val4)
{
$txt = str_pad($nom, 30, ' ', STR_PAD_RIGHT).
str_pad($val1, 12, ' ', STR_PAD_LEFT).
str_pad($val2, 12, ' ', STR_PAD_LEFT).
str_pad($val3, 15, ' ', STR_PAD_LEFT).
str_pad($val4, 15, ' ', STR_PAD_LEFT);
echo '
'.$txt.'
';
}
/**
* renseigner l'encoding � utiliser
*
* @param string nouvel encoding
* @return string ancien encoding
*/
function setEncoding($encoding = 'ISO-8859-15')
{
$old = $this->encoding;
$this->encoding = $encoding;
$this->parsing->setEncoding($this->encoding);
return $old;
}
/**
* activer ou desactiver le test de TD ne devant pas depasser une page
*
* @param boolean nouvel etat
* @return boolean ancien etat
*/
function setTestTdInOnePage($mode = true)
{
$old = $this->testTDin1page;
$this->testTDin1page = $mode ? true : false;
return $old;
}
/**
* activer ou desactiver le test sur la pr�sence des images
*
* @param boolean nouvel etat
* @return boolean ancien etat
*/
function setTestIsImage($mode = true)
{
$old = $this->testIsImage;
$this->testIsImage = $mode ? true : false;
return $old;
}
/**
* activer ou desactiver le test sur les fonctions deprecated
*
* @param boolean nouvel etat
* @return boolean ancien etat
*/
function setTestIsDeprecated($mode = true)
{
$old = $this->testIsDeprecated;
$this->testIsDeprecated = $mode ? true : false;
return $old;
}
/**
* d�finit la fonte par d�faut si aucun fonte n'est sp�cifi�e, ou si la fonte demand�e n'existe pas
*
* @param string nom de la fonte par defaut. si null : Arial pour fonte non sp�cifi�e, et erreur pour fonte non existante
* @return string nom de l'ancienne fonte par defaut
*/
function setDefaultFont($default = null)
{
$old = $this->defaultFont;
$this->defaultFont = $default;
$this->style->setDefaultFont($default);
return $old;
}
/**
* d�finir les marges par d�fault
*
* @param int en mm, marge left
* @param int en mm, marge top
* @param int en mm, marge right. si null, left=right
* @param int en mm, marge bottom. si null, bottom=8
* @return null
*/
function setDefaultMargins($left, $top, $right = null, $bottom = null)
{
if ($right===null) $right = $left;
if ($bottom===null) $bottom = 8;
$this->defaultLeft = $this->style->ConvertToMM($left.'mm');
$this->defaultTop = $this->style->ConvertToMM($top.'mm');
$this->defaultRight = $this->style->ConvertToMM($right.'mm');
$this->defaultBottom = $this->style->ConvertToMM($bottom.'mm');
}
/**
* d�finir les marges r�elles, fonctions de la balise page
*
* @return null
*/
function setMargins()
{
$this->margeLeft = $this->defaultLeft + (isset($this->background['left']) ? $this->background['left'] : 0);
$this->margeRight = $this->defaultRight + (isset($this->background['right']) ? $this->background['right'] : 0);
$this->margeTop = $this->defaultTop + (isset($this->background['top']) ? $this->background['top'] : 0);
$this->margeBottom = $this->defaultBottom + (isset($this->background['bottom']) ? $this->background['bottom'] : 0);
$this->pdf->SetMargins($this->margeLeft, $this->margeTop, $this->margeRight);
$this->pdf->setcMargin(0);
$this->pdf->SetAutoPageBreak(false, $this->margeBottom);
$this->pageMarges = array();
$this->pageMarges[floor($this->margeTop*100)] = array($this->margeLeft, $this->pdf->getW()-$this->margeRight);
}
/**
* recuperer les positions x minimales et maximales en fonction d'une hauteur
*
* @param float y
* @return array(float, float)
*/
function getMargins($y)
{
$y = floor($y*100);
$x = array($this->pdf->getlMargin(), $this->pdf->getW()-$this->pdf->getrMargin());
foreach($this->pageMarges as $m_y => $m_x)
if ($m_y<=$y) $x = $m_x;
return $x;
}
/**
* ajouter une marge suite a un float
*
* @param string left ou right
* @param float x1
* @param float y1
* @param float x2
* @param float y2
* @return null
*/
function addMargins($float, $x1, $y1, $x2, $y2)
{
$old1 = $this->getMargins($y1);
$old2 = $this->getMargins($y2);
if ($float=='left') $old1[0] = $x2;
if ($float=='right') $old1[1] = $x1;
$y1 = floor($y1*100);
$y2 = floor($y2*100);
foreach($this->pageMarges as $m_y => $m_x)
{
if ($m_y<$y1) continue;
if ($m_y>$y2) break;
if ($float=='left' && $this->pageMarges[$m_y][0]<$x2) unset($this->pageMarges[$m_y]);
if ($float=='right' && $this->pageMarges[$m_y][1]>$x1) unset($this->pageMarges[$m_y]);
}
$this->pageMarges[$y1] = $old1;
$this->pageMarges[$y2] = $old2;
ksort($this->pageMarges);
$this->isAfterFloat = true;
}
/**
* d�finir des nouvelles marges et sauvegarder les anciennes
*
* @param float marge left
* @param float marge top
* @param float marge right
* @return null
*/
function saveMargin($ml, $mt, $mr)
{
$this->marges[] = array('l' => $this->pdf->getlMargin(), 't' => $this->pdf->gettMargin(), 'r' => $this->pdf->getrMargin(), 'page' => $this->pageMarges);
$this->pdf->SetMargins($ml, $mt, $mr);
$this->pageMarges = array();
$this->pageMarges[floor($mt*100)] = array($ml, $this->pdf->getW()-$mr);
}
/**
* r�cuperer les derni�res marches sauv�es
*
* @return null
*/
function loadMargin()
{
$old = array_pop($this->marges);
if ($old)
{
$ml = $old['l'];
$mt = $old['t'];
$mr = $old['r'];
$mP = $old['page'];
}
else
{
$ml = $this->margeLeft;
$mt = 0;
$mr = $this->margeRight;
$mP = array($mt => array($ml, $this->pdf->getW()-$mr));
}
$this->pdf->SetMargins($ml, $mt, $mr);
$this->pageMarges = $mP;
}
/**
* permet d'ajouter une fonte.
*
* @param string nom de la fonte
* @param string style de la fonte
* @param string fichier de la fonte
* @return null
*/
function addFont($family, $style='', $file='')
{
$this->pdf->AddFont($family, $style, $file);
}
/**
* sauvegarder l'�tat actuelle des maximums
*
* @return null
*/
function saveMax()
{
$this->maxSave[] = array($this->maxX, $this->maxY, $this->maxH, $this->maxE);
}
/**
* charger le dernier �tat sauv� des maximums
*
* @return null
*/
function loadMax()
{
$old = array_pop($this->maxSave);
if ($old)
{
$this->maxX = $old[0];
$this->maxY = $old[1];
$this->maxH = $old[2];
$this->maxE = $old[3];
}
else
{
$this->maxX = 0;
$this->maxY = 0;
$this->maxH = 0;
$this->maxE = 0;
}
}
/**
* afficher l'header contenu dans page_header
*
* @return null
*/
function setPageHeader()
{
if (!count($this->subHEADER)) return false;
$OLD_parse_pos = $this->parse_pos;
$OLD_parse_code = $this->parsing->code;
$this->parse_pos = 0;
$this->parsing->code = $this->subHEADER;
$this->makeHTMLcode();
$this->parse_pos = $OLD_parse_pos;
$this->parsing->code = $OLD_parse_code;
}
/**
* afficher le footer contenu dans page_footer
*
* @return null
*/
function setPageFooter()
{
if (!count($this->subFOOTER)) return false;
$OLD_parse_pos = $this->parse_pos;
$OLD_parse_code = $this->parsing->code;
$this->parse_pos = 0;
$this->parsing->code = $this->subFOOTER;
$this->isInFooter = true;
$this->makeHTMLcode();
$this->isInFooter = false;
$this->parse_pos = $OLD_parse_pos;
$this->parsing->code = $OLD_parse_code;
}
/**
* saut de ligne avec une hauteur sp�cifique
*
* @param float hauteur de la ligne
* @param integer position reelle courante si saut de ligne pendant l'ecriture d'un texte
* @return null
*/
function setNewLine($h, $curr = null)
{
$this->pdf->Ln($h);
$this->setNewPositionForNewLine($curr);
}
/**
* cr�ation d'une nouvelle page avec le format et l'orientation sp�cifies
*
* @param mixed format de la page : A5, A4, array(width, height)
* @param string sens P=portrait ou L=landscape
* @param array tableau des propri�t�s du fond de la page
* @param integer position reelle courante si saut de ligne pendant l'ecriture d'un texte
* @return null
*/
function setNewPage($format = null, $orientation = '', $background = null, $curr = null)
{
$this->firstPage = false;
$this->format = $format ? $format : $this->format;
$this->sens = $orientation ? $orientation : $this->sens;
$this->background = $background!==null ? $background : $this->background;
$this->maxY = 0;
$this->maxX = 0;
$this->maxH = 0;
$this->pdf->SetMargins($this->defaultLeft, $this->defaultTop, $this->defaultRight);
$this->pdf->AddPage($this->sens, $this->format);
$this->page++;
if (!$this->sub_part && !$this->isSubPart)
{
if (is_array($this->background))
{
if (isset($this->background['color']) && $this->background['color'])
{
$this->pdf->setMyFillColor($this->background['color']);
$this->pdf->Rect(0, 0, $this->pdf->getW(), $this->pdf->getH(), 'F');
}
if (isset($this->background['img']) && $this->background['img'])
$this->pdf->Image($this->background['img'], $this->background['posX'], $this->background['posY'], $this->background['width']);
}
$this->setPageHeader();
$this->setPageFooter();
}
$this->setMargins();
$this->pdf->setY($this->margeTop);
$this->setNewPositionForNewLine($curr);
$this->maxH = 0;
}
/**
* calcul de la position de debut de la prochaine ligne en fonction de l'alignement voulu
*
* @param integer position reelle courante si saut de ligne pendant l'ecriture d'un texte
* @return null
*/
function setNewPositionForNewLine($curr = null)
{
list($lx, $rx) = $this->getMargins($this->pdf->getY());
$this->pdf->setX($lx);
$wMax = $rx-$lx;
$this->currentH = 0;
if ($this->sub_part || $this->isSubPart || $this->forOneLine)
{
// $this->pdf->setWordSpacing(0);
return null;
}
/*
if (
$this->style->value['text-align']!='right' &&
$this->style->value['text-align']!='center' &&
$this->style->value['text-align']!='justify'
)
{
// $this->pdf->setWordSpacing(0);
return null;
}
*/
$sub = null;
$this->createSubHTML($sub);
$sub->saveMargin(0, 0, $sub->pdf->getW()-$wMax);
$sub->forOneLine = true;
$sub->parse_pos = $this->parse_pos;
$sub->parsing->code = $this->parsing->code;
if ($curr!==null && $sub->parsing->code[$this->parse_pos]['name']=='write')
{
$txt = $sub->parsing->code[$this->parse_pos]['param']['txt'];
$txt = str_replace('[[page_cu]]', $sub->page, $txt);
$sub->parsing->code[$this->parse_pos]['param']['txt'] = substr($txt, $curr);
}
else
$sub->parse_pos++;
// pour chaque element identifi� par le parsing
$res = null;
for($sub->parse_pos; $sub->parse_posparsing->code); $sub->parse_pos++)
{
$todo = $sub->parsing->code[$sub->parse_pos];
$res = $sub->loadAction($todo);
if (!$res) break;
}
$w = $sub->maxX; // largeur maximale
$h = $sub->maxH; // hauteur maximale
$e = ($res===null ? $sub->maxE : 0); // nombre d'�l�ments maximal
$this->destroySubHTML($sub);
if ($this->style->value['text-align']=='center')
$this->pdf->setX(($rx+$this->pdf->getX()-$w)*0.5-0.01);
elseif ($this->style->value['text-align']=='right')
$this->pdf->setX($rx-$w-0.01);
else
$this->pdf->setX($lx);
$this->currentH = $h;
/*
if ($this->style->value['text-align']=='justify' && $e>1)
$this->pdf->setWordSpacing(($wMax-$w)/($e-1));
else
$this->pdf->setWordSpacing(0);
*/
}
/**
* r�cup�ration du PDF
*
* @param string nom du fichier PDF
* @param boolean destination
* @return string contenu �ventuel du pdf
*
*
* Destination o� envoyer le document. Le param�tre peut prendre les valeurs suivantes :
* true : equivalent � I
* false : equivalent � S
* I : envoyer en inline au navigateur. Le plug-in est utilis� s'il est install�. Le nom indiqu� dans name est utilis� lorsque l'on s�lectionne "Enregistrer sous" sur le lien g�n�rant le PDF.
* D : envoyer au navigateur en for�ant le t�l�chargement, avec le nom indiqu� dans name.
* F : sauver dans un fichier local, avec le nom indiqu� dans name (peut inclure un r�pertoire).
* S : renvoyer le document sous forme de cha�ne. name est ignor�.
*/
function Output($name = '', $dest = false)
{
// nettoyage
global $HTML2PDF_TABLEAU; $HTML2PDF_TABLEAU = array();
if ($this->DEBUG_actif)
{
$this->DEBUG_add('Before output');
$this->pdf->Close();
exit;
}
// interpretation des param�tres
if ($dest===false) $dest = 'I';
if ($dest===true) $dest = 'S';
if ($dest==='') $dest = 'I';
if ($name=='') $name='document.pdf';
// verification de la destination
$dest = strtoupper($dest);
if (!in_array($dest, array('I', 'D', 'F', 'S'))) $dest = 'I';
// verification du nom
if (strtolower(substr($name, -4))!='.pdf')
{
echo 'ERROR : The output document name "'.$name.'" is not a PDF name';
exit;
}
return $this->pdf->Output($name, $dest);
}
/**
* cr�ation d'un sous HTML2PDF pour la gestion des tableaux imbriqu�s
*
* @param HTML2PDF futur sous HTML2PDF pass� en r�f�rence pour cr�ation
* @param integer marge eventuelle de l'objet si simulation d'un TD
* @return null
*/
function createSubHTML(&$sub_html, $cellmargin=0)
{
// calcul de la largueur
if ($this->style->value['width'])
{
$marge = $cellmargin*2;
$marge+= $this->style->value['padding']['l'] + $this->style->value['padding']['r'];
$marge+= $this->style->value['border']['l']['width'] + $this->style->value['border']['r']['width'];
$marge = $this->pdf->getW() - $this->style->value['width'] + $marge;
}
else
$marge = $this->margeLeft+$this->margeRight;
//clonage
$sub_html = new HTML2PDF(
$this->sens,
$this->format,
$this->langue,
array($this->defaultLeft,$this->defaultTop,$this->defaultRight,$this->defaultBottom)
);
$sub_html->setIsSubPart();
$sub_html->setEncoding($this->encoding);
$sub_html->setTestTdInOnePage($this->testTDin1page);
$sub_html->setTestIsImage($this->testIsImage);
$sub_html->setTestIsDeprecated($this->testIsDeprecated);
$sub_html->setDefaultFont($this->defaultFont);
$sub_html->style->css = $this->style->css;
$sub_html->style->css_keys = $this->style->css_keys;
$sub_html->pdf->cloneFontFrom($this->pdf);
$sub_html->style->table = $this->style->table;
$sub_html->style->value = $this->style->value;
$sub_html->style->setOnlyLeft();
$sub_html->setNewPage($this->format, $this->sens);
$sub_html->initSubHtml($marge, $this->page, $this->defLIST);
// initialisation des positions et autre
$sub_html->maxX = 0;
$sub_html->maxY = 0;
$sub_html->maxH = 0;
$sub_html->pdf->setXY(0, 0);
}
/**
* initialise le sous HTML2PDF. Ne pas utiliser directement. seul la fonction createSubHTML doit l'utiliser
*
* @return null
*/
function initSubHtml($marge, $page, $defLIST)
{
$this->saveMargin(0, 0, $marge);
$this->defLIST = $defLIST;
$this->page = $page;
$this->pdf->setXY(0, 0);
$this->style->FontSet();
}
function setIsSubPart()
{
$this->isSubPart = true;
}
/**
* destruction d'un sous HTML2PDF pour la gestion des tableaux imbriqu�s
*
* @return null
*/
function destroySubHTML(&$sub_html)
{
unset($sub_html);
$sub_html = null;
}
/**
* Convertir un nombre arabe en nombre romain
*
* @param integer nombre � convertir
* @return string nombre converti
*/
function listeArab2Rom($nb_ar)
{
$nb_b10 = array('I','X','C','M');
$nb_b5 = array('V','L','D');
$nb_ro = '';
if ($nb_ar<1) return $nb_ar;
if ($nb_ar>3999) return $nb_ar;
for($i=3; $i>=0 ; $i--)
{
$chiffre=floor($nb_ar/pow(10,$i));
if($chiffre>=1)
{
$nb_ar=$nb_ar-$chiffre*pow(10,$i);
if($chiffre<=3)
{
for($j=$chiffre; $j>=1; $j--)
{
$nb_ro=$nb_ro.$nb_b10[$i];
}
}
else if($chiffre==9)
{
$nb_ro=$nb_ro.$nb_b10[$i].$nb_b10[$i+1];
}
elseif($chiffre==4)
{
$nb_ro=$nb_ro.$nb_b10[$i].$nb_b5[$i];
}
else
{
$nb_ro=$nb_ro.$nb_b5[$i];
for($j=$chiffre-5; $j>=1; $j--)
{
$nb_ro=$nb_ro.$nb_b10[$i];
}
}
}
}
return $nb_ro;
}
/**
* Ajouter un LI au niveau actuel
*
* @return null
*/
function listeAddLi()
{
$this->defLIST[count($this->defLIST)-1]['nb']++;
}
function listeGetWidth() { return '7mm'; }
function listeGetPadding() { return '1mm'; }
/**
* Recuperer le LI du niveau actuel
*
* @return string chaine � afficher
*/
function listeGetLi()
{
$im = $this->defLIST[count($this->defLIST)-1]['img'];
$st = $this->defLIST[count($this->defLIST)-1]['style'];
$nb = $this->defLIST[count($this->defLIST)-1]['nb'];
$up = (substr($st, 0, 6)=='upper-');
if ($im) return array(false, false, $im);
switch($st)
{
case 'none':
return array('helvetica', true, ' ');
case 'upper-alpha':
case 'lower-alpha':
$str = '';
while($nb>26)
{
$str = chr(96+$nb%26).$str;
$nb = floor($nb/26);
}
$str = chr(96+$nb).$str;
return array('helvetica', false, ($up ? strtoupper($str) : $str).'.');
case 'upper-roman':
case 'lower-roman':
$str = $this->listeArab2Rom($nb);
return array('helvetica', false, ($up ? strtoupper($str) : $str).'.');
case 'decimal':
return array('helvetica', false, $nb.'.');
case 'square':
return array('zapfdingbats', true, chr(110));
case 'circle':
return array('zapfdingbats', true, chr(109));
case 'disc':
default:
return array('zapfdingbats', true, chr(108));
}
}
/**
* Ajouter un niveau de liste
*
* @param string type de liste : ul, ol
* @param string style de la liste
* @return null
*/
function listeAddLevel($type = 'ul', $style = '', $img = null)
{
if ($img)
{
if (preg_match('/^url\(([^)]+)\)$/isU', trim($img), $match))
$img = $match[1];
else
$img = null;
}
else
$img = null;
if (!in_array($type, array('ul', 'ol'))) $type = 'ul';
if (!in_array($style, array('lower-alpha', 'upper-alpha', 'upper-roman', 'lower-roman', 'decimal', 'square', 'circle', 'disc', 'none'))) $style = '';
if (!$style)
{
if ($type=='ul') $style = 'disc';
else $style = 'decimal';
}
$this->defLIST[count($this->defLIST)] = array('style' => $style, 'nb' => 0, 'img' => $img);
}
/**
* Supprimer un niveau de liste
*
* @return null
*/
function listeDelLevel()
{
if (count($this->defLIST))
{
unset($this->defLIST[count($this->defLIST)-1]);
$this->defLIST = array_values($this->defLIST);
}
}
/**
* traitement d'un code HTML fait pour HTML2PDF
*
* @param string code HTML � convertir
* @param boolean afficher en pdf (false) ou en html adapt� (true)
* @return null
*/
function writeHTML($html, $vue = false)
{
// si c'est une vrai page HTML, une conversion s'impose
if (preg_match('/getHtmlFromPage($html);
$html = str_replace('[[page_nb]]', '{nb}', $html);
$html = str_replace('[[date_y]]', date('Y'), $html);
$html = str_replace('[[date_m]]', date('m'), $html);
$html = str_replace('[[date_d]]', date('d'), $html);
$html = str_replace('[[date_h]]', date('H'), $html);
$html = str_replace('[[date_i]]', date('i'), $html);
$html = str_replace('[[date_s]]', date('s'), $html);
// si on veut voir le r�sultat en HTML => on appelle la fonction
if ($vue) $this->vueHTML($html);
// sinon, traitement pour conversion en PDF :
// parsing
$this->sub_pdf = false;
$this->style->readStyle($html);
$this->parsing->setHTML($html);
$this->parsing->parse();
$this->makeHTMLcode();
}
/**
* traitement du code d'une vrai page HTML pour l'adapter � HTML2PDF
*
* @param string code HTML � adapter
* @return string code HTML adapt�
*/
function getHtmlFromPage($html)
{
$html = str_replace('';
// extraction des balises link
preg_match_all('/]*)>/isU', $html, $match);
foreach($match[0] as $src)
$content = $src.''.$content;
// extraction des balises style
preg_match_all('/