Foros del Web » Programando para Internet » PHP »

Problema con ezPDF

Estas en el tema de Problema con ezPDF en el foro de PHP en Foros del Web. Buenos días y saludos a todos. Veréis, estoy haciendo una web que tiene que mostrar una tabla con los meses como cabecera y los días ...
  #1 (permalink)  
Antiguo 06/03/2009, 03:21
 
Fecha de Ingreso: marzo-2005
Mensajes: 197
Antigüedad: 19 años, 2 meses
Puntos: 1
Problema con ezPDF

Buenos días y saludos a todos.

Veréis, estoy haciendo una web que tiene que mostrar una tabla con los meses como cabecera y los días del mes en la primera columna (del día 1 al 31) para confeccionar la lista de precios de un grupo en función del día que se le contrate.

He conseguido que me muestre la tabla sin problemas, mediante este script

Código PHP:
<?php
  
include ("assets/php/seguridad.php");
  include (
"assets/php/conn.php");
  include (
"assets/php/classes/class.ezpdf.php");

  function 
cambiaf_a_mysql ($fecha)
  {
    
ereg ("([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})"$fecha$mifecha);
    
$lafecha $mifecha[3] . "/" $mifecha[2] . "/" $mifecha[1];
    return 
$lafecha;
  }

  function 
cambiaf_a_normal($fecha)
  {
    
ereg ("([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})"$fecha$mifecha);
    
$lafecha $mifecha[3] . "/" $mifecha[2] . "/" $mifecha[1];
    return 
$lafecha;
  }

  
$fecha1 cambiaf_a_mysql ($_GET["startdate1"]);
  
$fecha2 cambiaf_a_mysql ($_GET["startdate2"]);

  
$pdf =& new Cezpdf('a4');

  
$sel_1 "SELECT nombre FROM productos WHERE id_producto='" $_GET["id_producto"] . "'";
  
$que_1 mysql_query ($sel_aux_1$dbh) or die ('I cannot execute the query because: ' mysql_error () . '<br />And the query is: ' $sel_1 '<br />');
  
$arr_1 mysql_fetch_array ($que_1);

  
$pdf->selectFont('assets/php/classes/fonts/Courier.afm');
  
$datacreator = array (
    
'Title' => 'Estadillo de ' $arr_1["nombre"],
    
'Author' => 'Vicente Producciones',
    
'Subject' => 'PDF con Tablas',
    
'Creator' => '[email protected]',
    
'Producer' => 'http://www.vicenteproducciones.com'
  
);

  
$pdf->addInfo($datacreator);

  
$data = array ();

  for (
$i 0$i 31$i++)
  {
    for (
$j 0$j 13$j++)
    {
      if (
$j == 0)
        
$data[$i]['mes0'] = $i 1;
      else
      {
        
$mts mktime (0,0,0,$j,$i+1,date("Y"));
        
$act_aux_day getdate ($mts);
        
$ctrl_var $act_aux_day["weekday"];

    
$sel_2 "SELECT " $i "_" . ($j 1) . " AS campo FROM estadillo WHERE id_producto='" $_GET["id_producto"] . "'";
        
$que_2 mysql_query ($sel_2$dbh) or die ('I cannot execute the query because: ' mysql_error '<br />And the query is: ' $sel_2 '<br />');
        
$arr_2 mysql_fetch_array ($que_2);

        if (
$arr_2["campo"] == "Ocupado")
        {
          if (
$ctrl_var == "Sunday")
            
$data[$i]['mes' $j] = "<b>O</b>";
          else
            
$data[$i]['mes' $j] = "O";
        }
        else if (
$arr_2["campo"] == "Reservado")
        {
          if (
$ctrl_var == "Sunday")
            
$data[$i]['mes' $j] = "<b>R</b>";
          else
            
$data[$i]['mes' $j] = "R";
        }
        else
        {
          if (
$ctrl_var == "Sunday")
            
$data[$i]['mes' $j] = "<b>" $arr_2["campo"] . "</b>";
          else
            
$data[$i]['mes' $j] = $arr_2["campo"];
        }
      }
    }
  }

  
$titles = array(
    
'mes0' => '<b>D\M</b>',
    
'mes1' => '<b>Ene.</b>',
    
'mes2' => '<b>Feb.</b>',
    
'mes3' => '<b>Mar.</b>',
    
'mes4' => '<b>Abr.</b>',
    
'mes5' => '<b>May.</b>',
    
'mes6' => '<b>Jun.</b>',
    
'mes7' => '<b>Jul.</b>',
    
'mes8' => '<b>Ago.</b>',
    
'mes9' => '<b>Sep.</b>',
    
'mes10' => '<b>Oct.</b>',
    
'mes11' => '<b>Nov.</b>',
    
'mes12' => '<b>Dic.</b>'
  
);

  
$pdf->ezText("<b>Tarifas de " $arr_1["nombre"] . "</b>\n",16);
  
$pdf->ezTable($data,$titles,'',array('xPos'=>'center','width'=>530,'cols'=>array('num'=>array('justification'=>'center'))));
  
$pdf->ezText("\n\n\n",10);

  
$sel_3 "SELECT productos.componentes, lectura_escenario.nombre FROM productos, lectura_escenario WHERE id_producto='" $_GET["id_producto"] . "' AND productos.id_lectura_escenario = lectura_escenario.id_lectura_escenario";
  
$que_3 mysql_query ($sel_3$dbh) or die ('I cannot execute the query because: ' mysql_error () . '<br />And the query is: ' $sel_3 '<br />');
  
$arr_3 mysql_fetch_array ($que_3);

  
$pdf->ezText("<b>Componentes:</b> " $arr_3["componentes"], 10);
  
$pdf->ezText("<b>Escenario:</b> " $arr_3["nombre"] . "\n\n"10);
  
$pdf->ezText("\n",10);

  
$pdf->ezText("<b>O:</b> Ocupado"10);
  
$pdf->ezText("<b>R:</b> Reservado\n\n"10);

  
$pdf->ezStream();
El problema lo tengo en estas líneas específicas, ya que con fpdf se como dibujar una determinada línea en un color que le de, pero lo que busco es sustituir las negritas en los domingos por texto en color rojo.
En otras palabras, lo que busco es sustituir estas líneas:

Código PHP:
  $mts mktime (0,0,0,$j,$i+1,date("Y"));
  
$act_aux_day getdate ($mts);
  
$ctrl_var $act_aux_day["weekday"];

  
$sel_2 "SELECT " $i "_" . ($j 1) . " AS campo FROM estadillo WHERE id_producto='" $_GET["id_producto"] . "'";
  
$que_2 mysql_query ($sel_2$dbh) or die ('I cannot execute the query because: ' mysql_error '<br />And the query is: ' $sel_2 '<br />');
  
$arr_2 mysql_fetch_array ($que_2);

  if (
$arr_2["campo"] == "Ocupado")
  {
    if (
$ctrl_var == "Sunday")
      
//Quiero cambiar esta negrita por color rojo
      
$data[$i]['mes' $j] = "<b>O</b>";
    else
      
$data[$i]['mes' $j] = "O";
   }
   else if (
$arr_2["campo"] == "Reservado")
   {
    if (
$ctrl_var == "Sunday")
      
//Quiero cambiar esta negrita por color rojo
      
$data[$i]['mes' $j] = "<b>R</b>";
    else
      
$data[$i]['mes' $j] = "R";
   }
   else
   {
    if (
$ctrl_var == "Sunday")
      
//Quiero cambiar esta negrita por color rojo
      
$data[$i]['mes' $j] = "<b>" $arr_2["campo"] . "</b>";
    else
      
$data[$i]['mes' $j] = $arr_2["campo"];
  } 
El problema que encuentro es que ezPDF no soporta código html (sólo los tags <b>, <i> y <u>) y que para hacer la tabla vuelca el array $data (que es el que contiene los datos) directamente en la función que crea la tabla, de esta forma...

Código PHP:
$pdf->ezTable($data,$titles,'',array('xPos'=>'center','width'=>530,'cols'=>array('num'=>array('justification'=>'center')))); 
Por lo que sigo sin saber cómo podría darle color específicamente a esas celdas...

¿Alguien sabría echarme una mano?


Muchas gracias a todos y un saludo.
  #2 (permalink)  
Antiguo 07/03/2009, 09:52
 
Fecha de Ingreso: marzo-2005
Mensajes: 197
Antigüedad: 19 años, 2 meses
Puntos: 1
Respuesta: Problema con ezPDF

He encontrado una función de la clase que podría servirme.

En el archivo class.ezpdf.php de R&OS he encontrado la siguiente función:

Código PHP:
function ezProcessText($text){
  
// this function will intially be used to implement underlining support, but could be used for a range of other
  // purposes
  
$search = array('<u>','<U>','</u>','</U>');
  
$replace = array('<c:uline>','<c:uline>','</c:uline>','</c:uline>');
  return 
str_replace($search,$replace,$text);

La idea sería cambiar el tag <c:uline> por otro que me sirviese para fijar el tipo de texto en rojo, pero lo cierto es que no encuentro nada de documentacion sobre el tag <c>...

¿Alguien sabría decirme algo o darme algo de documentación?

Muchas gracias y un saludo a todos.
  #3 (permalink)  
Antiguo 07/03/2009, 10:59
 
Fecha de Ingreso: marzo-2005
Mensajes: 197
Antigüedad: 19 años, 2 meses
Puntos: 1
Respuesta: Problema con ezPDF

Solucionado una vez más.

Veréis, me extrañaba sobremanera el tag <c> (del que no había escuchado nada en la vida y del que desconfiaba por aquello de que Google no sabía decirme nada sobre él)

Husmeando por el código de class.ezpdf.php encontré que se hacía alusión a él como callback function, así que busqué una función que se llamase uline (al fin y al cabo la función que yo buscaba se referenciaba así "c:uline")

Y la encontré, era una función tal que así:

Código PHP:
function uline($info){
  
// a callback function to support underlining
  
$lineFactor=0.05// the thickness of the line as a proportion of the height. also the drop of the line.
  
switch($info['status']){
    case 
'start':
    case 
'sol':
    
      
// the beginning of the underline zone
      
if (!isset($this->ez['links'])){
        
$this->ez['links']=array();
      }
      
$i $info['nCallback'];
      
$this->ez['links'][$i] = array('x'=>$info['x'],'y'=>$info['y'],'angle'=>$info['angle'],'decender'=>$info['decender'],'height'=>$info['height']);
      
$this->saveState();
      
$thick $info['height']*$lineFactor;
      
$this->setLineStyle($thick);
      break;
    case 
'end':
    case 
'eol':
      
// the end of the link
      // assume that it is the most recent opening which has closed
      
$i $info['nCallback'];
      
$start $this->ez['links'][$i];
      
// add underlining
      
$a deg2rad((float)$start['angle']-90.0);
      
$drop $start['height']*$lineFactor*1.5;
      
$dropx cos($a)*$drop;
      
$dropy = -sin($a)*$drop;
      
$this->line($start['x']-$dropx,$start['y']-$dropy,$info['x']-$dropx,$info['y']-$dropy);
      
$this->restoreState();
      break;
  }

Fué facil percatarse de que tanto los casos start como end del bucle switch eran las acciones que la función tomaba en caso de abrir o cerrar el tag <u>, y como yo lo que quería era poner el texto rojo, simplemente se lo indiqué con la función de la clase setColor. Al final la dejé así:

Código PHP:
function uline($info){
  
// a callback function to support underlining
  
$lineFactor=0.05// the thickness of the line as a proportion of the height. also the drop of the line.
  
switch($info['status']){
    case 
'start':
                
//Indico que de comenzar el tag, lo escriba todo en rojo
        
$this->setColor(255,0,0);
        break;
    case 
'sol':
    
      
// the beginning of the underline zone
      
if (!isset($this->ez['links'])){
        
$this->ez['links']=array();
      }
      
$i $info['nCallback'];
      
$this->ez['links'][$i] = array('x'=>$info['x'],'y'=>$info['y'],'angle'=>$info['angle'],'decender'=>$info['decender'],'height'=>$info['height']);
      
$this->saveState();
      
$thick $info['height']*$lineFactor;
      
$this->setLineStyle($thick);
      break;
    case 
'end':
                
//Al cerrar el tag, le indico que pinte el resto del documento negro
        
$this->setColor(0,0,0);
        break;
    case 
'eol':
      
// the end of the link
      // assume that it is the most recent opening which has closed
      
$i $info['nCallback'];
      
$start $this->ez['links'][$i];
      
// add underlining
      
$a deg2rad((float)$start['angle']-90.0);
      
$drop $start['height']*$lineFactor*1.5;
      
$dropx cos($a)*$drop;
      
$dropy = -sin($a)*$drop;
      
$this->line($start['x']-$dropx,$start['y']-$dropy,$info['x']-$dropx,$info['y']-$dropy);
      
$this->restoreState();
      break;
  }

Así podréis conseguir pintar solo ciertas celdas de una tabla generada con ezpdf en el color que queráis, siempre y cuando defináis un tag que no vayáis a usar (en mi caso la letra subrayada)

¡Un saludo a todos!
  #4 (permalink)  
Antiguo 21/03/2009, 11:07
 
Fecha de Ingreso: marzo-2009
Mensajes: 3
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Problema con ezPDF

Gracias camarada, de verdad me has salvado la vida, es justo lo que buscaba.

Saludos
  #5 (permalink)  
Antiguo 01/04/2009, 03:47
 
Fecha de Ingreso: abril-2009
Mensajes: 1
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Problema con ezPDF

Muchisimas gracias, justo lo que necesitaba!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:31.