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