1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
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)
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.
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 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'MECON/PDF/Contenido.php';
30 * Libreria de imagenes para PDF.
32 class MECON_PDF_Imagen extends MECON_PDF_Contenido {
35 * Imagen de Image_Transform.
36 * @var string $resource
42 * Alineacion de la imagen.
49 * Orientacion de las nuevas paginas
50 * @var string $orientacion
56 * Indica si el encabezado debe ir en la nuevas paginas.
57 * @var bool $encabezado
63 * Array de parametros que utiliza la libreria.
70 * Array de MECON_PDF_Texto para agregar al lado de las imagenes.
71 * @var array $contenido
74 var $_contenido = array();
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
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.
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;
100 * Permite agregar texto contenido que sera puesto al lado de las imagenes.
102 * @param Object $TEXTO MECON_PDF_Texto.
107 function agregarContenido($TEXTO) {
108 $this->_contenido[] = $TEXTO;
112 * Permite rotar la imagen n grados.
114 * @param int $grados Grados de rotación.
119 function rotar($grados) {
120 $this->_param['rotation'] = $grados;
124 * Funcion que agrega el contenido de la tabla que se este utilizando al
127 * @param &Object $MARCO MECON_PDF_Marco
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.
140 $this->_newPage($MARCO);
141 $alto = $MARCO->espacioDisponible;
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;
153 //Veo si entra en el alto disponible
154 if ($alto - $tam['height'] <= 0) {
155 $this->_resource->scaleByY($alto);
157 //Veo si entra en el ancho disponible
158 if ($ancho_pagina <= $tam['width']) {
159 $this->_resource->scaleByX($anchoPagina);
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']);
170 $MARCO->addImage($tmp_path, $X, $alto, null, 'png', $this->_orientacion,
172 if ($this->_contenido && ($this->_align == 'left' ||
173 $this->_align == 'right')) {
174 $this->_contenidoToPdf($MARCO, $tam, $alto);
175 $alto = $MARCO->espacioDisponible;
177 //Seteo el espacio disponible en la pagina.
178 $MARCO->espacioDisponible = $alto - 2;
182 * Agrega al pdf el texto adjunto a la imagen.
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.
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) {
197 $coord['Xi'] = $tam['width'] + 2;
198 $coord['Xf'] = $ancho_pagina;
199 $coord['Yi'] = $alto;
200 $coord['Yf'] = $alto + $tam['height'];
204 $coord['Xf'] = $ancho_pagina - $tam['width'] - 2;
205 $coord['Yi'] = $alto;
206 $coord['Yf'] = $alto + $tam['height'];
209 //Por cada TEXTO agregado.
210 foreach ($this->_contenido as $TEXTO) {
211 $this->_textoToPdf($MARCO, $coord, $alto, $TEXTO);
216 * Agrega objeto por objeto el contenido al pdf general.
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.
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());
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();
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,
249 $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_texto,
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
259 if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
260 //Veo si ya estaba escribiendo debajo de la imagen.
262 $tmp = implode(' ', $txt);
263 $txt = @$MARCO->wordWrap($tmp, $ancho_pagina - 2,
265 $t = array_shift($txt);
269 $alto -= $estilos[$i]['height'];
271 //Veo si hay que agragar una nueva pagina.
273 $this->_newPage($MARCO);
274 $alto = $MARCO->espacioDisponible;
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;
282 elseif (@$estilos[$i]['align'] == 'right') {
283 $tam = @$MARCO->strlen($t, $estilos[$i]);
284 $init = $ancho_pagina - $tam + 1;
289 $MARCO->addText($init, $alto + 2, $t, $estilos[$i],
290 null, $this->_orientacion);
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;
300 elseif (@$estilos[$i]['align'] == 'right') {
301 $tam = @$MARCO->strlen($t, $estilos[$i]);
302 $init = $ancho_texto - $tam + 3;
308 $init += $coord['Xi'];
310 $MARCO->addText($init, $alto_texto + 2, $t, $estilos[$i],
311 null, $this->_orientacion);
316 //Seteo el nuevo alto de la pagina.
317 $MARCO->espacioDisponible = $alto;
321 * Permite obtener el valor X segun la alineacion.
323 * @param &Object $MARCO MECON_PDF_Marco.
324 * @param int width Ancho de la imagen a agregar.
329 function _X(&$MARCO, $width) {
330 $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
331 switch ($this->_align) {
336 $X = ($ancho_pagina / 2) - ($width / 2);
339 $X = $ancho_pagina - $width;
346 * Funcion que se encarga de crear las nuevas paginas.
348 * @param &Object $MARCO MECON_PDF_Marco
353 function _newPage(&$MARCO) {
354 $tmp = ($this->_orientacion) ? $this->_orientacion :
355 $MARCO->getOrientation();
356 $MARCO->newPage($MARCO->tamanio, $tmp, $this->_encabezado);