X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/aaf936a8df4c040ac679c331da7d3137a4863fe4..491e3ed8d9646fc86ccbf3ed9ed1593faedbe167:/lib/MECON/PDF/Imagen.php diff --git a/lib/MECON/PDF/Imagen.php b/lib/MECON/PDF/Imagen.php index ce52b67..c2a7879 100644 --- a/lib/MECON/PDF/Imagen.php +++ b/lib/MECON/PDF/Imagen.php @@ -66,6 +66,13 @@ class MECON_PDF_Imagen extends MECON_PDF_Contenido { */ var $_param; + /** + * Array de MECON_PDF_Texto para agregar al lado de las imagenes. + * @var array $contenido + * @access protected + */ + var $_contenido = array(); + /** * Class Constructor * @@ -88,6 +95,18 @@ class MECON_PDF_Imagen extends MECON_PDF_Contenido { $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. @@ -101,20 +120,6 @@ class MECON_PDF_Imagen extends MECON_PDF_Contenido { $this->_param['rotation'] = $grados; } - /** - * 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); - } - /** * Funcion que agrega el contenido de la tabla que se este utilizando al * PDF. @@ -128,21 +133,17 @@ class MECON_PDF_Imagen extends MECON_PDF_Contenido { //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)) { @@ -157,26 +158,165 @@ class MECON_PDF_Imagen extends MECON_PDF_Contenido { 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. * @@ -201,5 +341,19 @@ class MECON_PDF_Imagen extends MECON_PDF_Contenido { } 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