source: pmb4.2/trunk/fuentes/pmb/classes/docbnf.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: 24.1 KB
Line 
1<?php
2// +-------------------------------------------------+
3// © 2002-2005 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
4// +-------------------------------------------------+
5// $Id: docbnf.class.php,v 1.1 2013-07-04 12:55:49 arenou Exp $
6
7
8if (stristr ($_SERVER['REQUEST_URI'], ".class.php")) die("no access");
9
10require_once($class_path."/fpdf.class.php");
11
12       
13class docbnf {
14        protected $path;
15        public $ref;
16        public $arkNumber;
17        public $ocr;
18        public $available_resolution;
19        public $nb_pages;
20        public $resolution;
21        public $advertissement = "";
22        public $tdm;
23        public $pagesSizes=array();
24
25        public function __construct($path,$resolution="D"){
26                $this->path = realpath($path);
27                $this->resolution = $resolution;
28                $this->init();
29        }
30       
31        public function init(){
32                //Si on peut parser le contenu
33                if($this->parse()){
34                        //on récupère le ref
35                        $this->getRef();
36                        //on récupère l'ArkNumber
37                        $this->getArkNumber();
38                        //on récupère le nombre de pages
39                        $this->getNbPages();
40                        //on regarde les résolutions disponibles!
41                        $this->getAvailableResolution();
42                        //on regarde si on a la couche OCR
43                        $this->checkOcr();
44                        //on regarde si on a une page d'avertissement
45                        $this->getAdvertissement();
46                        //on ajuste la résolution au besoin
47                        $this->adjustResolution();
48                        //tableau des tailles de pages
49                        $this->getPagesSizes();
50                }else{
51                        die();
52                }
53        }
54       
55        public function get_file_path($file){
56                return $this->path."/".$file;
57        }
58       
59        protected function parse(){
60                $dh = opendir($this->path);
61                $found = false;
62                $refnum = "";
63                while(($file = readdir($dh))!== false){
64                        //on cherche le refNum
65                        if((substr($file,0,1) === "X" || substr($file,0,1) === "x") && (substr($file,-4) == ".XML" || substr($file,-4) == ".xml")){
66                                $refnum = $file;
67                                $found =true;
68                        }else if ($file == "advertissement.png"){
69                                $this->advertissement = $file;
70                        }
71                }
72                if($found){
73                        //on a trouver le refnum, on va pouvoir regarder ce qu'il contient...
74                        $this->refnum = new domDocument();
75                        $this->refnum->load(realpath($this->get_file_path($refnum)));   
76
77                       
78                       
79
80                       
81                }
82                return $found;
83        }
84       
85        public function getRef(){
86                if(!$this->ref){
87                        //on va chercher la référence!
88                        $doc =  $this->refnum->getElementsByTagName('document')->item(0);
89                        $this->ref = $doc->getAttribute("identifiant");
90                }
91                return $this>ref;
92        }
93       
94        public function getArkNumber(){
95                if(!$this->arkNumber){
96                //l'identifiant Ark;
97                        $references = $this->refnum->getElementsByTagName('reference');
98                        foreach($references as $reference){
99                                if($reference->getAttribute('type') == "NOTICEBIBLIOGRAPHIQUE"){
100                                        $this->arkNumber = $reference->nodeValue;
101                                        break;
102                                }
103                        }
104                }
105                return $this>arkNumber;
106        }
107       
108        public function getNbPages(){
109                if(!$this->nb_pages){
110                        //le nombre de page
111                        $this->nb_pages =  $this->refnum->getElementsByTagName('nombrePages')->item(0)->nodeValue;
112                }
113                return $this->nb_pages;
114        }
115       
116        public function getAvailableResolution(){
117                if(!$this->available_resolution){
118                        $this->available_resolution=array();
119                       
120                        if($this->file_exists($this->get_file_path("A"))){
121                                $this->available_resolution[] = "A";
122                        }
123                        if($this->file_exists($this->get_file_path("C"))){
124                                $this->available_resolution[] = "C";
125                        }
126                        if($this->file_exists($this->get_file_path("D"))){
127                                $this->available_resolution[] = "D";
128                        }
129                        if($this->file_exists($this->get_file_path("E"))){
130                                $this->available_resolution[] = "E";
131                        }
132                        if($this->file_exists($this->get_file_path("F"))){
133                                $this->available_resolution[] = "F";
134                        }
135                        if($this->file_exists($this->get_file_path("T"))){
136                                $this->available_resolution[] = "T";
137                        }
138                }
139                return $this->available_resolution;
140        }
141       
142        public function adjustResolution(){
143                if(count($this->available_resolution) == 1){
144                        $this->resolution = $this->available_resolution[0];
145                }
146        }
147       
148        public function checkOcr(){
149                if($this->file_exists($this->get_file_path("X"))){
150                        $this->ocr = true;
151                }               
152        }
153       
154        public function getAdvertissement(){
155                if($this->file_exists($this->get_file_path("advertissement.png"))){
156                        $this->advertissement = "advertissement.png";
157                }
158        }
159       
160        public function get_page_content($num_page=1){
161                //pour chaque page
162                $pages = $this->refnum->getElementsByTagName("vueObjet");
163                foreach($pages as $page){
164                        //on va chercher l'image
165                        if($page->getAttribute("ordre") == $num_page){
166                                $img = $page->getElementsByTagName("image")->item(0);
167                                $image = $img->getAttribute("nomImage");
168                                $image = str_replace("T",$this->resolution,$image);
169                                break;
170                        }
171                }
172                if($this->file_exists($this->get_file_path($this->resolution."/".$image.".PNG"))){
173                        return $this->get_file_content($this->get_file_path($this->resolution."/".$image.".PNG"));
174                } else if($this->file_exists($this->get_file_path($this->resolution."/".$image.".JPG"))){
175                        return $this->get_file_content($this->get_file_path($this->resolution."/".$image.".JPG"));
176                }
177        }
178       
179        public function get_file_content($file_path){
180                return file_get_contents($this->get_file_path($file_path));
181        }
182       
183        public function getWidth($num_page){
184                return $this->pagesSizes[$num_page]['width'];
185        }
186       
187        public function getHeight($num_page){
188                return $this->pagesSizes[$num_page]['height'];
189        }       
190       
191        public function file_exists($file){
192                return file_exists($this->get_file_path($file));
193        }
194       
195        public function search($user_query){
196                $matches = array();
197                //pour chaque page
198                $terms = explode(" ",strtolower(convert_diacrit($user_query)));
199               
200                $pages = $this->refnum->getElementsByTagName("vueObjet");
201                foreach($pages as $page){
202                        //on va chercher la couche OCR
203                        $img = $page->getElementsByTagName("image")->item(0);
204                        $image = $img->getAttribute("nomImage");
205                        $ocr = str_replace("T","X",$image);
206                        $num_page = str_replace("T","",$image);
207                        if($this->file_exists($this->get_file_path("X/".$ocr.".xml.gz"))){
208                                ob_start();
209                                readgzfile($this->get_file($this->get_file_path("X/".$ocr.".xml.gz")));
210                                $file = ob_get_clean(); 
211                                $xml = new domDocument("1.0","iso-8859-1");
212                                $xml->loadXML($file);
213                                //on va avoir besoin de la résolution d'origine pour calculer le ratio...
214                                $page = $xml->getElementsByTagName("Page")->item(0);
215                                $original_width = $page->getAttribute('WIDTH');
216                                $original_height = $page->getAttribute('HEIGHT');
217                                $height = $this->getHeight($num_page);
218                                $width = $this->getWidth($num_page);
219
220                                $h_ratio = ($height/$original_height);
221                                $w_ratio = ($width/$original_width);
222
223                                $strings = $xml->getElementsByTagName('String');
224                                foreach($strings as $string){
225                                        foreach($terms as $term){
226                                                if(strtolower(convert_diacrit(utf8_decode($string->getAttribute("CONTENT")))) == $term){
227                                                        $matches[] = array(
228                                                                "text"=> $this->get_paragraphe($string),
229                                                                'par' => array(
230                                                                        array(
231                                                                                'page' => ($num_page*1),
232                                                                                'page_height' => $height,
233                                                                                'b' => $height,
234                                                                                't' => 0,
235                                                                                'page_width' => $width,
236                                                                                'r' => $width,
237                                                                                'l' =>  0,
238                                                                                'boxes' => array(
239                                                                                        array(
240                                                                                                'l' => $string->getAttribute("HPOS")*$w_ratio,
241                                                                                                'r' => ($string->getAttribute("HPOS")+$string->getAttribute("WIDTH"))*$w_ratio,
242                                                                                                'b' => ($string->getAttribute("VPOS")+$string->getAttribute("HEIGHT"))*$h_ratio,
243                                                                                                't' => $string->getAttribute("VPOS")*$h_ratio,
244                                                                                                'page' => ($num_page*1)
245                                                                                        )
246                                                                                )
247                                                                        )
248                                                                )
249                                                        );
250                                                }
251                                        }
252                                }
253                        }
254                }
255                return array('matches' => $matches);
256        }
257       
258        function get_paragraphe($string){
259                $current = $string;
260                $paragraphe = "";
261                while($current->nodeName != "TextBlock"){
262                        $current = $current->parentNode;
263                }
264               
265                for($i=0; $i<$current->childNodes->length ; $i++){
266                        $line = $current->childNodes->item($i);
267                        if($line->nodeName == "TextLine"){
268                                for($j=0 ; $j<$line->childNodes->length ; $j++){
269                                        $node = $line->childNodes->item($j);
270                                        switch($node->nodeName){
271                                                case "SP" : 
272                                                        $paragraphe.= " ";
273                                                        break;
274                                                case "String" :
275                                                        if($node->getAttribute("CONTENT") == $string->getAttribute("CONTENT")){
276                                                                $paragraphe.= "{{{".utf8_decode($node->getAttribute("CONTENT"))."}}}";
277                                                        }else {
278                                                                $paragraphe.= utf8_decode($node->getAttribute("CONTENT"));
279                                                        }
280                                                        break; 
281                                                default : 
282                                                        $paragraphe.= " ";
283                                                        break;
284                                        }
285                                        $paragraphe.= " ";
286                                }
287                        }
288                }
289                return $paragraphe;
290        }
291       
292        function getTDM(){
293                if(!$this->tdm && $this->file_exists($this->get_file_path("T".$this->ref.".xml"))){
294                       
295                        $xml = new domDocument();
296                        $xml->load($this->get_file($this->get_file_path("T".$this->ref.".xml")));
297                        $elems = $xml->getElementsByTagName("div0");
298                        foreach($elems as $elem){
299                                $this->parseTDM($xml->encoding,$elem);
300                        }
301                }
302                return $this->tdm;
303        }
304       
305        function getBookmarks(){
306                $this->getTDM();
307                return $this->bookmarks;
308        }
309       
310        function parseTDM($encoding,$element,$deep=0){
311                foreach($element->childNodes as $child){
312                        switch ($child->tagName){
313                                case "head" :
314                                        //pour récupérer une table des matières textuel
315                                        if($deep>0)$this->tdm.= utf8_decode($child->nodeValue)."\n";
316                                        //pour les bookmarks
317                                        $item = array();
318                                        $item['label'] = utf8_decode($child->nodeValue);
319                                        $item['page'] = 1;
320                                        $item['deep'] = $deep;
321                                        $item['head'] = true;
322                                        $this->bookmarks[]= $item;
323                                        break;
324                                case "item" :
325                                        //pour récupérer une table des matières textuel
326                                        for ($i = 1 ; $i<$deep ; $i++){
327                                                if($i<$deep) $this->tdm.="\t";
328                                        }
329                                        $seg = $child->getElementsByTagName("seg");
330                                        if($seg->length ==0) $this->tdm.= $child->nodeValue."\n";
331                                        else{
332                                                for ($i = 1 ; $i<$deep ; $i++){
333                                                        if($deep>$i) $this->tdm.="\t";
334                                                }
335                                                $text = $seg->item(0)->nodeValue;
336                                                $page = $child->getElementsByTagName("xref")->item(0)->nodeValue;
337                                                $page = utf8_decode($page);
338                                                $this->tdm.= "$text / page $page\n";
339                                        }
340                                        //pour les bookmarks
341                                        if($seg->length ==0){
342                                                $item =array();
343                                                $item['label'] = utf8_decode($child->nodeValue);
344                                                $item['page'] = 1;
345                                                $item['deep'] = $deep;
346                                                $item['head'] = true;
347                                                $this->bookmarks[]= $item;
348                                        }else{
349                                                for($i=0 ; $i < $child->getElementsByTagName("xref")->length ; $i++ ){
350                                                        $item['label'] = $child->getElementsByTagName("seg")->item(0)->nodeValue." (p. ".$child->getElementsByTagName("xref")->item($i)->nodeValue.")";
351                                                        $item['page'] = $child->getElementsByTagName("xref")->item($i)->getAttribute('from');
352                                                        $item['deep'] = $deep;
353                                                        $item['analysis'] = true;
354                                                        $item['analysis_page'] = $child->getElementsByTagName("xref")->item($i)->nodeValue;
355                                                        if($item['page']){
356                                                                if(preg_match("/.*".$this->ref."\/([^.]+)[.].*/", $item['page'],$matches)){
357                                                                        $item['page'] = $matches[1]*1;
358                                                                }
359                                                        }
360                                                        $item['label'] = utf8_decode($item['label']);
361                                                        $item['page'] = utf8_decode($item['page']);
362                                                        $this->bookmarks[]= $item;
363                                                }
364                                        }
365                                        break;
366                                case "list" :
367                                        $deep++;
368                                               
369                                case "div1" :
370                                case "div2" :
371                                        //pour récupérer une table des matières textuel
372                                        $this->tdm.="\n";
373                                        $this->parseTDM($encoding,$child,$deep);
374                                        break;
375                        }
376                }
377                return $this->tdm;
378        }
379       
380        function generatePDF($pdfParams){
381                $this->convert = new fpdf_bnf($pdfParams);
382                $this->convert->SetMargins(0,0);
383                $this->convert->SetAutoPageBreak(true,0);
384                $title = utf8_decode($this->refnum->getElementsByTagName("titre")->item(0)->nodeValue);
385                $this->convert->setTitle($title);
386                $this->convert->Open();
387               
388                if($this->advertissement){
389                        $src_img = imagecreatefromstring($this->get_file_content(($this->get_file_path($this->advertissement))));
390                        $img=imagecreatetruecolor(imagesx($src_img),imagesy($src_img));
391                        ImageSaveAlpha($img, false);
392                        ImageAlphaBlending($img, false);
393                        imagefilledrectangle($img,0,0,imagesx($src_img),imagesy($src_img),imagecolorallocatealpha($img, 0, 0, 0, 127));
394                        imagecopyresized($img,$src_img,0,0,0,0,imagesx($src_img),imagesy($src_img),imagesx($src_img),imagesy($src_img));
395                        imagepng($img,"./temp/advertissement.png");
396                        $this->convert->Image(realpath("./temp/advertissement.png"));
397                        unlink(realpath("./temp/advertissement.png"));
398                }
399               
400                $i=0;
401                //pour chaque page
402                $pages = $this->refnum->getElementsByTagName("vueObjet");
403                foreach($pages as $page){
404                        //on va chercher l'image
405                        $img = $page->getElementsByTagName("image")->item(0);
406                        $dimension = $img->getAttribute("dimension");
407                        $resolution= $img->getAttribute("resolution");
408                        $size= $this->convert->getSize($dimension,$resolution);
409                        $this->convert->AddPage("P",$size);
410                        $image = $img->getAttribute("nomImage");
411                        $text = str_replace("T","X",$image);
412                        $image_path = $this->getImagePath($image);
413                        if($image_path){
414                                $this->generateOCR($text);
415                                $this->convert->Image($image_path,0,0,$size[0],$size[1]);
416                                unlink($image_path);
417                                $i++;
418                        }else return false;
419                }
420                $this->generateBookmarks();
421                $this->convert->Output($pdfParams['outname'],"I");
422                return true;           
423        }
424       
425        function generateOCR($pageName){
426                if($this->file_exists($this->get_file_path("X/".$pageName.".xml.gz"))){
427                        $filepath = $this->get_file($this->get_file_path("X/".$pageName.".xml.gz"));
428                        print $file_path;
429                        ob_start();
430                        readgzfile($filepath);
431                        $file=ob_get_clean();
432                        $xml = new domDocument("1.0","iso-8859-1");
433                        $xml->loadXML($file);
434                        $styleNodes = $xml->getElementsByTagName("Styles")->item(0);
435                        $styles = array();
436                        if($styleNodes->childNodes->length>0)
437                        foreach($styleNodes->childNodes as $style){
438                                foreach ($style->attributes as $name => $attrNode) {
439                                        if ($name == 'FONTSTYLE'){
440                                                switch ($attrNode->value){
441                                                        case "bold" :
442                                                                $fontstyle = "B";
443                                                                break;
444                                                        case "italics" :
445                                                                $fontstyle = "I";
446                                                                break;
447                                                        default :
448                                                                $fontstyle = "";
449                                                                break;
450                                                }
451                                                $styles[$style->getAttribute("ID")][$name] =trim($fontstyle);
452                                        }else if ($name == "FONTFAMILY"){
453                                                switch(trim($attrNode->value)){
454                                                        case "TIMES NEW ROMAN" :
455                                                                $styles[$style->getAttribute("ID")][$name] = "times";
456                                                                break;
457                                                        case "COURIER NEW" :
458                                                                $styles[$style->getAttribute("ID")][$name] = "courier";
459                                                                break;
460                                                        default :
461                                                                $styles[$style->getAttribute("ID")][$name] = "arial";
462                                                                break;
463                                                }
464                                        }else if( $name != 'ID') {
465                                                switch ($attrNode->value){
466                                                        case "bold" :
467                                                                $fontstyle = "B";
468                                                                break;
469                                                        case "italics" :
470                                                                $fontstyle = "I";
471                                                                break;
472                                                        default :
473                                                                $fontstyle = "";
474                                                                break;
475                                                }
476                                                $styles[$style->getAttribute("ID")][$name] =trim($attrNode->value);
477                                        }
478                                }
479                        }
480                        $printSpaces = $xml->getElementsByTagName("PrintSpace");
481                        foreach($printSpaces as $printSpace){
482                                //block de texte...
483                                $textBlocks = $printSpace->getElementsByTagName('TextBlock');
484                                foreach($textBlocks as $textBlock){
485                                        $block = array();
486                                        foreach ($textBlock->attributes as $name => $attrNode) {
487                                                $block[$name] =$attrNode->value;
488                                        }
489                                        $align = substr($styles[$block['STYLEREFS']]['ALIGN'],0,1);
490                                        //ligne d'un block
491                                        $textLignes = $textBlock->getElementsByTagName('TextLine');
492                                        foreach($textLignes as $textLine){
493                                                foreach ($textLine->attributes as $name => $attrNode) {
494                                                        $line[$name] =$attrNode->value;
495                                                }
496                                                //style de la ligne
497                                               
498                                                $line['CONTENT'] = "";
499                                                foreach($textLine->childNodes as $child){
500                                                        if(($child->nodeName == "String" && $child->getAttribute("STYLEREFS") != $line['STYLEREFS']) || $child->nodeName == "SP"){
501                                                                $line['WIDTH'] = $child->getAttribute("HPOS")-$line['HPOS'];
502                                                                if($child->nodeName == "SP"){
503                                                                        $line['CONTENT'].= " ";
504                                                                        $line['WIDTH']+= $child->getAttribute("WIDTH");
505                                                                }
506                                                                $this->convert->setY($this->convert->convertPxToMm($line['VPOS']));
507                                                                $this->convert->setX($this->convert->convertPxToMm($line['HPOS']));
508                                                                $this->convert->SetFont($styles[$line['STYLEREFS']]['FONTFAMILY'],$styles[$line['STYLEREFS']]['FONTSTYLE'],$styles[$line['STYLEREFS']]['FONTSIZE']);
509                                                                $this->convert->Cell($this->convert->convertPxToMm($line['WIDTH']),$this->convert->convertPxToMm($line['HEIGHT']), utf8_decode($line['CONTENT']),0,0,$align);
510                                                                if($child->nodeName != "SP")
511                                                                        $line['STYLEREFS'] = $child->getAttribute("STYLEREFS");
512                                                                $line['CONTENT'] = "";
513                                                                $line['HPOS'] = $line['HPOS']+$line['WIDTH'];
514                                                               
515                                                        }
516                                                        switch($child->nodeName){
517                                                                case "String" :
518                                                                        $line['CONTENT'].=$child->getAttribute("CONTENT");
519                                                                        $width= $child->getAttribute("WIDTH");
520                                                                        break;
521                                                        }
522                                                       
523                                                }
524                                                if($line['CONTENT']){
525                                                        $line['WIDTH'] = $width;
526                                                        $this->convert->setY($this->convert->convertPxToMm($line['VPOS']));
527                                                        $this->convert->setX($this->convert->convertPxToMm($line['HPOS']));
528                                                        $this->convert->SetFont($styles[$line['STYLEREFS']]['FONTFAMILY'],$styles[$line['STYLEREFS']]['FONTSTYLE'],$styles[$line['STYLEREFS']]['FONTSIZE']);
529                                                        $this->convert->Cell($this->convert->convertPxToMm($line['WIDTH']),$this->convert->convertPxToMm($line['HEIGHT']), utf8_decode($line['CONTENT'])." ",0,0,$align);
530                                                        $this->textContent.=" ".utf8_decode($line['CONTENT']);
531                                                }
532                                        }
533                                }
534                        }                       
535                }
536        }
537       
538        function generateBookmarks(){
539                $this->getTDM();
540                for($i=0 ; $i<count($this->bookmarks) ; $i++){
541                        $item = $this->bookmarks[$i];
542                        if($item['deep']>0 && $item['page'] == 1 && $this->bookmarks[$i+1] && $this->bookmarks[$i+1]['deep'] >$item['deep']){
543                                $item['page'] =$this->bookmarks[$i+1]['page'];
544                        }
545                        if($item['page']){
546                                if($this->advertissement){
547                                        $item['page']++;
548                                }
549                                $this->convert->Bookmark($item['label'],$item['page'],$item['deep']);
550                        }
551                }
552        }
553       
554        function getImagePath($image){
555                $image = str_replace("T",$this->resolution,$image);
556                $img_path = $this->resolution."/".$image.".PNG";
557                if(!$this->file_exists($this->get_file_path($img_path))){
558                        $img_path = $this->resolution."/".$image.".JPG";
559                }
560               
561                $number = str_replace($this->resolution,"",$image)*1;
562                $src_img = imagecreatefromstring($this->get_file_content(($this->get_file_path($img_path))));
563                $img=imagecreatetruecolor($this->getWidth($number),$this->getHeight($number));
564                ImageSaveAlpha($img, false);
565                ImageAlphaBlending($img, false);
566                imagefilledrectangle($img,0,0,$this->getWidth($number),$this->getHeight($number),imagecolorallocatealpha($img, 0, 0, 0, 127));
567                imagecopyresized($img,$src_img,0,0,0,0,$this->getWidth($number),$this->getHeight($number),imagesx($src_img),imagesy($src_img));
568                imagejpeg($img,"./temp/".$image.".jpg");
569                return realpath("./temp/".$image.".jpg");
570        }
571       
572        function get_file($file_path){
573                return $this->get_file_path($file_path);
574        }
575       
576        function getPagesSizes(){
577                //pour chaque page
578                if(!$this->pagesSizes){
579                        $pages = $this->refnum->getElementsByTagName("vueObjet");
580                        foreach($pages as $page){
581                                //on va chercher l'image
582                                $img = $page->getElementsByTagName("image")->item(0);
583                                $image = $img->getAttribute("nomImage");
584                                $image = str_replace("T",$this->resolution,$image);
585                                $dimensions = $img->getAttribute("dimension");
586                                $infos = explode(",",$dimensions);
587                                $this->pagesSizes[($page->getAttribute("ordre")*1)] =array(
588                                        'width' => $infos[0],
589                                        'height'=>  $infos[1]
590                                );
591                        }
592                }
593                return $this->pagesSizes;
594        }
595       
596        function getCover(){
597                if(!$this->cover){
598                        $this->cover = "";
599                        $page = $this->refnum->getElementsByTagName("vueObjet")->item(0);
600                        //on va chercher l'image
601                        $img = $page->getElementsByTagName("image")->item(0);
602                        $image = $img->getAttribute("nomImage");
603                        $this->cover = $this->getImagePath($image);
604                }
605                return $this->cover;
606        }
607       
608}
609
610/*
611 * Extention FPDF pour les documents BnF
612 */
613
614class fpdf_bnf extends fpdf{
615        var $logoUrl;   //url du logo déposé sur chaque page...
616        var $header;    //header de page...
617        var $footers;   //pied de page du document...
618        var $resolution;
619
620        var $outlines=array();
621        var $OutlineRoot;
622
623
624        function __construct($params=array()){
625                parent::FPDF();
626                $this->footers = $params['footers'];
627                $this->setCreator(utf8_decode($params['creator']));
628                $this->SetTextColor(0);
629                $this->cMargin = 0;
630        }
631
632        function getSize($dimension,$resolution){
633                $this->resolution = $resolution;
634                $dimension = explode(",",$dimension);
635                $resolution = explode(",",$resolution);
636                $this->resolution = $resolution[0];
637                $size = array(
638                                $this->convertPxToMm($dimension[0],$resolution[0]),
639                                $this->convertPxToMm($dimension[1],$resolution[1])
640                );
641                return $size;
642        }
643
644        function convertPxToMm($px,$dpi=0){
645                return ($px*25.4)/($dpi ? $dpi : $this->resolution);
646        }
647
648        function Footer(){
649                if ($this->logoUrl !="") $this->Image($this->logoUrl,10,8,20);
650                if ($this->header) {
651                        $this->SetFont('Arial',"",14);
652                        $this->Cell(80); //Décalage à droite
653                        $this->Cell(30,10,$this->header,0,'C');
654                }
655
656                //si on a un footer spécificique pour la page courante...
657                $footer = array();
658                if(isset($this->footers['page'.$this->PageNo()])){
659                        $footer = $this->footers['page'.$this->PageNo()];
660                }else if (isset($this->footers['all'])){
661                        $footer = $this->footers['all'];
662                }
663
664                //on applique le footer
665                if($footer['name']){
666                        $this->SetY((-15*$this->h/297));
667                        $this->SetX((5*$this->w/210));
668                        //Police Arial italique 8
669                        $this->SetFont('Arial','I',(8*$this->w/210));
670                        if($footer['link']){
671                                $this->Cell(0,10,utf8_decode($footer['name']),0,0,'',false,utf8_decode($footer['link']));
672                        }else{
673                                $this->Cell(0,10,utf8_decode($footer['name']),0,0,'',false,'');
674                        }
675                }
676        }
677
678        function Error($msg){
679                //erreur sur la classe FDPF, on la log avant d'arreter la génération...
680//              logMsg($msg);
681                //Fatal error
682                parent::Error($msg);
683        }
684
685        /*************************************************************************
686         *  Fonctions pour les signets (provient du site FPDF / Auteur : Olivier  *
687                        *  http://www.fpdf.org/fr/script/script1.php                            *
688                        *  Modifié par Arnaud RENOU (prise en compte d'un numéro de page        *
689                                        *************************************************************************/
690
691        function Bookmark($txt, $page=-1, $level=0, $y=0)       {
692                if($y==-1)
693                        $y=$this->GetY();
694                if($page == -1){
695                        $page = $this->PageNo();
696                }
697                $this->outlines[]=array('t'=>$txt, 'l'=>$level, 'y'=>($this->h-$y)*$this->k, 'p'=>$page);
698        }
699        function BookmarkUTF8($txt,$page=-1, $level=0, $y=0){
700                $this->Bookmark($this->_UTF8toUTF16($txt),$page, $level,$y);
701        }
702
703        function _putbookmarks(){
704                $nb=count($this->outlines);
705                if($nb==0)
706                        return;
707                $lru=array();
708                $level=0;
709                foreach($this->outlines as $i=>$o)
710                {
711                        if($o['l']>0)
712                        {
713                                $parent=$lru[$o['l']-1];
714                                //Set parent and last pointers
715                                $this->outlines[$i]['parent']=$parent;
716                                $this->outlines[$parent]['last']=$i;
717                                if($o['l']>$level)
718                                {
719                                        //Level increasing: set first pointer
720                                        $this->outlines[$parent]['first']=$i;
721                                }
722                        }
723                        else
724                                $this->outlines[$i]['parent']=$nb;
725                        if($o['l']<=$level and $i>0)
726                        {
727                                //Set prev and next pointers
728                                $prev=$lru[$o['l']];
729                                $this->outlines[$prev]['next']=$i;
730                                $this->outlines[$i]['prev']=$prev;
731                        }
732                        $lru[$o['l']]=$i;
733                        $level=$o['l'];
734                }
735                //Outline items
736                $n=$this->n+1;
737                foreach($this->outlines as $i=>$o)
738                {
739                        $this->_newobj();
740                        $this->_out('<</Title '.$this->_textstring($o['t']));
741                        $this->_out('/Parent '.($n+$o['parent']).' 0 R');
742                        if(isset($o['prev']))
743                                $this->_out('/Prev '.($n+$o['prev']).' 0 R');
744                        if(isset($o['next']))
745                                $this->_out('/Next '.($n+$o['next']).' 0 R');
746                        if(isset($o['first']))
747                                $this->_out('/First '.($n+$o['first']).' 0 R');
748                        if(isset($o['last']))
749                                $this->_out('/Last '.($n+$o['last']).' 0 R');
750                        $this->_out(sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]',1+2*$o['p'],$o['y']));
751                        $this->_out('/Count 0>>');
752                        $this->_out('endobj');
753                }
754                //Outline root
755                $this->_newobj();
756                $this->OutlineRoot=$this->n;
757                $this->_out('<</Type /Outlines /First '.$n.' 0 R');
758                $this->_out('/Last '.($n+$lru[0]).' 0 R>>');
759                $this->_out('endobj');
760        }
761
762        function _putresources(){
763                parent::_putresources();
764                $this->_putbookmarks();
765        }
766
767        function _putcatalog(){
768                parent::_putcatalog();
769                if(count($this->outlines)>0)
770                {
771                        $this->_out('/Outlines '.$this->OutlineRoot.' 0 R');
772                        $this->_out('/PageMode /UseOutlines');
773                }
774        }
775
776}
777?>
Note: See TracBrowser for help on using the repository browser.