1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
4 -------------------------------------------------------------------------------
5 This file is part of mlib.
7 mlib is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2 of the License, or (at your option)
12 mlib is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License; if not,
17 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 Boston, MA 02111-1307 USA
19 -------------------------------------------------------------------------------
20 Creado: jue nov 6 16:13:38 ART 2003
21 Autor: Martin Marrese <mmarre@mecon.gov.ar>
22 -------------------------------------------------------------------------------
24 -----------------------------------------------------------------------------*/
26 require_once 'MLIB/PDF/Contenido.php';
29 * Libreria de imagenes para PDF.
31 class MLIB_PDF_Imagen extends MLIB_PDF_Contenido {
34 * Imagen de Image_Transform.
35 * @var string $resource
41 * Alineacion de la imagen.
48 * Orientacion de las nuevas paginas
49 * @var string $orientacion
55 * Indica si el encabezado debe ir en la nuevas paginas.
56 * @var bool $encabezado
62 * Array de parametros que utiliza la libreria.
69 * Array de MLIB_PDF_Texto para agregar al lado de las imagenes.
70 * @var array $contenido
73 var $_contenido = array();
78 * @param string $resource Imagen de Image_Transform.
79 * @param string $align Alineacion de la imagen (left, center, right).
80 * @param string $orientacion Orientacion que tendran las nuevas paginas que
82 * @param bool $encabezado Indica si las paginas nuevas que genere esta
83 * clase tendran el encabezado de MLIB_PDF_Marco.
84 * @param array $param Parametros de la imagen.
89 function MLIB_PDF_Imagen($resource = null, $align = "center", $orientacion =
90 null, $encabezado = true, $param = array()) {
91 $this->_resource = $resource;
92 $this->_align = $align;
93 $this->_orientacion = $orientacion;
94 $this->_encabezado = $encabezado;
95 $this->_param = $param;
99 * Permite agregar texto contenido que sera puesto al lado de las imagenes.
101 * @param Object $TEXTO MLIB_PDF_Texto.
106 function agregarContenido($TEXTO) {
107 $this->_contenido[] = $TEXTO;
111 * Permite rotar la imagen n grados.
113 * @param int $grados Grados de rotación.
118 function rotar($grados) {
119 $this->_param['rotation'] = $grados;
123 * Funcion que agrega el contenido de la tabla que se este utilizando al
126 * @param &Object $MARCO MLIB_PDF_Marco
131 function toPDF(&$MARCO) {
132 //Obtengo el tamaño de la imagen
133 $tam['width'] = $this->_resource->getImageWidth();
134 $tam['height'] = $this->_resource->getImageHeight();
135 //Obtengo el espacio disponible en la pagina
136 $alto = $MARCO->espacioDisponible;
137 //Veo si tengo que crear una nueva pagina.
139 $this->_newPage($MARCO);
140 $alto = $MARCO->espacioDisponible;
142 //Obtengo los valores de la pagina
143 $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
144 $alto_pagina = $MARCO->getHeight($MARCO->refPage(),$MARCO->getOrientation());
145 $orientacion = $MARCO->getOrientation();
146 //Veo si me alcanza el tamaño para agregarlo en lo que me queda de la
147 //pagina (chequeando que no sea una pagina nueva)
148 if (($alto - $tam['height'] <= 0) && ($alto != $alto_pagina)) {
149 $this->_newPage($MARCO);
150 $alto = $MARCO->espacioDisponible;
152 //Veo si entra en el alto disponible
153 if ($alto - $tam['height'] <= 0) {
154 $this->_resource->scaleByY($alto);
156 //Veo si entra en el ancho disponible
157 if ($ancho_pagina <= $tam['width']) {
158 $this->_resource->scaleByX($anchoPagina);
160 //Obtego el nombre temporal
161 $tmp_path = tempnam('/tmp/', 'MLIB_PDF_Images_');
162 //Salvo la imagen temporalmente
163 $this->_resource->save($tmp_path, 'png');
164 //Obtengo la posicion Y
165 $alto -= $tam['height'];
166 //Obtengo la posicion X
167 $X = $this->_X($MARCO, $tam['width']);
169 $MARCO->addImage($tmp_path, $X, $alto, null, 'png', $this->_orientacion,
171 if ($this->_contenido && ($this->_align == 'left' ||
172 $this->_align == 'right')) {
173 $this->_contenidoToPdf($MARCO, $tam, $alto);
174 $alto = $MARCO->espacioDisponible;
176 //Seteo el espacio disponible en la pagina.
177 $MARCO->espacioDisponible = $alto - 2;
181 * Agrega al pdf el texto adjunto a la imagen.
183 * @param &Object $MARCO MLIB_PDF_Marco.
184 * @param array $tam Tamaño de la imagen.
185 * @param int $alto Alto disponible en la pagina.
190 function _contenidoToPdf(&$MARCO, $tam, $alto) {
191 $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
192 //Obtengo las coordenadas del espacio disponible que se corresponde con
193 //el tamaño de la imagen.
194 switch ($this->_align) {
196 $coord['Xi'] = $tam['width'] + 2;
197 $coord['Xf'] = $ancho_pagina;
198 $coord['Yi'] = $alto;
199 $coord['Yf'] = $alto + $tam['height'];
203 $coord['Xf'] = $ancho_pagina - $tam['width'] - 2;
204 $coord['Yi'] = $alto;
205 $coord['Yf'] = $alto + $tam['height'];
208 //Por cada TEXTO agregado.
209 foreach ($this->_contenido as $TEXTO) {
210 $this->_textoToPdf($MARCO, $coord, $alto, $TEXTO);
215 * Agrega objeto por objeto el contenido al pdf general.
217 * @param &Object $MARCO MLIB_PDF_Marco.
218 * @param array $coord Coordenadas para el texto.
219 * @param int $alto Alto disponible en la pagina.
220 * @param Object $TEXTO MLIB_PDF_Texto.
225 function _textoToPdf(&$MARCO, $coord, $alto, $TEXTO) {
226 //Obtengo los parrafos y estilos del texto
227 $parrafos = $TEXTO->getParrafos();
228 $estilos = $TEXTO->getEstilo();
229 //Obtengo los limites escribibles al lado de la imagen
230 $ancho_texto = $coord['Xf'] - $coord['Xi'] - 2;
231 $alto_texto = $coord['Yf'];
232 //Obtengo el ancho total de la pagina
233 $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
235 for ($i=0; $i < $TEXTO->cantParrafos(); $i++) {
236 //Veo si hay definido un estilo para el parrafo.
237 if (@!$estilos[$i]) {
238 $estilos[$i] = $TEXTO->getEstiloDefecto();
240 //Armo un array con el parrafo en donde cada componente es una linea
241 //que cumple con el ancho maximo permitido.
242 //Veo si el texto esta al lado de la imagen o por debajo de esta.
243 if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
244 $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_pagina - 2,
248 $txt = @$MARCO->wordWrap($parrafos[$i], $ancho_texto,
253 while (count($txt)) {
254 $t = array_shift($txt);
255 $alto_texto -= $estilos[$i]['height'];
256 //Veo si el texto esta al lado de la imagen o por debajo de
258 if ($alto_texto <= $coord['Yi'] - $estilos[$i]['height']) {
259 //Veo si ya estaba escribiendo debajo de la imagen.
261 $tmp = implode(' ', $txt);
262 $txt = @$MARCO->wordWrap($tmp, $ancho_pagina - 2,
264 $t = array_shift($txt);
268 $alto -= $estilos[$i]['height'];
270 //Veo si hay que agragar una nueva pagina.
272 $this->_newPage($MARCO);
273 $alto = $MARCO->espacioDisponible;
275 //Calculo el X en donde debo comenzar a escribir segun
276 //la alineacion del texto.
277 if (@$estilos[$i]['align'] == 'center') {
278 $tam = @$MARCO->strlen($t, $estilos[$i]);
279 $init = ($ancho_pagina - $tam) / 2;
281 elseif (@$estilos[$i]['align'] == 'right') {
282 $tam = @$MARCO->strlen($t, $estilos[$i]);
283 $init = $ancho_pagina - $tam + 1;
288 $MARCO->addText($init, $alto + 2, $t, $estilos[$i],
289 null, $this->_orientacion);
292 //Estoy escribiendo al lado de la imagen.
293 //Calculo el X en donde debo comenzar a escribir segun
294 //la alineacion del texto.
295 if (@$estilos[$i]['align'] == 'center') {
296 $tam = @$MARCO->strlen($t, $estilos[$i]);
297 $init = ($ancho_texto - $tam) / 2;
299 elseif (@$estilos[$i]['align'] == 'right') {
300 $tam = @$MARCO->strlen($t, $estilos[$i]);
301 $init = $ancho_texto - $tam + 3;
307 $init += $coord['Xi'];
309 $MARCO->addText($init, $alto_texto + 2, $t, $estilos[$i],
310 null, $this->_orientacion);
315 //Seteo el nuevo alto de la pagina.
316 $MARCO->espacioDisponible = $alto;
320 * Permite obtener el valor X segun la alineacion.
322 * @param &Object $MARCO MLIB_PDF_Marco.
323 * @param int width Ancho de la imagen a agregar.
328 function _X(&$MARCO, $width) {
329 $ancho_pagina = $MARCO->getWidth($MARCO->refPage(),$MARCO->getOrientation());
330 switch ($this->_align) {
335 $X = ($ancho_pagina / 2) - ($width / 2);
338 $X = $ancho_pagina - $width;
345 * Funcion que se encarga de crear las nuevas paginas.
347 * @param &Object $MARCO MLIB_PDF_Marco
352 function _newPage(&$MARCO) {
353 $tmp = ($this->_orientacion) ? $this->_orientacion :
354 $MARCO->getOrientation();
355 $MARCO->newPage($MARCO->tamanio, $tmp, $this->_encabezado);