]> git.llucax.com Git - mecon/meconlib.git/blobdiff - lib/MECON/PDF/Imagen.php
Agrego la posibilidad de utilizar mecon_html_icon con cualquier imagen.
[mecon/meconlib.git] / lib / MECON / PDF / Imagen.php
index 92928038e499cd50938ce2f4a399b9f2a6b0c41b..c2a78790938037a84e491c709ccdcb31e8aa369f 100644 (file)
@@ -30,6 +30,330 @@ require_once 'MECON/PDF/Contenido.php';
  * Libreria de imagenes para PDF.
  */
 class MECON_PDF_Imagen extends MECON_PDF_Contenido {
+
+    /**
+     * Imagen de Image_Transform.
+     * @var string $resource
+     * @access protected
+     */
+    var $_resource;
+    
+    /**
+     * Alineacion de la imagen.
+     * @var string $align
+     * @access protected
+     */
+    var $_align;
+
+    /**
+     * Orientacion de las nuevas paginas
+     * @var string $orientacion  
+     * @access protected
+     */
+    var $_orientacion;
+
+    /**
+     * Indica si el encabezado debe ir en la nuevas paginas.
+     * @var bool $encabezado
+     * @access protected
+     */
+    var $_encabezado;
+
+    /**
+     * Array de parametros que utiliza la libreria.
+     * @var array $param
+     * @access protected
+     */
+    var $_param;
+
+    /**
+     * Array de MECON_PDF_Texto para agregar al lado de las imagenes.
+     * @var array $contenido
+     * @access protected
+     */
+    var $_contenido = array();
+    
+    /**
+     * Class Constructor
+     *
+     * @param string $resource Imagen de Image_Transform.
+     * @param string $align Alineacion de la imagen (left, center, right).
+     * @param string $orientacion Orientacion que tendran las nuevas paginas que
+     *                            esta clase genere.
+     * @param bool $encabezado Indica si las paginas nuevas que genere esta
+     *                         clase tendran el encabezado de MECON_PDF_Marco.
+     * @param array $param Parametros de la imagen.
+     *
+     * @return void
+     * @access public
+     */
+    function MECON_PDF_Imagen($resource = null, $align = "center", $orientacion =
+            null, $encabezado = true, $param = array()) {
+        $this->_resource = $resource;
+        $this->_align = $align;
+        $this->_orientacion = $orientacion;
+        $this->_encabezado = $encabezado;
+        $this->_param = $param;
+    }
     
+    /**
+     * Permite agregar texto contenido que sera puesto al lado de las imagenes.
+     *
+     * @param Object $TEXTO MECON_PDF_Texto.
+     *
+     * @return void
+     * @access public
+     */
+    function agregarContenido($TEXTO) {
+        $this->_contenido[] = $TEXTO;
+    }
+
+    /**
+     * Permite rotar la imagen n grados.
+     *
+     * @param int $grados Grados de rotación.
+     *
+     * @return mixed
+     * @access public
+     */
+    function rotar($grados) {
+        $this->_param['rotation'] = $grados;
+    }
+   
+    /**
+     * Funcion que agrega el contenido de la tabla que se este utilizando al
+     * PDF.
+     *
+     * @param &Object $MARCO MECON_PDF_Marco
+     *
+     * @return void
+     * @access public
+     */
+    function toPDF(&$MARCO) {
+        //Obtengo el tamaño de la imagen
+        $tam['width']  = $this->_resource->getImageWidth();
+        $tam['height'] = $this->_resource->getImageHeight();
+        //Obtengo el espacio disponible en la pagina
+        $alto = $MARCO->espacioDisponible;
+        //Veo si tengo que crear una nueva pagina.
+        if ($alto <= 0 ) {
+            $this->_newPage($MARCO);
+            $alto = $MARCO->espacioDisponible;
+        }
+        //Obtengo los valores de la pagina
+        $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
+        $alto_pagina = $MARCO->getHeight($MARCO->refPage(),$MARCO->getOrientation());
+        $orientacion = $MARCO->getOrientation();
+        //Veo si me alcanza el tamaño para agregarlo en lo que me queda de la
+        //pagina (chequeando que no sea una pagina nueva)
+        if (($alto - $tam['height'] <= 0) && ($alto != $alto_pagina)) {
+            $this->_newPage($MARCO);
+            $alto = $MARCO->espacioDisponible;
+        }
+        //Veo si entra en el alto disponible
+        if ($alto - $tam['height'] <= 0) {
+            $this->_resource->scaleByY($alto);
+        }
+        //Veo si entra en el ancho disponible
+        if ($ancho_pagina <= $tam['width']) {
+            $this->_resource->scaleByX($anchoPagina);
+        }
+        //Obtego el nombre temporal
+        $tmp_path = tempnam('/tmp/', 'MECON_PDF_Images_');
+        //Salvo la imagen temporalmente
+        $this->_resource->save($tmp_path, 'png');
+        //Obtengo la posicion Y
+        $alto -= $tam['height'];
+        //Obtengo la posicion X
+        $X = $this->_X($MARCO, $tam['width']);
+        //Agrego la imagen
+        $MARCO->addImage($tmp_path, $X, $alto, null, 'png', $this->_orientacion,
+                $this->_param);
+        if ($this->_contenido && ($this->_align == 'left' || 
+                    $this->_align == 'right')) {
+            $this->_contenidoToPdf($MARCO, $tam, $alto);
+            $alto = $MARCO->espacioDisponible;
+        }
+        //Seteo el espacio disponible en la pagina.
+        $MARCO->espacioDisponible = $alto - 2;
+    }
+
+    /**
+     * Agrega al pdf el texto adjunto a la imagen.
+     *
+     * @param &Object $MARCO MECON_PDF_Marco.
+     * @param array $tam Tamaño de la imagen.
+     * @param int $alto Alto disponible en la pagina.
+     *
+     * @return void
+     * @access protected
+     */
+    function _contenidoToPdf(&$MARCO, $tam, $alto) {
+        $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
+        //Obtengo las coordenadas del espacio disponible que se corresponde con
+        //el tamaño de la imagen.
+        switch ($this->_align) {
+            case 'left':
+                $coord['Xi'] = $tam['width'] + 2;
+                $coord['Xf'] = $ancho_pagina;
+                $coord['Yi'] = $alto;
+                $coord['Yf'] = $alto + $tam['height'];
+                break;
+            case 'right':
+                $coord['Xi'] = 0;
+                $coord['Xf'] = $ancho_pagina - $tam['width'] - 2;
+                $coord['Yi'] = $alto;
+                $coord['Yf'] = $alto + $tam['height'];
+                break;
+        }
+        //Por cada TEXTO agregado.
+        foreach ($this->_contenido as $TEXTO) {
+            $this->_textoToPdf($MARCO, $coord, $alto, $TEXTO);
+        }
+    }
+
+    /**
+     * Agrega objeto por objeto el contenido al pdf general.
+     *
+     * @param &Object $MARCO MECON_PDF_Marco.
+     * @param array $coord Coordenadas para el texto.
+     * @param int $alto Alto disponible en la pagina.
+     * @param Object $TEXTO MECON_PDF_Texto.
+     *
+     * @return void
+     * @access protected
+     */
+    function _textoToPdf(&$MARCO, $coord, $alto, $TEXTO) {
+        //Obtengo los parrafos y estilos del texto
+        $parrafos = $TEXTO->getParrafos();
+        $estilos  = $TEXTO->getEstilo();
+        //Obtengo los limites escribibles al lado de la imagen
+        $ancho_texto = $coord['Xf'] - $coord['Xi'] - 2;
+        $alto_texto = $coord['Yf'];
+        //Obtengo el ancho total de la pagina
+        $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
+        //Por cada parrafo
+        for ($i=0; $i < $TEXTO->cantParrafos(); $i++) {
+            //Veo si hay definido un estilo para el parrafo.
+            if (@!$estilos[$i]) {
+                $estilos[$i] = $TEXTO->getEstiloDefecto();
+            }
+            //Armo un array con el parrafo en donde cada componente es una linea
+            //que cumple con el ancho maximo permitido.
+            //Veo si el texto esta al lado de la imagen o por debajo de esta.
+            if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
+                $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_pagina - 2,
+                        $estilos[$i]);
+            }
+            else {
+                $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_texto,
+                        $estilos[$i]);
+            }
+            //Por cada linea
+            if (@$txt) {
+                while (count($txt)) {
+                    $t = array_shift($txt);
+                    $alto_texto -= $estilos[$i]['height'];
+                    //Veo si el texto esta al lado de la imagen o por debajo de
+                    //esta.
+                    if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
+                        //Veo si ya estaba escribiendo debajo de la imagen.
+                        if (@!$tmp) {
+                            $tmp = implode(' ', $txt);
+                            $txt = @$MARCO->wordWrap($tmp, $ancho_pagina - 2,
+                                    $estilos[$i]);
+                            $t = array_shift($txt);
+                            $alto = $alto_texto;
+                        }
+                        else {
+                            $alto -= $estilos[$i]['height'];
+                        }
+                        //Veo si hay que agragar una nueva pagina.
+                        if ($alto <= 0) {
+                            $this->_newPage($MARCO);
+                            $alto = $MARCO->espacioDisponible;
+                        }
+                        //Calculo el X en donde debo comenzar a escribir segun
+                        //la alineacion del texto.
+                        if (@$estilos[$i]['align'] == 'center') {
+                            $tam = @$MARCO->strlen($t, $estilos[$i]);
+                            $init = ($ancho_pagina - $tam) / 2;
+                        }
+                        elseif (@$estilos[$i]['align'] == 'right') {
+                            $tam = @$MARCO->strlen($t, $estilos[$i]);
+                            $init = $ancho_pagina - $tam + 1;
+                        }
+                        else {
+                            $init = 0;
+                        }
+                        $MARCO->addText($init, $alto + 2, $t, $estilos[$i], 
+                                null, $this->_orientacion);
+                    }
+                    else {
+                        //Estoy escribiendo al lado de la imagen.
+                        //Calculo el X en donde debo comenzar a escribir segun
+                        //la alineacion del texto.
+                        if (@$estilos[$i]['align'] == 'center') {
+                            $tam = @$MARCO->strlen($t, $estilos[$i]);
+                            $init = ($ancho_texto - $tam) / 2;
+                        }
+                        elseif (@$estilos[$i]['align'] == 'right') {
+                            $tam = @$MARCO->strlen($t, $estilos[$i]);
+                            $init = $ancho_texto - $tam + 3;
+                        }
+                        else {
+                            $init = 2;
+                        }
+
+                        $init += $coord['Xi'];
+
+                        $MARCO->addText($init, $alto_texto + 2, $t, $estilos[$i], 
+                                null, $this->_orientacion);
+                    }
+                }            
+            }
+        }
+        //Seteo el nuevo alto de la pagina.
+        $MARCO->espacioDisponible = $alto;
+    }
+
+    /**
+     * Permite obtener el valor X segun la alineacion.
+     *
+     * @param &Object $MARCO MECON_PDF_Marco.
+     * @param int width Ancho de la imagen a agregar.
+     *
+     * @return int
+     * @access public
+     */
+    function _X(&$MARCO, $width) {
+        $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
+        switch ($this->_align) {
+            case 'left':
+                $X = 0;
+                break;
+            case 'center':
+                $X = ($ancho_pagina / 2) - ($width / 2);
+                break;
+            case 'right':
+                $X = $ancho_pagina - $width;
+                break;
+        }
+        return $X;
+    }
+   
+    /**
+     * Funcion que se encarga de crear las nuevas paginas.
+     *
+     * @param &Object $MARCO MECON_PDF_Marco
+     *
+     * @return void
+     * @access protected
+     */
+    function _newPage(&$MARCO) {
+        $tmp = ($this->_orientacion) ? $this->_orientacion :
+            $MARCO->getOrientation();
+        $MARCO->newPage($MARCO->tamanio, $tmp, $this->_encabezado);               
+    }
 }
 ?>
\ No newline at end of file