X-Git-Url: https://git.llucax.com/mecon/meconlib.git/blobdiff_plain/67d328b236b5531e94572af215772303e022bcfd..e16973f3e09a6f9624cc3f10a1f0a365763bb69f:/lib/MECON/PDF/Imagen.php diff --git a/lib/MECON/PDF/Imagen.php b/lib/MECON/PDF/Imagen.php index 9292803..c2a7879 100644 --- a/lib/MECON/PDF/Imagen.php +++ b/lib/MECON/PDF/Imagen.php @@ -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