]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/PDF.php
Se agrega un objeto que permite armar tablas html a partir de templates.
[mecon/meconlib.git] / lib / MLIB / PDF.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                                     mlib
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
6
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
10 any later version.
11
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15  
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA  02111-1307  USA
19 -------------------------------------------------------------------------------
20 Creado: Fri Oct 24 16:12:31 2003
21 Autor:  Gonzalo Merayo <gmeray@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/PDF/external/phppdflib.class.php';
27
28 /**
29  * Liberia base para el manejo de pdf's.  
30  */
31 class MLIB_PDF {
32
33     /**
34      * Orientacion (portrait o landscape).
35      * @var sting $orientacion
36      * @access public
37      */
38     var $orientacion = "portrait";   
39
40     /**
41      *
42      *  Orientacion cambiada, indica la orientacion de la pagina cuando es
43      *  distinto al comun
44      *  @var array $orientacion_distinta
45      *  @access protected
46      */
47     var $_orientacion_distinta = array();
48     
49     /**
50      * Configuracion
51      * @var arary $config
52      * @access protected
53      */
54      var $_config = array ();
55     
56     /**
57      * Libreria externa.
58      * @var    int $pdf
59      * @access protected
60      */
61     var $_pdf;
62
63     /**
64      * Identificacion de la pagina actual
65      * @var    int $pagina_actual
66      * @access private
67      */
68     var $_pagina_actual;
69
70     /**
71      * Array de paginas.
72      * @var array $paginas
73      * @access private
74      */
75     var $_paginas = array();
76
77     /**
78      * Nombre del archivo resultado para el display.
79      * @var sting $nombre
80      * @access private
81      */
82     var $_nombre;   
83
84     /**
85      * Class constructor.
86      *
87      * @param string $tam Tipo de hoja
88      * @param string $ori Orientacion de las hojas (portrait o landscape).
89      * @param string $nombre Nombre del archivo PDF.
90      *
91      * @return void
92      * @access public
93      */
94     function MLIB_PDF($tam = "a4", $ori = "portrait", $nombre = "Doc.pdf")
95     {
96         setlocale (LC_ALL, 'en_US');
97         $this->orientacion = $ori;
98         $this->_pdf = new pdffile;
99         $this->_config = include 'MLIB/PDF/medidas.php';
100         $this->_config = $this->_config[$tam];
101         $this->_nombre = $nombre;
102     }
103
104     /**
105      * Permite agregar nuevas paginas al pdf que se esta armando.
106      *
107      * @param  string $pagina Tipo de pagina que se va a utilizar.
108      * @param  string $orientacion Orientacion de la pagina en particular.
109      *
110      * @return void
111      * @access public
112      */
113     function newPage($pagina = "a4", $orientacion = null)
114     {
115         $this->_pagina_actual = $this->_pdf->new_page($pagina);
116         $this->_paginas[] = $this->_pagina_actual;
117         if(!is_null($orientacion) && $orientacion != $this->orientacion)
118             $this->_orientacion_distinta[$this->numPage()] = $orientacion;  
119     }
120
121     /**
122      * Funcion que retorna la orientacion de la pagina indicada.
123      * Si no se indica, toma la orientacion de la ultima pagina.
124      *
125      * @param int $pagina Numero de la pagina.
126      *
127      * @access public
128      * @return int
129      */
130     function getOrientation($pagina = null)
131     {
132         if(is_null($pagina))
133             $pagina = $this->numPage();
134         
135         if(isset($this->_orientacion_distinta[$pagina]))
136             return $this->_orientacion_distinta[$pagina];
137         else 
138             return $this->orientacion;
139     }
140
141     /**
142      * Funcion que genera el archivo y prepara los headers para que se envie.
143      *    
144      * @return void
145      * @access public
146      */
147     function display() 
148     {
149         header("Content-Disposition: filename=".$this->_nombre);
150         header("Content-Type: application/pdf");
151         $temp = $this->toPDF();
152         header('Content-Length: ' . strlen($temp));
153         echo $temp;
154     }
155
156     /**
157      * Funcion que devuelve el PDF.
158      *
159      * @return string
160      * @access public
161      */
162     function toPDF() {
163         return $this->_pdf->generate();
164     }
165
166     /**
167      * Funcion que permite agregar texto a una pagina.
168      *
169      * @param int $X $X
170      * @param int $Y $Y
171      * @param string $texto $texto
172      * @param int $estilo $estilo
173      * @param int $pag Numero de pagina virtual.
174      * @param string $transformacion Indica la orientacion de la pagina.
175      *
176      * @return void
177      * @access public
178      */
179     function addText($X, $Y, $texto, $estilo = '', $pag = null, $transformacion
180     = null)    {
181         $x = $X;
182         $y = $Y;
183         if(is_null($transformacion))
184             $transformacion = $this->getOrientation($pag);
185         switch (strtolower($transformacion)) {
186             case 'portrait':
187                 $X = $this->_portraitX($x,$y);
188                 $Y = $this->_portraitY($x,$y);
189                 break;
190             case 'landscape':
191                 $X = $this->_landscapeX($x,$y);
192                 $Y = $this->_landscapeY($x,$y);
193                 @$estilo['rotation'] += 90;
194                 break;
195         }
196         $this->_pdf->draw_text($X, $Y, $texto, $this->refPage($pag), $estilo);
197     }
198
199     /**
200      * Funcion que permite agregar un rectangulo a una pagina.
201      *
202      * @param int $Xi $Xi
203      * @param int $Yi $Yi
204      * @param int $Xf $Xf
205      * @param int $Yf $Yf
206      * @param long $estilo $estilo
207      * @param int $pag Numero de pagina virtual.
208      * @param string $transformacion Indica la orientacion de la pagina.
209      *
210      * @return void
211      * @access public
212      */
213     function addRectangle($Xi, $Yi, $Xf, $Yf, $estilo = '', $pag = null,
214             $transformacion = null) 
215     {
216         $xi = $Xi;
217         $yi = $Yi;
218         $xf = $Xf;
219         $yf = $Yf;
220         if(is_null($transformacion))
221             $transformacion = $this->getOrientation($pag);
222         switch (strtolower($transformacion)) {
223             case 'portrait':
224                 $Xi = $this->_portraitX($xi,$yi);
225                 $Yi = $this->_portraitY($xi,$yi);
226                 $Xf = $this->_portraitX($xf,$yf);
227                 $Yf = $this->_portraitY($xf,$yf);
228                 break;
229             case 'landscape':
230                 $Xi = $this->_landscapeX($xi,$yi);
231                 $Yi = $this->_landscapeY($xi,$yi);
232                 $Xf = $this->_landscapeX($xf,$yf);
233                 $Yf = $this->_landscapeY($xf,$yf);
234                 break;
235         }
236         $this->_pdf->draw_rectangle($Yi, $Xi, $Yf, $Xf, $this->refPage($pag), $estilo);
237     }
238
239     /**
240      * Funcion que permite agregar una linea a una pagina.
241      *
242      * @param int $Xi $Xi
243      * @param int $Yi $Yi
244      * @param int $Xf $Xf
245      * @param int $Yf $Yf
246      * @param int $estilo $estilo
247      * @param int $pag Numero de pagina virtual.
248      * @param string $transformacion Indica la orientacion de la pagina.
249      *
250      * @return void
251      * @access public
252      */
253     function addLine($Xi, $Yi, $Xf, $Yf, $estilo = '', $pag = null,
254             $transformacion = null)
255     {
256         $xi = $Xi;
257         $yi = $Yi;
258         $xf = $Xf;
259         $yf = $Yf;
260         if(is_null($transformacion))
261             $transformacion = $this->getOrientation($pag);
262         switch (strtolower($transformacion)) {
263             case 'portrait':
264                 $Xi = $this->_portraitX($xi,$yi);
265                 $Yi = $this->_portraitY($xi,$yi);
266                 $Xf = $this->_portraitX($xf,$yf);
267                 $Yf = $this->_portraitY($xf,$yf);
268                 break;
269             case 'landscape':
270                 $Xi = $this->_landscapeX($xi,$yi);
271                 $Yi = $this->_landscapeY($xi,$yi);
272                 $Xf = $this->_landscapeX($xf,$yf);
273                 $Yf = $this->_landscapeY($xf,$yf);
274                 break;
275         }
276        $this->_pdf->draw_line(array($Xi,$Xf),array($Yi,$Yf), 
277                 $this->refPage($pag),$estilo);
278     }
279
280     /**
281      * Funcion que permite agregar una imagen JPG o PNG a una pagina.
282      *
283      * @param string $archivo Path completo del archivo imagen.
284      * @param int    $X Posicion Horizontal.
285      * @param int    $Y Posixion vertical.
286      * @param int    $pag Numero de pagina virtual.
287      * @param string $formato Formato del archivo (Extension).
288      * @param string $transformacion Indica la orientacion de la pagina.
289      * @param array  $param Parametros de la libreria.
290      *
291      * @return void
292      * @access public
293      */
294     function addImage($archivo, $X, $Y, $pag = null, $formato = null,
295             $transformacion = null, $param = array()) {
296         $x = $X;
297         $y = $Y;
298         if(is_null($transformacion))
299             $transformacion = $this->getOrientation($pag);
300         switch (strtolower($transformacion)) {
301             case 'portrait':
302                 $X = $this->_portraitX($x,$y);
303                 $Y = $this->_portraitY($x,$y);
304                 break;
305             case 'landscape':
306                 $X = $this->_landscapeX($x,$y);
307                 $Y = $this->_landscapeY($x,$y);
308                 $param['rotation'] = 90;
309                 break;
310         }
311         $formato = strtolower($formato);
312         $fh = fopen($archivo, "r"); 
313         $filedata = fread($fh, filesize($archivo));
314         fclose($fh);
315         switch ($formato) {
316             case 'jpg':
317                 $image = $this->_pdf->jfif_embed($filedata);
318                 break;
319             case 'png':
320                 $image = $this->_pdf->png_embed($filedata);
321                 break;
322         }
323         $this->_pdf->image_place($image, $Y, $X, $this->refPage($pag), $param);
324     }
325
326     /**
327      * Funcion que wrappea una linea.                                         
328      *
329      * @param strgin $texto Texto que quiere wrappearse.
330      * @param int    $l_max Largo maximo del texto.
331      * @param array  $attr  Atributos del texto.
332      *
333      * @return string
334      * @access public
335      */
336     function wrapLine($texto, $l_max, $attr) {
337         //El if lo estoy haciendo porque en la funcion wordwrap de la libreria
338         //externa no tienen en cuenta que te pueden pasar un texto vacio a
339         //wrapear -> Amerita un mail a los autores.
340         if ($texto) {
341             return $this->_pdf->wrap_line ($texto, $l_max, $attr);
342         }
343         else {
344             return '';
345         }
346     }
347
348     /**
349      * Funcion que wrappea una linea.                                       
350      *
351      * @param strgin $texto Texto que quiere wrappearse.
352      * @param int    $l_max Largo maximo del texto.
353      * @param array  $attr  Atributos del texto.
354      *
355      * @return string
356      * @access public
357      */
358     function wordWrap($texto, $l_max, $attr) {
359         //El if lo estoy haciendo porque en la funcion wordwrap de la libreria
360         //externa no tienen en cuenta que te pueden pasar un texto vacio a
361         //wrapear -> Amerita un mail a los autores.
362         if ($texto) {
363             return $this->_pdf->word_wrap ($texto, $l_max, $attr);
364         }
365         else {
366             return array();
367         }
368     }
369     
370     /**
371      * Funcion que calcula cuanto va a ocupar cierto texto segun su formato en
372      * una pagina.
373      *
374      * @param strgin $texto Texto que quiere medirse.
375      * @param array  $attr  Atributos del texto.
376      *
377      * @return int
378      * @access public
379      */
380     function strlen($texto, $attr = '') {
381         return $this->_pdf->strlen($texto, $attr);
382     }
383
384     /**
385      * Funcion que devuelve la cantidad de paginas que contiene el documento.
386      *
387      * @return int
388      * @access public
389      */
390     function countPages() {
391         return count($this->_paginas);
392     }
393     
394     /**
395      * Funcion que devuelve el numero de la pagina actual.                   
396      *
397      * @param mixed $id Identificador de la pagina.
398      *
399      * @return int
400      * @access public
401      */
402     function numPage($id = null) {
403         $id = ($id) ? $id : $this->_pagina_actual;
404         return (array_search($id, $this->_paginas)) + 1;
405     }
406
407     /**
408      * Funcion que devuelve la referencia de una pagina vitual. Si no se pasa
409      * nada utilizo la actual.
410      *
411      * @param int $pag Numero de pagina.
412      *
413      * @return int
414      * @access public
415      */
416     function refPage($pag = null) {
417         return $pag ? $this->_paginas[$pag - 1] :
418             $this->_pagina_actual;
419     }
420
421     /**
422      * Funcion que devuelve el array de paginas
423      *
424      * @return array
425      * @access public
426      */
427     function getPages() {
428         return $this->_paginas;
429     }
430
431     /**
432      * Funcion que devuelve el ancho de la pagina.
433      *
434      * @param  string $orientacion Orientacion de la pagina.
435      *
436      * @return int
437      * @access public
438      */
439     function getWidth($pagina = null, $orientacion = null)
440     {
441         if(is_null($orientacion))
442             $orientacion = $this->getOrientation($pagina);
443         switch (strtolower($orientacion)) {
444             case 'landscape':
445                 $width = $this->_config['Yf'] - $this->_config['Yi'];
446                 break;
447             default:
448                 $width = $this->_config['Xf'] - $this->_config['Xi'];
449         }
450         return $width;
451
452     }
453
454     /**
455      * Funcion que devuelve el alto de la pagina.
456      *
457      * @param  string $orientacion Orientacion de la pagina.
458      *
459      * @return int
460      * @access public
461      */
462     function getHeight($pagina = null, $orientacion = null)
463     {
464         if(is_null($orientacion))
465             $orientacion = $this->getOrientation($pagina);
466         switch (strtolower($orientacion)) {
467             case 'landscape':
468                 $height = $this->_config['Xf'] - $this->_config['Xi'];
469                 break;
470             default:
471                 $height = $this->_config['Yf'] - $this->_config['Yi'];
472         }
473         return $height;
474     }
475
476     /**
477      * Funcion que devuelve la rotacion y traslacion para landscape. Variable X.
478      *
479      * @param int $x X
480      * @param int $y Y
481      *
482      * @return int
483      * @access protected
484      */
485     function _landscapeX($x, $y)
486     {
487         return -$y + $this->_config['Xf'];
488     }
489
490     /**
491      * Funcion que devuelve la rotacion y traslacion para landscape. Variable Y.
492      *
493      * @param int $x X
494      * @param int $y Y
495      *
496      * @return int
497      * @access protected
498      */
499     function _landscapeY($x, $y)
500     {
501         return $x + $this->_config['Yi'];
502     }
503
504     /**
505      * Funcion que devuelve la traslacion para portrait. Variable X.
506      *
507      * @param int $x X
508      * @param int $y Y
509      *
510      * @return int
511      * @access protected
512      */
513     function _portraitX($x, $y)
514     {
515         return $x + $this->_config['Xi'];
516     }
517
518     /**
519      * Funcion que devuelve la traslacion para portrait. Variable Y.
520      *
521      * @param int $x X
522      * @param int $y Y
523      *
524      * @return int
525      * @access protected
526      */
527     function _portraitY($x, $y)
528     {
529         return $y + $this->_config['Yi'];
530     }
531
532     /**
533      * Funcion que devuelve el tamaƱo de una imagen.
534      *
535      * @param $oid Object id
536      */
537     function getImageSize($oid) {
538         return $this->get_image_size($oid);
539     }
540 }
541 ?>