------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ 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); } } ?>