source: spip-zone/_plugins_/article_pdf/trunk/pdf/lib_pdf_global.php @ 113085

Last change on this file since 113085 was 113085, checked in by maieul@…, 4 months ago

utiliser le fitre supprimer_timestamp() qui fait partie de SPIP

File size: 24.7 KB
Line 
1<?php
2/**
3 * class PDF extends FPDF : FPDF/tutoriel/tuto6.htm
4 *
5 * Février-Août 2003 : Jérôme Fenal (jerome.fenal@logicacmg.com)
6 * Ajout de la prise en compte des tableaux, tag <code>, et diverses autres choses de SPIP
7 */
8
9 //  Fichier de dump pour debug
10define ('DUMP_FILE_FULL_PATH_NAME',"Dump.txt");
11
12class PDF extends FPDF
13{
14var $HREF;
15var $texteAddSpace;
16var $SRC;
17var $columnProp=array();                # propriétés de la ligne
18var $lineProp=array();          # propriétés de la ligne
19var $inFirstRow;                # flag si première ligne en cours
20var $TableX;                    # abscisse du tableau
21var $HeaderColor;
22var $RowColors;
23var $tableProp=array();
24
25var $ProcessingBloc=0;
26var $BlocContent=array();
27var $BlocTags=array();
28
29var $ProcessingTable=false;     # =1 : en cours lecture table
30var $ProcessingCadre=false;     # =1 : en cours lecture contenu d'un cadre SPIP (TEXTAREA HTML)
31var $tableCurrentCol;   # numéro de cellule courante
32var $tableCurrentRow;   # Numero de ligne courante pendant la lecture d'un tableau
33var $tableContent=array();              # Contenu de la table courante pendant son absorption. Non réentrant car SPIP ne permet pas de faire
34                                                # de table dans une autre table.
35var $listDepth=0;               # profondeur courante de liste à puce
36var $listParm = array();        # paramètres des listes à puces en fonction du niveau
37
38var $TopLinkIDArray = array(); #Sauve les IDs des liens internes (notes dans le texte)
39var $TopLinkIDArrayIt = 0; #Itérateur dans le tableau des IDs des liens internes
40
41var $BottomLinkIDArray = array(); #Sauve les IDs des liens internes (notes en fin de document)
42var $BottomLinkIDArrayIt = 0; #Itérateur dans le tableau des IDs des liens internes
43
44var $FirstIteration = TRUE;  # booleen pour la génération des liens
45var $CurrentTag=array();
46
47
48function Build($OutputFileFullPathName)
49{
50        $this->BuildDocument() ;
51
52        $this->Output('F', $OutputFileFullPathName);
53        $this->Close();
54}
55
56
57function AddCol($field=-1,$width=-1,$align='L')
58{
59        //Ajoute une colonne au tableau
60        if($field==-1)
61        {
62                $field=count($this->columnProp);
63        }
64
65        $this->columnProp[$field]=array('f'=>$field,'w'=>$width,'a'=>$align);
66        #$this->Write(5, "Ajout de colonne : ".$field."/".$width."/".$align); $this->Ln();
67}
68
69
70function PDF($orientation='P', $unit='mm', $format='A4')
71{
72        //Appel au constructeur parent
73        $this->__construct($orientation, $unit, $format);
74        $this->SetCompression(1);
75
76        //$this->InitDumpFile();
77
78        $this->HREF='';
79}
80
81function unhtmlentities($string)
82{
83        $trans_tbl = get_html_translation_table (HTML_ENTITIES);
84        $trans_tbl = array_flip ($trans_tbl);
85        $ret = strtr ($string, $trans_tbl);
86        return preg_replace_callback('/&#(\d+);/m',
87                function ($m) {
88                        return chr($m[1]);
89                },
90                $ret);
91}
92
93function WriteHTML($html,$LineFeedHeight)
94{
95        $this->texteAddSpace=false;
96        //Parseur HTML, enlevé pour une meilleure récupération des tag.
97        //Il faut détecter les vraies balises "<" HTML et pas les < de texte "&lt;" HTML
98        //Parseur remis + loin pour l'édition du texte
99        //$html=$this->unhtmlentities($html);
100
101        $a=preg_split(',(<[/a-zA-Z].*>),Ums', $html, -1, PREG_SPLIT_DELIM_CAPTURE);
102
103        // $a = le tableau de tags
104        // $i = index de l'élément courant
105        // $e = valeur de l'élément courant
106        foreach($a as $i=>$e)
107  {
108                //Balise
109        $Balise= preg_match(',<(?=[/a-zA-Z0-9])(/)?([/a-zA-Z0-9]+)((\s.*|/)?)>,s',$e,$match);
110        if ($Balise){
111                $tag=strtoupper($match[2]);
112                        $closing = $match[1]=="/";
113
114                        if (($this->ProcessingBloc) AND (!in_array($tag,$this->BlocTags[$this->ProcessingBloc-1])))
115                                $this->BlocContent[$this->ProcessingBloc-1] .= $e;
116                        else {
117                                if ($closing)
118                                // C'est une balise fermante
119                                        $this->CloseTag($tag,$LineFeedHeight);
120                                else
121                                        $this->OpenTag($tag,$e,$LineFeedHeight);
122                        }
123                }
124                // Contenu
125                else {
126                        if (!in_array('TEXTAREA',$this->CurrentTag))
127                                $e=str_replace("\n",' ',$e);
128                        if (strlen($e)){
129                                $te = trim($e);
130                                if (!$this->texteAddSpace)
131                                        $this->texteAddSpace = (strlen($te)==0) | ($e{0}!=$te{0});
132                                $next_add_space = (strlen($te)==0) | (substr($e,-1)!=substr($te,-1));
133                                $e = $te;
134                        }
135                        if(strlen($e)){
136                                $e = $this->texteAddSpace?" $e":$e;
137                                $this->texteAddSpace = $next_add_space;
138                                # Attention, ce mécanisme ne permet pas de traiter les liens dans les tableaux...
139                                # ni les tableaux dans les tableaux, d'ailleurs...
140                                if (($this->ProcessingBloc))
141                                        $this->BlocContent[$this->ProcessingBloc-1] .= $e;
142                                else
143                                {
144                                        // C'est un lien. Il faut faire la distinction entre lien externe, lien interne et note de bas de page (couples ancre + lien interne)
145                                        if($this->HREF)
146                                        {
147                                                $Link=$this->HREF;
148                                                $Text=$e;
149                                                if ( strstr($Link,"http:") || strstr($Link,"https:") || strstr($Link,"mailto:") || strstr($Link,"ftp:") )
150                                                {
151                                                        // C'est un lien  externe
152                                                        $this->PutLink($Link, $Text);
153                                                }
154                                                else
155                                                {
156                                                        // C'est une note (référence dans le texte)
157                                                        if ( strstr($Link,"#nb") )
158                                                        {
159                                                                if ($this->FirstIteration)
160                                                                {
161                                                                        $LinkID=$this->AddLink();
162                                                                        $this->SetLink($LinkID,-1,-1);
163                                                                        $this->TopLinkIDArray[]=$LinkID;
164                                                                        $this->PutLink($Link,$Text);  // Lien bidon (première itération)
165                                                                }
166                                                                else
167                                                                {
168                                                                        $LinkID=$this->BottomLinkIDArray[$this->BottomLinkIDArrayIt++];
169                                                                        $this->PutLink($LinkID,$Text);   // Bon lien  (deuxième itération)
170                                                                }
171                                                        }
172                                                        // C'est une note (détail de bas de texte)
173                                                        else if ( strstr($Link,"#nh") )
174                                                        {
175
176                                                                // C'est le lien "#nh1" (le premier) : on met un trait séparateur
177                                                                if ( strlen($Link)==4 && $Link[3]=="1" )
178                                                                {
179                                                                        $this->SetLineWidth(0.3);
180                                                                        $this->Line($this->lMargin, $this->GetY()-5, $this->w - $this->rMargin, $this->GetY()-5);
181                                                                }
182
183                                                                if ($this->FirstIteration)
184                                                                {
185                                                                        $LinkID=$this->AddLink();
186                                                                        $this->SetLink($LinkID,-1,-1);
187                                                                        $this->BottomLinkIDArray[]=$LinkID;
188                                                                        $this->PutLink($Link,$Text);  // Lien bidon (première itération)
189                                                                }
190                                                                else
191                                                                {
192                                                                        $LinkID=$this->TopLinkIDArray[$this->TopLinkIDArrayIt++];
193                                                                        $this->PutLink($LinkID,$Text);          // Bon lien  (deuxième itération)
194                                                                }
195
196                                                        }
197                                                        // C'est un lien interne
198                                                        else
199                                                        {
200                                                                $WebSiteURL=entites_html(lire_meta("adresse_site"));
201                                                                // Bug d'interprétation du point d'interrogation remplacé par 3 points. Correctif ici
202                                                                $Link=str_replace("...","?",$Link);
203
204                                                                $this->PutLink($WebSiteURL . "/" . $Link, $Text);
205                                                        }
206                                                }
207                                        } else
208                                        {
209                                                //Parseur remis ici
210                                                $e=$this->unhtmlentities($e);
211                                                $this->Write(5,$e);
212                                        }
213                                }
214                        }
215                }
216        }
217}
218
219function OpenTag($tag,$e,$LineFeedHeight)
220{
221        $needclosing = true;
222        //Balise ouvrante
223        if ($tag=='B' || $tag=='U' || $tag=='I')
224        {
225                $this->SetStyle($tag,true);
226        }
227
228        if ($tag=='STRONG')
229        {
230                $this->SetStyle('B',true);
231        }
232
233        if ($tag=='EM')
234        {
235                $this->SetStyle('I',true);
236        }
237
238        if($tag=='A')
239        {
240                $this->HREF=extraire_attribut($e,'href');
241                $this->texteHREF="";
242                if ($this->texteAddSpace) {
243                        $this->Write(5," ");
244                        $this->texteAddSpace = false;
245                }
246        }
247        if($tag=='BR') {
248                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
249                $this->Ln($LineFeedHeight);
250                $needclosing = false;
251                $this->texteAddSpace = false;
252        }
253
254        if($tag=='P') {
255                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
256                $this->Ln(1.5*$LineFeedHeight);
257                $this->texteAddSpace = false;
258        }
259        if($tag=='DIV') {
260                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
261                $this->Ln(1*$LineFeedHeight);
262                $this->texteAddSpace = false;
263        }
264
265        if($tag=='CODE') {
266//              $this->Write(5,"<code>\n");
267                $this->SetFont('courier','', 8);
268                $this->SetTextColor(0, 0, 255);
269                #$this->ProcessingCadre=true;
270                #$this->ProcessingBloc++;
271                #$this->BlocTags[$this->ProcessingBloc-1]=array("CODE");
272                #$this->BlocContent[$this->ProcessingBloc-1]="";
273        }
274
275        if($tag=='H2')
276        {
277                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
278                $this->Ln($LineFeedHeight*3);
279                $this->SetStyle($tag='B',true,24);
280                $this->texteAddSpace = false;
281        }
282
283        if($tag=='H3')
284        {
285                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
286                $this->Ln($LineFeedHeight*3);
287                $this->SetStyle($tag='B',true,20);
288                $this->texteAddSpace = false;
289        }
290
291        if($tag=='H4')
292        {
293                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
294                $this->Ln($LineFeedHeight*3);
295                $this->SetStyle($tag='B',true,18);
296                $this->texteAddSpace = false;
297        }
298
299        if($tag=='H5')
300        {
301                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
302                $this->Ln($LineFeedHeight*3);
303                $this->SetStyle($tag='B',true,14);
304                $this->texteAddSpace = false;
305        }
306
307        if($tag=='H6')
308        {
309                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
310                $this->Ln($LineFeedHeight*3);
311                $this->SetStyle($tag='B',true,12);
312                $this->texteAddSpace = false;
313        }
314
315        if($tag=='UL' or $tag=='OL') {
316                $this->SetLeftMargin($this->lMargin+7);
317                $this->listDepth++;
318                $this->listParm[$this->listDepth]['type']=$tag;
319                $this->listParm[$this->listDepth]['curr']=0;            # numéro si OL
320        }
321
322        if($tag=='LI'){
323                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
324                $this->Ln();
325                $this->listParm[$this->listDepth]['curr']++;
326                $this->SetX($this->GetX()-7);
327                if ($this->listParm[$this->listDepth]['type']=='OL')
328                        $this->Cell(7,5,$this->listParm[$this->listDepth]['curr'].'.',0,0,'C');
329                else
330                        $this->Cell(7,5,chr(149),0,0,'C');
331        }
332
333        if ($tag=='IMG') {
334                $this->SRC=extraire_attribut($e,'src');
335                //élimine les ?34423/ABC345 qui suive le nom de fichier
336                $this->SRC = supprimer_timestamp($this->SRC);
337
338                // si l'image est manquante mettre un lien avec le texte alt
339                if (!@getimagesize($this->SRC)){
340                        $alt = extraire_attribut($e,'alt');
341                        if ($alt==NULL) {
342                                $alt = $this->SRC;
343                        }
344                        if ($this->HREF=="" && $alt!=''){
345                                $this->Write(5,"[$alt]");
346                        } else {
347                                $this->PutLink($this->HREF,"$alt");
348                        }
349
350                        spip_log('NO ? '.$e.' !@getimagesize pour'. $this->SRC.' alt ='.$alt,'article_pdf');
351
352                } else {
353
354                        $size=getimagesize($this->SRC);         # Attention, utilisation de GD !!! FPDF ne sait pas lire les images à moitié... et je n'ai pas envie de surcharger la méthode Image...
355
356                        //Largeur && Hauteur
357                        if ($size[0] < 30 && $size[1] < 30) {
358                                # pixel / 3 pour avoir des cm. Petite cuisine...
359                                $imgX=$size[0]/3;
360                                $imgY=$size[1]/3;
361                                $yoffset=$imgY/4;
362                                if ($this->GetY() + $imgY > $this->h - $this->bMargin)
363                                        $this->AddPage();
364                                $this->Image($this->SRC, $this->GetX(), $this->GetY()-$yoffset, $imgX, $imgY,'',$this->HREF);
365                                $this->SetX($this->GetX()+$size[0]/2);
366                        } else if ($size[0] < 600 && $size[1] < 600) {
367                                $pwidth=$this->w-$this->lMargin-$this->rMargin;
368                                $ratio = 0.24;  # ce qui fait environ 600 pixels sur 16cm d'espace utile (160/600) - 2 pouillièmes
369                                $imgX=$size[0]*$ratio;
370                                $imgY=$size[1]*$ratio;
371                                if ($this->GetY() + $imgY > $this->h - $this->bMargin) {
372                                        if ($this->GetY() + $imgY*0.8 > $this->h - $this->bMargin) {
373                                                $this->AddPage();
374                                        } else {
375                                                $imgX=$imgX*0.8;
376                                                $imgY=$imgY*0.8;
377                                        }
378                                }
379                                $this->Image($this->SRC, $this->GetX()+($pwidth-$imgX)/2, $this->GetY(), $imgX, $imgY,'',$this->HREF);
380                                $this->SetY($this->GetY()+$imgY);
381                        } else {
382                                // les deux dimensions sont supérieurs à 600 pixels
383                                $pwidth=$this->w-$this->lMargin-$this->rMargin;
384                                $ratioX = $pwidth / $size[0];
385                                $plen=$this->h-$this->GetY()-$this->bMargin-20;         // on retire 20mm pour placer le cartouche de l'image
386                                $ratioY = $plen / $size[1];
387                                $ratio = 0.24;  # ce qui fait environ 600 pixels sur 16cm d'espace utile (160/600) - 2 pouillièmes
388                                $imgX=$size[0]*$ratio;
389                                $imgY=$size[1]*$ratio;
390
391                                if ($size[1] > 900 || ($plen - ($size[1]*$ratio)  < 0)) {
392                                        if ($plen - ($size[1]*$ratio*0.8)  < 0) {
393                                                $this->AddPage();
394                                                $plen=$this->h-$this->GetY()-$this->bMargin-20; // toujours la marge du cartouche
395                                                $ratioY = $plen / $size[1];
396                                        } else {
397                                                $ratioX *= 0.8;
398                                                $ratioY *= 0.8;
399                                        }
400                                }
401
402                                $ratio=min(0.24, $ratioX, $ratioY);
403
404                                $imgX=$size[0]*$ratio;
405                                $imgY=$size[1]*$ratio;
406
407                                $this->Image($this->SRC, $this->GetX()+($pwidth-$imgX)/2, $this->GetY(), $imgX, $imgY,'',$this->HREF);
408                                $this->SetY($this->GetY()+$imgY);
409                        }
410                }
411        }
412
413        if($tag=='TT' or $tag=='TEXTAREA') {
414                $this->SetFont('courier','', 8);
415                $this->SetTextColor(255, 0, 0);
416                if ($tag=='TEXTAREA'){
417                        $this->ProcessingCadre=true;
418                        }
419        }
420
421        if($tag=='TABLE') {
422                $this->ProcessingTable=true;
423                $this->inFirstRow=1;
424                # on commence une table
425                if(!isset($this->tableProp['width']))
426                        $this->tableProp['width']=0;
427
428                if($this->tableProp['width']==0)
429                        $this->tableProp['width']=$this->w-$this->lMargin-$this->rMargin;
430                if(!isset($this->tableProp['align']))
431                        $this->tableProp['align']='C';
432                if(!isset($this->tableProp['padding']))
433                        $this->tableProp['padding']=$this->cMargin;
434                $cMargin=$this->cMargin;
435                $this->cMargin=$this->tableProp['padding'];
436                if(!isset($this->tableProp['HeaderColor']))
437                        $this->tableProp['HeaderColor']=array(200, 200, 200);
438                $this->HeaderColor=$this->tableProp['HeaderColor'];
439                if(!isset($this->tableProp['color1']))
440                        $this->tableProp['color1']=array();
441                if(!isset($this->tableProp['color2']))
442                        $this->tableProp['color2']=array(230, 230, 230);
443                $this->RowColors=array($this->tableProp['color1'], $this->tableProp['color2']);
444                $this->tableCurrentRow=0;
445        }
446
447        if($tag=='TR') {
448                # on commence une ligne
449                $this->tableCurrentCol=0;
450                $this->tableCurrentRow++;
451                if (extraire_attribut($e,'class') == 'row_first') {
452                        $this->ProcessingTH=true;
453                }
454        }
455
456        if($tag=='TH' or $tag=='TD') {
457                # Cellule (pas titre)
458                $this->tableCurrentCol += 1;
459                $colspan = extraire_attribut($e,'colspan');
460                if ($this->inFirstRow) {
461                        if ($colspan)
462                                for($i=0;$i<$colspan;$i++){
463                                        $this->nCols=$this->tableCurrentCol;
464                                        $this->AddCol();
465                                }
466                        else {
467                                $this->nCols=$this->tableCurrentCol;
468                                $this->AddCol();
469                        }
470                }
471                $this->ProcessingBloc++;
472                $this->BlocTags[$this->ProcessingBloc-1]=array("TH","TD");
473                $this->BlocContent[$this->ProcessingBloc-1]="";
474        }
475        if($tag=='BLOCKQUOTE') {
476                $this->ProcessingBloc++;
477                $this->BlocTags[$this->ProcessingBloc-1]=array("BLOCKQUOTE");
478                $this->BlocContent[$this->ProcessingBloc-1]='';
479        }
480        if($tag=='TEXTAREA') {
481                $this->ProcessingBloc++;
482                $this->BlocTags[$this->ProcessingBloc-1]=array("TEXTAREA");
483                $this->BlocContent[$this->ProcessingBloc-1]="";
484        }
485        if($tag=='HR')
486        {
487                # Ligne horizontale
488                $this->SetLineWidth(0.3);
489                $this->Line($this->lMargin, $this->GetY(), $this->w - $this->rMargin, $this->GetY());
490                $needclosing = false;
491                $this->texteAddSpace = false;
492        }
493        if ((substr($e,-2)!="/>") && $needclosing)
494                $this->CurrentTag[]=$tag;
495}
496
497function CloseTag($tag,$LineFeedHeight)
498{
499        if($tag=='B' || $tag=='U' || $tag=='I')
500                $this->SetStyle($tag,false);
501
502        if($tag=='STRONG')
503                $this->SetStyle('B',false);
504
505        if($tag=='EM')
506                $this->SetStyle('I',false);
507
508        if($tag=='A'){
509                $this->HREF='';
510        }
511
512        if($tag=='P'){
513                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
514                $this->Ln($LineFeedHeight);
515        }
516
517        if($tag=='CODE') {
518                $this->ProcessingCadre=false;
519                if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
520                        $this->ProcessingBloc--;
521                        $this->BlocShow(0,$content,1,$LineFeedHeight);
522                }
523                $this->SetTextColor(0);
524                $this->SetFont('helvetica','',10);
525                // $this->Write(5,"\n<\code>");
526        }
527
528        if(($tag=='H2') OR ($tag=='H3') OR ($tag=='H4') OR ($tag=='H5') OR ($tag=='H6')){
529                $this->SetStyle($tag='B',false,10);
530                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
531                $this->Ln($LineFeedHeight);
532        }
533
534        if($tag=='UL' or $tag=='OL') {
535                $this->SetLeftMargin($this->lMargin-7);
536                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
537                $this->Ln();
538                $this->listParm[$this->listDepth]=array();
539                $this->listDepth--;
540        }
541        if($tag=='TT') {
542                $this->SetFont('helvetica','',10);
543                $this->SetTextColor(0);
544        }
545        if($tag=='TD' or $tag=='TH') {
546                if (!strlen($this->BlocContent[$this->ProcessingBloc-1]))
547                        $this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['content']=" ";
548                else
549                        $this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['content']=$this->BlocContent[$this->ProcessingBloc-1];
550                if ($tag=='TH')
551                        $this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['TH']=1;
552                else
553                        $this->tableContent[$this->tableCurrentRow][$this->tableCurrentCol - 1]['TH']=0;
554                $this->ProcessingBloc--;
555        }
556        if($tag=='TR') {
557                $this->inFirstRow=0;    # on a fini une ligne donc la première aussi
558        }
559        if($tag=='TABLE') {
560                $this->TableShow('C',$LineFeedHeight);
561                $this->inFirstRow=0;
562                $this->ProcessingTable=false;
563                $this->cMargin=$cMargin;
564                $this->columnProp=array();
565                $this->tableContent=array();
566        }
567        if($tag=='BLOCKQUOTE') {
568                if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
569                        $this->ProcessingBloc--;
570                        $this->BlocShow(10,$content,1,$LineFeedHeight);
571                }
572        }
573        if($tag=='TEXTAREA') {
574                        $this->ProcessingCadre=false;
575                if (strlen($content=$this->BlocContent[$this->ProcessingBloc-1])){
576                        $this->ProcessingBloc--;
577                        $this->BlocShow(0,$content,1,$LineFeedHeight);
578                }
579                $this->SetFont('helvetica','',10);
580                $this->SetTextColor(0);
581        }
582        if ($tag==end($this->CurrentTag))
583                array_pop($this->CurrentTag);
584}
585
586function SetStyle($tag,$enable,$size=0)
587{
588        static $currentStyle=array();
589        if (in_array($tag,array('B','I','U'))){
590                if ($enable)
591                        $currentStyle = array_merge($currentStyle,array($tag=>true));
592                else
593                        $currentStyle = array_diff($currentStyle,array($tag=>true));
594                $family = $this->FontFamily?$this->FontFamily:'helvetica';
595                $this->SetFont($family,implode("",array_keys($currentStyle)), $size);
596        }
597}
598
599// $Link peut être un entier (ID de lien interne)  ou une chaîne (URL)
600function PutLink($Link,$Text)
601{
602        //Place un hyperlien
603        $Text = $this->unhtmlentities($Text);
604        $Link = $this->unhtmlentities($Link);
605        $this->SetTextColor(0,0,255);
606        $this->SetStyle('U',true);
607        $this->Write(5,$Text,$Link);
608        $this->SetStyle('U',false);
609        $this->SetTextColor(0);
610}
611
612
613function Header()
614{
615}
616
617/*
618Pas utilisé pour l'instant
619function Header()
620{
621    //Imprime l'en-tête du tableau si nécessaire
622    if($this->ProcessingTable)
623        $this->TableHeader();
624}
625
626function TableHeader()
627{
628    $this->SetFont('helvetica','B',8);
629    $this->SetX($this->TableX);
630    $fill=!empty($this->HeaderColor);
631    if($fill)
632        $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this->HeaderColor[2]);
633    foreach($this->columnProp as $col)
634        $this->Cell($column['w'],6,1,0,'C',$fill);
635    $this->Ln();
636}
637*/
638
639function CellSize($htmlContent,$fontFamily,$fontSize,$LineFeedHeight,$cellmargin=3,$max_width=0){
640        $cell_pdf=new PDF_SPIP();
641        $cell_pdf->AddPage();
642        $cell_pdf->FirstIteration=TRUE;
643        $cell_pdf->SetFont($fontFamily, '', $fontSize);
644
645        $cell_pdf->maxLineWidth = 0;
646        $cell_pdf->x=$cell_pdf->lMargin;
647        $cell_pdf->y=0;
648        $cell_pdf->CurrentTag = $this->CurrentTag;
649
650        if ($max_width){
651                $cell_pdf->rMargin=$cell_pdf->w-$cell_pdf->x-$max_width-$cellmargin;
652        }
653        $cell_pdf -> WriteHTML($htmlContent,$LineFeedHeight);
654        if($cell_pdf->x>$cell_pdf->lMargin)
655                $cell_pdf->Ln($LineFeedHeight);
656
657        $width = $cell_pdf->maxLineWidth-$cell_pdf->lMargin;
658        $height = $cell_pdf->y;
659
660        $width += $cellmargin;
661        $height += $cellmargin;
662        return array($width,$height);
663}
664
665function OutputCell($width,$height,$htmlContent,$border=0,$LineFeedHeight=0,$align='',$fill=0,$cellmargin=3){
666        // dessiner la cellule vide
667        $this->Cell($width, $height, '', $border, 0, $align, $fill);
668        // on note la position apres la cellule
669        $x = $this->x; $y = $this->y;
670        $lmargin = $this->lMargin;
671        $rmargin = $this->rMargin;
672
673        // on se remet en debut de cellule
674        $this->x-=$width;
675        $this->x = $this->x+$cellmargin/2;
676        $this->lMargin = $this->x; // pour que les retour ligne se fassent correctement dans la cellule
677        $this->rMargin = $this->w-$this->x-$width+$cellmargin/2;
678
679        $this -> WriteHTML($htmlContent,$LineFeedHeight);
680        // on se remet a la fin de la cellule
681        $this->x = $x; $this->y = $y;
682        $this->lMargin = $lmargin;
683        $this->rMargin = $rmargin;
684}
685
686function BlocShow($left_margin,$htmlContent,$border=0,$LineFeedHeight){
687        $this->Ln($LineFeedHeight);
688        $this->x=$this->lMargin+$left_margin;
689        $y = $this->y;
690        $width = $this->w-$this->rMargin-$this->x;
691        list($width2,$height) = $this->CellSize($htmlContent,$this->FontFamily,$this->FontSizePt,$LineFeedHeight,3,$width);
692        $this->OutputCell($width,$height,$htmlContent,$border,$LineFeedHeight);
693        $this->y = $y+$height;
694        $this->Ln($LineFeedHeight);
695}
696
697function TableShow($align,$LineFeedHeight)
698{
699        // Calcul de la taille de police optimale
700        // Le calcul ne l'est pas, lui ;-)
701        $oldFontSizePt=$this->FontSizePt;
702        $oldFontFamily=$this->FontFamily;
703
704        $tableFontFamily='helvetica';
705        $cellmargin=3.0;                // pifomètre : un peu de marge sur la largeur de cellule
706        $wrwi=$this->w - $this->lMargin - $this->rMargin;
707        //-----------
708        $tableFontSize=10;
709        $TableWidth = 1.01*$wrwi;
710        $max_width=0;
711        $min_font_size=6.0; // mis à 6, 5 était vraiment petit
712        $maxiter = 10;
713        do {
714                $tableFontSize = $tableFontSize *min(1.0,$wrwi/$TableWidth)*0.99; // 0.99 pour converger plus vite
715
716                $fixed_width= ($tableFontSize<$min_font_size) || ($maxiter==1) || ($TableWidth<=$wrwi);
717                if ($fixed_width)
718                        $coeff=min(1.0,$wrwi/$TableWidth);
719
720                $tableFontSize = max($min_font_size,$tableFontSize);
721                // on boucle sur la taille de police tant que la largeur du tableau ne rentre pas dans la page
722
723                // remise à zéro des largeurs de colonnes
724                foreach ($this->columnProp as $i=>$cprop)
725                        if ($fixed_width)       $this->columnProp[$i]['w']=$this->columnProp[$i]['w']*$coeff;// redimenssioner la largeur de la colonne
726                        else    $this->columnProp[$i]['w']=0.0;
727                foreach($this->tableContent as $j=>$row)
728                        $this->lineProp[$j]['h']=0.0;
729
730                // on passe toutes les cellules du tableau en revue
731                // de façon à calculer la largeur max de chaque colonne pour la taille de police courante
732                foreach($this->tableContent as $j=>$row) {
733                        foreach($row as $i=>$cell) {
734                                $htmlContent = $cell['content']."<br />";
735                                if ($this->tableContent[$j][$i]['TH']) {
736                                        $htmlContent="<B>$htmlContent</B>";
737                                }
738                                list($width,$height)=$this->CellSize($htmlContent,$tableFontFamily,$tableFontSize,$LineFeedHeight,$cellmargin,$fixed_width?$this->columnProp[$i]['w']:0);
739
740                                if (!$fixed_width)
741                                        $this->columnProp[$i]['w'] = max($this->columnProp[$i]['w'],$width);
742                                $this->lineProp[$j]['h'] = max($this->lineProp[$j]['h'],$height)+0.3;
743                        }
744                }
745                // Repris de CalcWidth : calcul de la largeur de la table
746                $TableWidth=0.0;
747                foreach($this->columnProp as $col) {
748                        $TableWidth += $col['w'];
749                }
750        } while (!$fixed_width && $maxiter--);
751
752        //-----------
753        //      Envoi du tableau dans le flux PDF
754        //-----------
755
756        $this->SetFont($tableFontFamily, '', $tableFontSize);
757        //Calcule l'abscisse du tableau
758        if($align=='C')
759                $this->TableX=max(($this->w-$TableWidth)/2, 0);
760        elseif($align=='R')
761                $this->TableX=max($this->w-$this->rMargin-$TableWidth, 0);
762        else
763                $this->TableX=$this->lMargin;
764
765        $ci=0;  # flip-flop pour couleur de fond de ligne
766        foreach($this->tableContent as $j=>$row) {
767                $this->SetX($this->TableX);
768                $fill = !empty($this->RowColors[$ci]);
769                if ($fill) {
770                        $this->SetFillColor($this->RowColors[$ci][0],
771                                                                $this->RowColors[$ci][1],
772                                                                $this->RowColors[$ci][2]);
773                }
774
775                foreach($this->tableContent[$j] as $i=>$cell) {
776                        if ($this->tableContent[$j][$i]['TH'] == true) {
777                                $this->SetFont($tableFontFamily, 'B', $tableFontSize);
778                                $this->SetFillColor(255, 255, 0);       // jaune
779                                $fill=1;
780                        }
781                        $this->OutputCell(
782                                $this->columnProp[$i]['w'],
783                                $this->lineProp[$j]['h'],
784                                $cell['content'],
785                                1,
786                                $LineFeedHeight,
787                                $this->columnProp[$i]['a'],
788                                $fill,0);
789
790                        if ($this->tableContent[$j][$i]['TH']) {
791                                $this->SetFont('', '', $tableFontSize);
792                                $this->SetFillColor(255);       // blanc
793                        }
794                }
795                $ci=1-$ci;
796                $this->maxLineWidth = max($this->maxLineWidth,$this->x);
797                $this->Ln($this->lineProp[$j]['h']);
798        }
799
800        $this->SetFont($oldFontFamily, '', $oldFontSizePt);
801        $this->Ln($LineFeedHeight);
802}
803
804// Efface le fichier de dump
805function InitDumpFile()
806{
807        @unlink(DUMP_FILE_FULL_PATH_NAME);
808}
809
810
811// trace une chaîne dans un fichier
812function Dump($String)
813{
814        if ($f = @fopen(DUMP_FILE_FULL_PATH_NAME,"a"))
815        {
816                @fwrite($f,$String);
817                @fwrite($f,"\n");
818                @fclose($f);
819        }
820}
821
822// trace un tableau dans un fichier
823function DumpArray($String,$Array)
824{
825        $Result=print_r($Array,true);
826
827        if ($f = @fopen(DUMP_FILE_FULL_PATH_NAME,"a")){
828                @fwrite($f,$String);
829                @fwrite($f,"\n\n");
830                if(@fwrite($f,$Result)){
831                        @fclose($f);
832                }
833        }
834        $Array.reset();
835}
836
837}       // class PDF extends FPDF
Note: See TracBrowser for help on using the repository browser.