PDF, utilise fpdf de Olivier PLATHEY
* Distribué sous la licence LGPL.
*
* @author Laurent MINGUET
* @version 3.28 - 18/01/2010
*/
if (!defined('__CLASS_HTML2PDF__'))
{
define('__CLASS_HTML2PDF__', '3.28');
require_once(dirname(__FILE__).'/_mypdf/mypdf.class.php'); // classe mypdf dérivé de fpdf de Olivier PLATHEY
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
class HTML2PDF
{
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 $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 $style = null; // objet de style
var $parsing = null; // objet de parsing
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 $isSubPart = false; // indique que le convertisseur courant est un sous html
var $pdf = null; // objet PDF
var $maxX = 0; // zone maxi X
var $maxY = 0; // zone maxi Y
var $maxE = 0; // nomre d'elements dans la zone
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();
var $Maxs = array();
var $maxH = 0; // plus grande hauteur dans la ligne, pour saut de ligne à corriger
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 $isAfterFloat = false; // indique si on est apres un float
var $isInDraw = null; // indique si on est en mode dessin
var $forOneLine = false; // indique si on est dans un sous HTML ne servant qu'a calculer la taille de la prochaine ligne
var $encoding = 'ISO-8859-15'; // encodage utilisé pour les entites html
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)
* @param boolean forcer la création de la premiere page, ne pas utiliser, c'est utilisé en interne pour la gestion des tableaux
* @return null
*/
function HTML2PDF($sens = 'P', $format = 'A4', $langue='fr', $marges = array(5, 5, 5, 8), $force_page = false)
{
// sauvegarde des paramètres
$this->page = 0;
$this->sens = $sens;
$this->format = $format;
$this->FirstPage = true;
$this->langue = strtolower($langue);
// chargement du fichier de langue
$this->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->setDefaultFont(null);
// initialisation du parsing
$this->parsing = new parsingHTML();
$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();
// premier page forcée
if ($force_page) $this->setNewPage($this->format, $this->sens);
}
/**
* 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.'
';
}
/**
* 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;
}
/**
* renseigner l'encoding à utiliser
*
* @param string nouvel encoding
* @return string ancien encoding
*/
function setEncoding($encoding = 'ISO-8859-15')
{
$old = $this->encoding;
$this->encoding = $encoding;
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;
}
/**
* 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->cMargin = 0;
$this->pdf->SetAutoPageBreak(false, $this->margeBottom);
$this->pageMarges = array();
$this->pageMarges[floor($this->margeTop*100)] = array($this->margeLeft, $this->pdf->w-$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->lMargin, $this->pdf->w-$this->pdf->rMargin);
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->lMargin, 't' => $this->pdf->tMargin, 'r' => $this->pdf->rMargin, 'page' => $this->pageMarges);
$this->pdf->SetMargins($ml, $mt, $mr);
$this->pageMarges = array();
$this->pageMarges[floor($mt*100)] = array($ml, $this->pdf->w-$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->w-$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->Maxs[] = array($this->maxX, $this->maxY, $this->maxH);
}
/**
* charger le dernier état sauvé des maximums
*
* @return null
*/
function loadMax()
{
$old = array_pop($this->Maxs);
if ($old)
{
$this->maxX = $old[0];
$this->maxY = $old[1];
$this->maxH = $old[2];
}
else
{
$this->maxX = 0;
$this->maxY = 0;
$this->maxH = 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->MakeHTMLcode();
$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->lMargin = $this->defaultLeft;
$this->pdf->rMargin = $this->defaultRight;
$this->pdf->tMargin = $this->defaultTop;
$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->w, $this->pdf->h, '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->y = $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->y);
$this->pdf->x=$lx;
$wMax = $rx-$lx;
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->w-$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')
$sub->parsing->code[$this->parse_pos]['param']['txt'] = substr($sub->parsing->code[$this->parse_pos]['param']['txt'], $curr);
else
$sub->parse_pos++;
// pour chaque element identifié par le parsing
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
$e = ($res===null ? $sub->maxE : 0); // nombre d'éléments maximal
$this->DestroySubHTML($sub);
if ($this->style->value['text-align']=='center')
$this->pdf->x+= ($rx-$this->pdf->x-$w)*0.5-0.01;
elseif ($this->style->value['text-align']=='right')
$this->pdf->x = $rx-$w-0.01;
else
$this->pdf->x = $lx;
/*
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)
{
if ($this->DEBUG_actif)
{
$this->DEBUG_add('Before output');
$this->pdf->Close();
exit;
}
// nettoyage
global $HTML2PDF_TABLEAU; $HTML2PDF_TABLEAU = array();
// 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)
{
// initialisation du sous objet
$sub_html = new HTML2PDF(
$this->sens,
$this->format,
$this->langue,
array($this->defaultLeft,$this->defaultTop,$this->defaultRight,$this->defaultBottom),
true
);
$sub_html->isSubPart = true;
$sub_html->setEncoding($this->encoding);
$sub_html->setTestTdInOnePage($this->testTDin1page);
$sub_html->setTestIsImage($this->testIsImage);
$sub_html->setDefaultFont($this->defaultFont);
$sub_html->style->css = $this->style->css;
$sub_html->style->css_keys = $this->style->css_keys;
$sub_html->style->table = $this->style->table;
$sub_html->style->value = $this->style->value;
$sub_html->style->value['text-align'] = 'left';
$sub_html->defLIST = $this->defLIST;
$sub_html->style->onlyLeft = true;
// initialisation de la largeur
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 = $sub_html->pdf->w - $this->style->value['width'] + $marge;
}
else
$marge = $this->margeLeft+$this->margeRight;
$sub_html->saveMargin(0, 0, $marge);
// initialisation des fontes
$sub_html->pdf->fonts = &$this->pdf->fonts;
$sub_html->pdf->FontFiles = &$this->pdf->FontFiles;
$sub_html->pdf->diffs = &$this->pdf->diffs;
// initialisation des positions et autre
$sub_html->page = $this->page;
$sub_html->maxX = 0;
$sub_html->maxY = 0;
$sub_html->maxH = 0;
$sub_html->pdf->setXY(0, 0);
$sub_html->style->FontSet();
}
/**
* destruction d'un sous HTML2PDF pour la gestion des tableaux imbriqués
*
* @return null
*/
function DestroySubHTML(&$sub_html)
{
$sub_html->pdf->Close();
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('arial', 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('arial', false, ($up ? strtoupper($str) : $str).'.');
case 'upper-roman':
case 'lower-roman':
$str = $this->listeArab2Rom($nb);
return array('arial', false, ($up ? strtoupper($str) : $str).'.');
case 'decimal':
return array('arial', 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
*
* @param string code HTML à convertir
* @param boolean afficher en pdf (false) ou en html (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();
}
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('/