source: pmb4.2/trunk/fuentes/pmb/classes/pdf_html.class.php @ 815

Last change on this file since 815 was 815, checked in by jrpelegrina, 4 years ago

Initial release of pmb 4.2

  • Property svn:executable set to *
File size: 6.6 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: pdf_html.class.php,v 1.1 2011-07-29 12:32:11 dgoron Exp $
6
7if (stristr($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
8
9// fonction hex2dec
10// retourne un tableau associatif (clés : R,V,B) à
11// partir d'un code html de couleur hexa (ex : #3FE5AA)
12function hex2dec($couleur = "#000000"){
13    $R = substr($couleur, 1, 2);
14    $rouge = hexdec($R);
15    $V = substr($couleur, 3, 2);
16    $vert = hexdec($V);
17    $B = substr($couleur, 5, 2);
18    $bleu = hexdec($B);
19    $tbl_couleur = array();
20    $tbl_couleur['R']=$rouge;
21    $tbl_couleur['V']=$vert;
22    $tbl_couleur['B']=$bleu;
23    return $tbl_couleur;
24}
25
26//conversion pixel -> millimètre en 72 dpi
27function px2mm($px){
28    return $px*25.4/72;
29}
30
31function txtentities($html){
32    $trans = get_html_translation_table(HTML_ENTITIES);
33    $trans = array_flip($trans);
34    return strtr($html, $trans);
35}
36
37
38class PDF_HTML extends FPDF {
39        //variables du parseur html
40        var $B;
41        var $I;
42        var $U;
43        var $HREF;
44        var $TH;
45        var $TD;
46        var $fontList;
47        var $issetfont;
48        var $issetcolor;
49//      var $lMargin;
50//      var $tMargin;
51       
52        function PDF_HTML($orientation='P', $unit='mm', $format='A4') {
53            //Appel au constructeur parent
54            $this->FPDF($orientation,$unit,$format);
55            //Initialisation
56            $this->B=0;
57            $this->I=0;
58            $this->U=0;
59            $this->HREF='';
60            $this->TH='';
61            $this->TD='';
62//          $this->lMargin=10;
63//          $this->tMargin='';
64            $this->fontlist=array('arial', 'times', 'courier', 'helvetica', 'symbol');
65            $this->issetfont=false;
66            $this->issetcolor=false;
67        }
68       
69        function WriteHTML($html) {
70            //Parseur HTML
71            $html=strip_tags($html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote><th><td>"); //supprime tous les tags sauf ceux reconnus
72            $html=str_replace("\n",' ',$html); //remplace retour à la ligne par un espace
73            $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); //éclate la chaîne avec les balises
74           
75            foreach($a as $i=>$e) {
76                if($i%2==0) {
77                    //Texte
78                    if($this->HREF)
79                        $this->PutLink($this->HREF,$e);
80                    elseif($this->TH)
81                        $this->PutCell($this->TH,30, 0, $e);
82                    elseif($this->TD)
83                        $this->PutCell($this->TD, 30, 0, $e);
84                    else
85                        $this->Write(5,stripslashes(txtentities($e)));
86                       
87                } else {
88                    //Balise
89                    if($e[0]=='/')
90                        $this->CloseTag(strtoupper(substr($e,1)));
91                    else {
92                        //Extraction des attributs
93                        $a2=explode(' ',$e);
94                        $tag=strtoupper(array_shift($a2));
95                        $attr=array();
96                        foreach($a2 as $v) {
97                            if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
98                                $attr[strtoupper($a3[1])]=$a3[2];
99                        }
100                        $this->OpenTag($tag,$attr);
101                    }
102                }
103            }
104        }
105       
106        function OpenTag($tag, $attr) {
107            //Balise ouvrante
108            switch($tag){
109                case 'STRONG':
110                    $this->SetStyle('B',true);
111                    break;
112                case 'EM':
113                    $this->SetStyle('I',true);
114                    break;
115                case 'B':
116                case 'I':
117                case 'U':
118                    $this->SetStyle($tag,true);
119                    break;
120                case 'A':
121                    $this->HREF=$attr['HREF'];
122                    break;
123                case 'IMG':
124                    if(isset($attr['SRC']) && (isset($attr['WIDTH']) || isset($attr['HEIGHT']))) {
125                        if(!isset($attr['WIDTH']))
126                            $attr['WIDTH'] = 0;
127                        if(!isset($attr['HEIGHT']))
128                            $attr['HEIGHT'] = 0;
129                        $this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
130                    }
131                    break;
132                case 'TH':
133                        $this->TH = 'TH';
134//                      $this->lMargin += 5;
135//                      $this->SetXY(5, $this->tMargin);
136                        break;
137//                      $this->Cell(50,6,$e,1,1,'L');
138//                      break;
139                case 'TD':
140                        $this->TD = 'TD';
141                        break;
142                case 'TR':
143//                      $y = $this->getY();
144//                      $this->setY($y+5);
145//                      $this->setX(10);
146                        $this->Ln(5);
147//                      $this->SetXY($this->lMargin, $this->tMargin);
148                        break;
149                case 'BLOCKQUOTE':
150                case 'BR':
151                    $this->Ln(5);
152                    break;
153                case 'P':
154                    $this->Ln(10);
155                    break;
156                case 'FONT':
157                    if (isset($attr['COLOR']) && $attr['COLOR']!='') {
158                        $coul=hex2dec($attr['COLOR']);
159                        $this->SetTextColor($coul['R'],$coul['V'],$coul['B']);
160                        $this->issetcolor=true;
161                    }
162                    if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
163                        $this->SetFont(strtolower($attr['FACE']));
164                        $this->issetfont=true;
165                    }
166                    break;
167            }
168        }
169       
170        function CloseTag($tag) {
171            //Balise fermante
172            if($tag=='STRONG')
173                $tag='B';
174            if($tag=='EM')
175                $tag='I';
176            if($tag=='B' || $tag=='I' || $tag=='U')
177                $this->SetStyle($tag,false);
178            if($tag=='A')
179                $this->HREF='';
180            if($tag=='FONT'){
181                if ($this->issetcolor==true) {
182                    $this->SetTextColor(0);
183                }
184                if ($this->issetfont) {
185                    $this->SetFont('arial');
186                    $this->issetfont=false;
187                }
188            }
189        }
190       
191        function SetStyle($tag, $enable) {
192            //Modifie le style et sélectionne la police correspondante
193            $this->$tag+=($enable ? 1 : -1);
194            $style='';
195            foreach(array('B','I','U') as $s) {
196                if($this->$s>0)
197                    $style.=$s;
198            }
199            $this->SetFont('',$style);
200        }
201       
202        function PutLink($URL, $txt){
203            //Place un hyperlien
204            $this->SetTextColor(0,0,255);
205            $this->SetStyle('U',true);
206            $this->Write(5,$txt,$URL);
207            $this->SetStyle('U',false);
208            $this->SetTextColor(0);
209        }
210       
211        function PutCell($tag,$w,$h,$txt){
212                global $largeur_page,$marge_page_droite,$marge_page_gauche;
213            //Tab
214            if ($tag == 'TH') 
215                $this->SetStyle('B',true);
216               
217//          $this->SetXY($this->lMargin, $this->tMargin);
218//              $this->setX($w);
219//          $this->MultiCell((, $h, $txt, 1, 'L', 0);
220                $x = $this->getX();
221        $this->Cell(($largeur_page - $marge_page_droite - $x),$h,$txt,0,1,'L');
222            $x = $x + $w;
223            $this->setX($x);
224//         
225           
226            if ($tag == 'TH')
227                $this->SetStyle('B',false);
228           
229            if ($tag == 'TH')
230                $this->TH = '';
231            else
232                $this->TD = '';
233        }
234
235}//fin classe
236
237?>
Note: See TracBrowser for help on using the repository browser.