]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/PDF/Imagen.php
Se agrega un objeto que permite armar tablas html a partir de templates.
[mecon/meconlib.git] / lib / MLIB / PDF / Imagen.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: jue nov  6 16:13:38 ART 2003
21 Autor:  Martin Marrese <mmarre@mecon.gov.ar>
22 -------------------------------------------------------------------------------
23 $Id$
24 -----------------------------------------------------------------------------*/
25
26 require_once 'MLIB/PDF/Contenido.php';
27
28 /**
29  * Libreria de imagenes para PDF.
30  */
31 class MLIB_PDF_Imagen extends MLIB_PDF_Contenido {
32
33     /**
34      * Imagen de Image_Transform.
35      * @var string $resource
36      * @access protected
37      */
38     var $_resource;
39     
40     /**
41      * Alineacion de la imagen.
42      * @var string $align
43      * @access protected
44      */
45     var $_align;
46
47     /**
48      * Orientacion de las nuevas paginas
49      * @var string $orientacion  
50      * @access protected
51      */
52     var $_orientacion;
53
54     /**
55      * Indica si el encabezado debe ir en la nuevas paginas.
56      * @var bool $encabezado
57      * @access protected
58      */
59     var $_encabezado;
60
61     /**
62      * Array de parametros que utiliza la libreria.
63      * @var array $param
64      * @access protected
65      */
66     var $_param;
67
68     /**
69      * Array de MLIB_PDF_Texto para agregar al lado de las imagenes.
70      * @var array $contenido
71      * @access protected
72      */
73     var $_contenido = array();
74     
75     /**
76      * Class Constructor
77      *
78      * @param string $resource Imagen de Image_Transform.
79      * @param string $align Alineacion de la imagen (left, center, right).
80      * @param string $orientacion Orientacion que tendran las nuevas paginas que
81      *                            esta clase genere.
82      * @param bool $encabezado Indica si las paginas nuevas que genere esta
83      *                         clase tendran el encabezado de MLIB_PDF_Marco.
84      * @param array $param Parametros de la imagen.
85      *
86      * @return void
87      * @access public
88      */
89     function MLIB_PDF_Imagen($resource = null, $align = "center", $orientacion =
90             null, $encabezado = true, $param = array()) {
91         $this->_resource = $resource;
92         $this->_align = $align;
93         $this->_orientacion = $orientacion;
94         $this->_encabezado = $encabezado;
95         $this->_param = $param;
96     }
97     
98     /**
99      * Permite agregar texto contenido que sera puesto al lado de las imagenes.
100      *
101      * @param Object $TEXTO MLIB_PDF_Texto.
102      *
103      * @return void
104      * @access public
105      */
106     function agregarContenido($TEXTO) {
107         $this->_contenido[] = $TEXTO;
108     }
109
110     /**
111      * Permite rotar la imagen n grados.
112      *
113      * @param int $grados Grados de rotación.
114      *
115      * @return mixed
116      * @access public
117      */
118     function rotar($grados) {
119         $this->_param['rotation'] = $grados;
120     }
121    
122     /**
123      * Funcion que agrega el contenido de la tabla que se este utilizando al
124      * PDF.
125      *
126      * @param &Object $MARCO MLIB_PDF_Marco
127      *
128      * @return void
129      * @access public
130      */
131     function toPDF(&$MARCO) {
132         //Obtengo el tamaño de la imagen
133         $tam['width']  = $this->_resource->getImageWidth();
134         $tam['height'] = $this->_resource->getImageHeight();
135         //Obtengo el espacio disponible en la pagina
136         $alto = $MARCO->espacioDisponible;
137         //Veo si tengo que crear una nueva pagina.
138         if ($alto <= 0 ) {
139             $this->_newPage($MARCO);
140             $alto = $MARCO->espacioDisponible;
141         }
142         //Obtengo los valores de la pagina
143         $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
144         $alto_pagina = $MARCO->getHeight($MARCO->refPage(),$MARCO->getOrientation());
145         $orientacion = $MARCO->getOrientation();
146         //Veo si me alcanza el tamaño para agregarlo en lo que me queda de la
147         //pagina (chequeando que no sea una pagina nueva)
148         if (($alto - $tam['height'] <= 0) && ($alto != $alto_pagina)) {
149             $this->_newPage($MARCO);
150             $alto = $MARCO->espacioDisponible;
151         }
152         //Veo si entra en el alto disponible
153         if ($alto - $tam['height'] <= 0) {
154             $this->_resource->scaleByY($alto);
155         }
156         //Veo si entra en el ancho disponible
157         if ($ancho_pagina <= $tam['width']) {
158             $this->_resource->scaleByX($anchoPagina);
159         }
160         //Obtego el nombre temporal
161         $tmp_path = tempnam('/tmp/', 'MLIB_PDF_Images_');
162         //Salvo la imagen temporalmente
163         $this->_resource->save($tmp_path, 'png');
164         //Obtengo la posicion Y
165         $alto -= $tam['height'];
166         //Obtengo la posicion X
167         $X = $this->_X($MARCO, $tam['width']);
168         //Agrego la imagen
169         $MARCO->addImage($tmp_path, $X, $alto, null, 'png', $this->_orientacion,
170                 $this->_param);
171         if ($this->_contenido && ($this->_align == 'left' || 
172                     $this->_align == 'right')) {
173             $this->_contenidoToPdf($MARCO, $tam, $alto);
174             $alto = $MARCO->espacioDisponible;
175         }
176         //Seteo el espacio disponible en la pagina.
177         $MARCO->espacioDisponible = $alto - 2;
178     }
179
180     /**
181      * Agrega al pdf el texto adjunto a la imagen.
182      *
183      * @param &Object $MARCO MLIB_PDF_Marco.
184      * @param array $tam Tamaño de la imagen.
185      * @param int $alto Alto disponible en la pagina.
186      *
187      * @return void
188      * @access protected
189      */
190     function _contenidoToPdf(&$MARCO, $tam, $alto) {
191         $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
192         //Obtengo las coordenadas del espacio disponible que se corresponde con
193         //el tamaño de la imagen.
194         switch ($this->_align) {
195             case 'left':
196                 $coord['Xi'] = $tam['width'] + 2;
197                 $coord['Xf'] = $ancho_pagina;
198                 $coord['Yi'] = $alto;
199                 $coord['Yf'] = $alto + $tam['height'];
200                 break;
201             case 'right':
202                 $coord['Xi'] = 0;
203                 $coord['Xf'] = $ancho_pagina - $tam['width'] - 2;
204                 $coord['Yi'] = $alto;
205                 $coord['Yf'] = $alto + $tam['height'];
206                 break;
207         }
208         //Por cada TEXTO agregado.
209         foreach ($this->_contenido as $TEXTO) {
210             $this->_textoToPdf($MARCO, $coord, $alto, $TEXTO);
211         }
212     }
213
214     /**
215      * Agrega objeto por objeto el contenido al pdf general.
216      *
217      * @param &Object $MARCO MLIB_PDF_Marco.
218      * @param array $coord Coordenadas para el texto.
219      * @param int $alto Alto disponible en la pagina.
220      * @param Object $TEXTO MLIB_PDF_Texto.
221      *
222      * @return void
223      * @access protected
224      */
225     function _textoToPdf(&$MARCO, $coord, $alto, $TEXTO) {
226         //Obtengo los parrafos y estilos del texto
227         $parrafos = $TEXTO->getParrafos();
228         $estilos  = $TEXTO->getEstilo();
229         //Obtengo los limites escribibles al lado de la imagen
230         $ancho_texto = $coord['Xf'] - $coord['Xi'] - 2;
231         $alto_texto = $coord['Yf'];
232         //Obtengo el ancho total de la pagina
233         $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
234         //Por cada parrafo
235         for ($i=0; $i < $TEXTO->cantParrafos(); $i++) {
236             //Veo si hay definido un estilo para el parrafo.
237             if (@!$estilos[$i]) {
238                 $estilos[$i] = $TEXTO->getEstiloDefecto();
239             }
240             //Armo un array con el parrafo en donde cada componente es una linea
241             //que cumple con el ancho maximo permitido.
242             //Veo si el texto esta al lado de la imagen o por debajo de esta.
243             if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
244                 $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_pagina - 2,
245                         $estilos[$i]);
246             }
247             else {
248                 $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_texto,
249                         $estilos[$i]);
250             }
251             //Por cada linea
252             if (@$txt) {
253                 while (count($txt)) {
254                     $t = array_shift($txt);
255                     $alto_texto -= $estilos[$i]['height'];
256                     //Veo si el texto esta al lado de la imagen o por debajo de
257                     //esta.
258                     if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
259                         //Veo si ya estaba escribiendo debajo de la imagen.
260                         if (@!$tmp) {
261                             $tmp = implode(' ', $txt);
262                             $txt = @$MARCO->wordWrap($tmp, $ancho_pagina - 2,
263                                     $estilos[$i]);
264                             $t = array_shift($txt);
265                             $alto = $alto_texto;
266                         }
267                         else {
268                             $alto -= $estilos[$i]['height'];
269                         }
270                         //Veo si hay que agragar una nueva pagina.
271                         if ($alto <= 0) {
272                             $this->_newPage($MARCO);
273                             $alto = $MARCO->espacioDisponible;
274                         }
275                         //Calculo el X en donde debo comenzar a escribir segun
276                         //la alineacion del texto.
277                         if (@$estilos[$i]['align'] == 'center') {
278                             $tam = @$MARCO->strlen($t, $estilos[$i]);
279                             $init = ($ancho_pagina - $tam) / 2;
280                         }
281                         elseif (@$estilos[$i]['align'] == 'right') {
282                             $tam = @$MARCO->strlen($t, $estilos[$i]);
283                             $init = $ancho_pagina - $tam + 1;
284                         }
285                         else {
286                             $init = 0;
287                         }
288                         $MARCO->addText($init, $alto + 2, $t, $estilos[$i], 
289                                 null, $this->_orientacion);
290                     }
291                     else {
292                         //Estoy escribiendo al lado de la imagen.
293                         //Calculo el X en donde debo comenzar a escribir segun
294                         //la alineacion del texto.
295                         if (@$estilos[$i]['align'] == 'center') {
296                             $tam = @$MARCO->strlen($t, $estilos[$i]);
297                             $init = ($ancho_texto - $tam) / 2;
298                         }
299                         elseif (@$estilos[$i]['align'] == 'right') {
300                             $tam = @$MARCO->strlen($t, $estilos[$i]);
301                             $init = $ancho_texto - $tam + 3;
302                         }
303                         else {
304                             $init = 2;
305                         }
306
307                         $init += $coord['Xi'];
308
309                         $MARCO->addText($init, $alto_texto + 2, $t, $estilos[$i], 
310                                 null, $this->_orientacion);
311                     }
312                 }            
313             }
314         }
315         //Seteo el nuevo alto de la pagina.
316         $MARCO->espacioDisponible = $alto;
317     }
318
319     /**
320      * Permite obtener el valor X segun la alineacion.
321      *
322      * @param &Object $MARCO MLIB_PDF_Marco.
323      * @param int width Ancho de la imagen a agregar.
324      *
325      * @return int
326      * @access public
327      */
328     function _X(&$MARCO, $width) {
329         $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
330         switch ($this->_align) {
331             case 'left':
332                 $X = 0;
333                 break;
334             case 'center':
335                 $X = ($ancho_pagina / 2) - ($width / 2);
336                 break;
337             case 'right':
338                 $X = $ancho_pagina - $width;
339                 break;
340         }
341         return $X;
342     }
343    
344     /**
345      * Funcion que se encarga de crear las nuevas paginas.
346      *
347      * @param &Object $MARCO MLIB_PDF_Marco
348      *
349      * @return void
350      * @access protected
351      */
352     function _newPage(&$MARCO) {
353         $tmp = ($this->_orientacion) ? $this->_orientacion :
354             $MARCO->getOrientation();
355         $MARCO->newPage($MARCO->tamanio, $tmp, $this->_encabezado);               
356     }
357 }
358 ?>