]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MECON/PDF.php
Me equivo que en la anterior, ahora esta ok
[mecon/meconlib.git] / lib / MECON / PDF.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     meconlib
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
7
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)
11 any later version.
12
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.
16  
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: Fri Oct 24 16:12:31 2003
22 Autor:  Gonzalo Merayo <gmeray@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'MECON/PDF/external/phppdflib.class.php';
28
29 /**
30  * Liberia base para el manejo de pdf's.  
31  */
32 class MECON_PDF {
33
34     /**
35      * Configuracion
36      * @var arary $config
37      * @access protected
38      */
39      var $_config = array ();
40     
41     /**
42      * Libreria externa.
43      * @var    int $pdf
44      * @access private
45      */
46     var $_pdf;
47
48     /**
49      * Identificacion de la pagina actual
50      * @var    int $pagina_actual
51      * @access private
52      */
53     var $_pagina_actual;
54
55     /**
56      * Array de paginas.
57      * @var array $paginas
58      * @access private
59      */
60     var $_paginas;
61
62     /**
63      * Class constructor.
64      *
65      * @param string $tam Tipo de hoja
66      *
67      * @return void
68      * @access public
69      */
70     function MECON_PDF($tam = "a4")
71     {
72         $this->_pdf = new pdffile;
73         $this->_config = include 'MECON/PDF/medidas.php';
74         $this->_config = $this->_config[$tam];
75     }
76
77     /**
78      * Permite agregar nuevas paginas al pdf que se esta armando.
79      *
80      * @param  string $pagina Tipo de pagina que se va a utilizar.
81      *
82      * @return void
83      * @access public
84      */
85     function newPage($pagina = "a4")
86     {
87         $this->_pagina_actual = $this->_pdf->new_page($pagina);
88         $this->_paginas[] = $this->_pagina_actual;
89     }
90
91     /**
92      * Funcion que genera el archivo y prepara los headers para que se envie.
93      *    
94      * @return void
95      * @access public
96      */
97     function display() 
98     {
99         header("Content-Disposition: filename=Doc.pdf");
100         header("Content-Type: application/pdf");
101         $temp = $this->toPDF();
102         header('Content-Length: ' . strlen($temp));
103         echo $temp;
104     }
105
106     /**
107      * Funcion que devuelve el PDF.
108      *
109      * @return string
110      * @access public
111      */
112     function toPDF() {
113         return $this->_pdf->generate();
114     }
115
116     /**
117      * Funcion que permite agregar texto a una pagina.
118      *
119      * @param int $X $X
120      * @param int $Y $Y
121      * @param string $texto $texto
122      * @param int $estilo $estilo
123      * @param int $pag Numero de pagina virtual.
124      * @param string $transformacion Indica la orientacion de la pagina.
125      *
126      * @return void
127      * @access public
128      */
129     function addText($X, $Y, $texto, $estilo = '', $pag = null, $transformacion = '')    {
130         //@TODO Ver si $texto es un objeto
131         
132         $x = $X;
133         $y = $Y;
134         switch (strtolower($transformacion)) {
135             case 'portrait':
136                 $X = $this->_portraitX($x,$y);
137                 $Y = $this->_portraitY($x,$y);
138                 break;
139             case 'landscape':
140                 $X = $this->_landscapeX($x,$y);
141                 $Y = $this->_landscapeY($x,$y);
142                 @$estilo['rotation'] += 90;
143                 break;
144         }
145         $this->_pdf->draw_text($X, $Y, $texto, $this->refPage($pag), $estilo);
146     }
147
148     /**
149      * Funcion que permite agregar un rectangulo a una pagina.
150      *
151      * @param int $Xi $Xi
152      * @param int $Yi $Yi
153      * @param int $Xf $Xf
154      * @param int $Yf $Yf
155      * @param long $estilo $estilo
156      * @param int $pag Numero de pagina virtual.
157      * @param string $transformacion Indica la orientacion de la pagina.
158      *
159      * @return void
160      * @access public
161      */
162     function addRectangle($Xi, $Yi, $Xf, $Yf, $estilo = '', $pag = null,
163             $transformacion = 'portrait') 
164     {
165         $xi = $Xi;
166         $yi = $Yi;
167         $xf = $Xf;
168         $yf = $Yf;
169         switch (strtolower($transformacion)) {
170             case 'portrait':
171                 $Xi = $this->_portraitX($xi,$yi);
172                 $Yi = $this->_portraitY($xi,$yi);
173                 $Xf = $this->_portraitX($xf,$yf);
174                 $Yf = $this->_portraitY($xf,$yf);
175                 break;
176             case 'landscape':
177                 $Xi = $this->_landscapeX($xi,$yi);
178                 $Yi = $this->_landscapeY($xi,$yi);
179                 $Xf = $this->_landscapeX($xf,$yf);
180                 $Yf = $this->_landscapeY($xf,$yf);
181                 break;
182         }
183         $this->_pdf->draw_rectangle($Yi, $Xi, $Yf, $Xf, $this->refPage($pag), $estilo);
184     }
185
186     /**
187      * Funcion que permite agregar una linea a una pagina.
188      *
189      * @param int $Xi $Xi
190      * @param int $Yi $Yi
191      * @param int $Xf $Xf
192      * @param int $Yf $Yf
193      * @param int $estilo $estilo
194      * @param int $pag Numero de pagina virtual.
195      * @param string $transformacion Indica la orientacion de la pagina.
196      *
197      * @return void
198      * @access public
199      */
200     function addLine($Xi, $Yi, $Xf, $Yf, $estilo = '', $pag = null,
201             $transformacion = 'portrait')
202     {
203         $xi = $Xi;
204         $yi = $Yi;
205         $xf = $Xf;
206         $yf = $Yf;
207         switch (strtolower($transformacion)) {
208             case 'portrait':
209                 $Xi = $this->_portraitX($xi,$yi);
210                 $Yi = $this->_portraitY($xi,$yi);
211                 $Xf = $this->_portraitX($xf,$yf);
212                 $Yf = $this->_portraitY($xf,$yf);
213                 break;
214             case 'landscape':
215                 $Xi = $this->_landscapeX($xi,$yi);
216                 $Yi = $this->_landscapeY($xi,$yi);
217                 $Xf = $this->_landscapeX($xf,$yf);
218                 $Yf = $this->_landscapeY($xf,$yf);
219                 break;
220         }
221        $this->_pdf->draw_line(array($Xi,$Xf),array($Yi,$Yf), 
222                 $this->refPage($pag),$estilo);
223     }
224
225     /**
226      * Funcion que permite agregar una imagen JPG a una pagina.
227      *
228      * @param string $archivo Path completo del archivo imagen.
229      * @param int    $X Posicion Horizontal.
230      * @param int    $Y Posixion vertical.
231      * @param int    $pag Numero de pagina virtual.
232      * @param string $formato Formato del archivo (Extension).
233      * @param string $transformacion Indica la orientacion de la pagina.
234      *
235      * @return void
236      * @access public
237      */
238     function addImage($archivo, $X, $Y, $pag = null, $formato = null,
239             $transformacion = 'portrait') {
240         $x = $X;
241         $y = $Y;
242         switch (strtolower($transformacion)) {
243             case 'portrait':
244                 $X = $this->_portraitX($x,$y);
245                 $Y = $this->_portraitY($x,$y);
246                 break;
247             case 'landscape':
248                 $X = $this->_landscapeX($x,$y);
249                 $Y = $this->_landscapeY($x,$y);
250                 break;
251         }
252         $formato = strtolower($formato);
253         switch ($formato) {
254             case 'jpg':
255                 $fh = fopen($archivo, "r"); 
256                 $filedata = fread($fh, filesize($archivo));
257                 fclose($fh);
258                 $image = $this->_pdf->jfif_embed($filedata);
259                 $this->_pdf->image_place($image, $Y, $X, 
260                         $this->refPage($pag));
261                 break;
262         }
263     }
264
265     /**
266      * Funcion que wrappea una linea.                                         
267      *
268      * @param strgin $texto Texto que quiere wrappearse.
269      * @param int    $l_max Largo maximo del texto.
270      * @param array  $attr  Atributos del texto.
271      *
272      * @return string
273      * @access public
274      */
275     function wrapLine($texto, $l_max, $attr) {
276         return $this->_pdf->wrap_line ($texto, $l_max, $attr);
277     }
278
279     /**
280      * Funcion que wrappea una linea.                                       
281      *
282      * @param strgin $texto Texto que quiere wrappearse.
283      * @param int    $l_max Largo maximo del texto.
284      * @param array  $attr  Atributos del texto.
285      *
286      * @return string
287      * @access public
288      */
289     function wordWrap($texto, $l_max, $attr) {
290         return $this->_pdf->word_wrap ($texto, $l_max, $attr);
291     }
292     
293     /**
294      * Funcion que calcula cuanto va a ocupar cierto texto segun su formato en
295      * una pagina.
296      *
297      * @param strgin $texto Texto que quiere medirse.
298      * @param array  $attr  Atributos del texto.
299      *
300      * @return int
301      * @access public
302      */
303     function strlen($texto, $attr = '') {
304         return $this->_pdf->strlen($texto, $attr);
305     }
306
307     /**
308      * Funcion que devuelve la cantidad de paginas que contiene el documento.
309      *
310      * @return int
311      * @access public
312      */
313     function countPages() {
314         return count($this->_paginas);
315     }
316     
317     /**
318      * Funcion que devuelve el numero de la pagina actual.                   
319      *
320      * @param mixed $id Identificador de la pagina.
321      *
322      * @return int
323      * @access public
324      */
325     function numPage($id = null) {
326         $id = ($id) ? $id : $this->_pagina_actual;
327         return (array_search($id, $this->_paginas)) + 1;
328     }
329
330     /**
331      * Funcion que devuelve la referencia de una pagina vitual. Si no se pasa
332      * nada utilizo la actual.
333      *
334      * @param int $pag Numero de pagina.
335      *
336      * @return int
337      * @access public
338      */
339     function refPage($pag = null) {
340         return $pag ? $this->_paginas[$pag - 1] :
341             $this->_pagina_actual;
342     }
343
344     /**
345      * Funcion que devuelve el array de paginas
346      *
347      * @return array
348      * @access public
349      */
350     function getPages() {
351         return $this->_paginas;
352     }
353
354     /**
355      * Funcion que devuelve el ancho de la pagina.
356      *
357      * @param  string $orientacion Orientacion de la pagina.
358      *
359      * @return int
360      * @access public
361      */
362     function getWidth($orientacion = 'portrait')
363     {
364          switch (strtolower($orientacion)) {
365             case 'landscape':
366                 $width = $this->_config['Yf'] - $this->_config['Yi'];
367                 break;
368             default:
369                 $width = $this->_config['Xf'] - $this->_config['Xi'];
370         }
371         return $width;
372
373     }
374
375     /**
376      * Funcion que devuelve el alto de la pagina.
377      *
378      * @param  string $orientacion Orientacion de la pagina.
379      *
380      * @return int
381      * @access public
382      */
383     function getHeight($orientacion = 'portrait')
384     {
385          switch (strtolower($orientacion)) {
386             case 'landscape':
387                 $height = $this->_config['Xf'] - $this->_config['Xi'];
388                 break;
389             default:
390                 $height = $this->_config['Yf'] - $this->_config['Yi'];
391         }
392         return $height;
393     }
394
395     /**
396      * Funcion que devuelve la rotacion y traslacion para landscape. Variable X.
397      *
398      * @param int $x X
399      * @param int $y Y
400      *
401      * @return int
402      * @access protected
403      */
404     function _landscapeX($x, $y)
405     {
406         return -$y + $this->_config['Xf'];
407     }
408
409     /**
410      * Funcion que devuelve la rotacion y traslacion para landscape. Variable Y.
411      *
412      * @param int $x X
413      * @param int $y Y
414      *
415      * @return int
416      * @access protected
417      */
418     function _landscapeY($x, $y)
419     {
420         return $x + $this->_config['Yi'];
421     }
422
423     /**
424      * Funcion que devuelve la traslacion para portrait. Variable X.
425      *
426      * @param int $x X
427      * @param int $y Y
428      *
429      * @return int
430      * @access protected
431      */
432     function _portraitX($x, $y)
433     {
434         return $x + $this->_config['Xi'];
435     }
436
437     /**
438      * Funcion que devuelve la traslacion para portrait. Variable Y.
439      *
440      * @param int $x X
441      * @param int $y Y
442      *
443      * @return int
444      * @access protected
445      */
446     function _portraitY($x, $y)
447     {
448         return $y + $this->_config['Yi'];
449     }
450 }
451 ?>