Foros del Web » Programando para Internet » PHP »

como hacer un str_replace al crear un PDF

Estas en el tema de como hacer un str_replace al crear un PDF en el foro de PHP en Foros del Web. Estoy pasando datos de una base de datos al formato PDF pero tengo problemas con las tildes y necesito pasar un script para arreglar los ...
  #1 (permalink)  
Antiguo 11/09/2014, 16:00
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 19 años
Puntos: 2
como hacer un str_replace al crear un PDF

Estoy pasando datos de una base de datos al formato PDF pero tengo problemas con las tildes y necesito pasar un script para arreglar los acentos antes que se imprima el pdf en pantalla.

Tengo esto.

Código PHP:
Ver original
  1. $pdf=new PDF();
  2. $pdf->AddPage();
  3. //Second table: specify 3 columns
  4. $pdf->AddCol('usuario',100,'Firmante','L');
  5. $pdf->AddCol('ip',40,'IP','R');
  6. $pdf->AddCol('fecha',20,'Fecha','R');
  7. $prop=array('HeaderColor'=>array(255,150,100),
  8.             'color1'=>array(210,245,255),
  9.             'color2'=>array(255,255,210),
  10.             'padding'=>2);
  11. $pdf->Table("SELECT usuario, ip, fecha FROM firmas WHERE idnot='$idnot' ORDER BY id DESC",$prop);
  12.  
  13. $pdf->Cell(40,10,'Consultas a [email protected]',0,1,'L');
  14. $pdf->Output();

este es el scrip que arregla los acentos.

pero no sé como insertarlo antes que imprima el pdf en pantalla, probe con la variable $pdf pero el script para crear el PDF no funciona y muestra la pantalla en blanco.

Código PHP:
Ver original
  1. $find = array('Á', 'É', 'Í', 'Ó', 'Ú', 'Ñ','ü', 'á', 'é', 'í', 'ó', 'ú', 'ñ','ü','"');
  2. $repl = array('a', 'e', 'i', 'o', 'u', 'n', 'u', 'á', 'é', 'í', 'ó', 'ú', 'ñ', 'u','');
  3.  
  4. $pdf = str_replace ($find, $repl, $pdf);
  #2 (permalink)  
Antiguo 11/09/2014, 16:31
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: como hacer un str_replace al crear un PDF

La variable $pdf no es una cadena a la que se le pueda cambiar letras, es un objeto PDF complicado y lleno de cosas.
No conozco la clase que estás usando para generar el pdf, así que no te puedo ayudar. Pero en general lo que tendrías que hacer es ejecutar la consulta sql antes, después aplicarle str_replace() al resultado de la consulta con tu codigo (que está correcto) y al final agregar esa cadena al pdf.

En todo caso: ¡OJO!, no deberías hacer tú el cambio de los caracteres acentuados, lo debería hacer la clase pdf por sí sola.
Revisa la documentación sobre juego de caracteres de la clase e intenta coordinarla con la base de datos. Por ejemplo, si tu servidor mysql está en UTF-8, que el pdf se construya con la misma codificación.
  #3 (permalink)  
Antiguo 11/09/2014, 16:52
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 19 años
Puntos: 2
Respuesta: como hacer un str_replace al crear un PDF

Estoy usando "FPDF library"

en la base de datos el campo de los acentos esta en utf8_spanish_ci
  #4 (permalink)  
Antiguo 11/09/2014, 18:02
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 19 años
Puntos: 2
Respuesta: como hacer un str_replace al crear un PDF

Despues de revisar los archivos de la classe FPDF, estoy seguro que tengo que insertar mi script para remplazar acentos en el archivo mysql_table.php mas exacto en la function Table, pero no encuentro la variable a utilizar.

Código PHP:
Ver original
  1. function Table($query,$prop=array())
  2. {
  3.     $prop = str_replace ($find, $repl, $prop);
  4.     //Issue query
  5.     $res=mysql_query($query) or die('Error: '.mysql_error()."<BR>Query: $query");
  6.     //Add all columns if none was specified
  7.     if(count($this->aCols)==0)
  8.     {
  9.         $nb=mysql_num_fields($res);
  10.         for($i=0;$i<$nb;$i++)
  11.             $this->AddCol();
  12.     }
  13.     //Retrieve column names when not specified
  14.     foreach($this->aCols as $i=>$col)
  15.     {
  16.         if($col['c']=='')
  17.         {
  18.             if(is_string($col['f']))
  19.                 $this->aCols[$i]['c']=ucfirst($col['f']);
  20.             else
  21.                 $this->aCols[$i]['c']=ucfirst(mysql_field_name($res,$col['f']));
  22.         }
  23.     }
  24.     //Handle properties
  25.     if(!isset($prop['width']))
  26.         $prop['width']=0;
  27.     if($prop['width']==0)
  28.         $prop['width']=$this->w-$this->lMargin-$this->rMargin;
  29.     if(!isset($prop['align']))
  30.         $prop['align']='C';
  31.     if(!isset($prop['padding']))
  32.         $prop['padding']=$this->cMargin;
  33.     $cMargin=$this->cMargin;
  34.     $this->cMargin=$prop['padding'];
  35.     if(!isset($prop['HeaderColor']))
  36.         $prop['HeaderColor']=array();
  37.     $this->HeaderColor=$prop['HeaderColor'];
  38.     if(!isset($prop['color1']))
  39.         $prop['color1']=array();
  40.     if(!isset($prop['color2']))
  41.         $prop['color2']=array();
  42.     $this->RowColors=array($prop['color1'],$prop['color2']);
  43.     //Compute column widths
  44.     $this->CalcWidths($prop['width'],$prop['align']);
  45.     //Print header
  46.     $this->TableHeader();
  47.     //Print rows
  48.     $this->SetFont('Arial','',11);
  49.     $this->ColorIndex=0;
  50.     $this->ProcessingTable=true;
  51.     while($row=mysql_fetch_array($res))
  52.         $this->Row($row);
  53.     $this->ProcessingTable=false;
  54.     $this->cMargin=$cMargin;
  55.     $this->aCols=array();
  56. }
  #5 (permalink)  
Antiguo 11/09/2014, 18:38
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: como hacer un str_replace al crear un PDF

Para experimentar, en la línea 51 de la función Table cambia la codificación:

Código PHP:
Ver original
  1. $this->Row(utf8_decode($row));
Si no funciona, haz el str_replace() tal cual lo tenías planteado, pero sobre la variable $row de esa línea.

Ojalá funcione.
  #6 (permalink)  
Antiguo 11/09/2014, 19:42
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 19 años
Puntos: 2
Respuesta: como hacer un str_replace al crear un PDF

Código PHP:
Ver original
  1. class PDF_MySQL_Table extends FPDF
  2. {
  3. var $ProcessingTable=false;
  4. var $aCols=array();
  5. var $TableX;
  6. var $HeaderColor;
  7. var $RowColors;
  8. var $ColorIndex;
  9.  
  10. function Header()
  11. {
  12.     //Print the table header if necessary
  13.     if($this->ProcessingTable)
  14.         $this->TableHeader();
  15. }
  16.  
  17. function TableHeader()
  18. {
  19.     $this->SetFont('Arial','B',12);
  20.     $this->SetX($this->TableX);
  21.     $fill=!empty($this->HeaderColor);
  22.     if($fill)
  23.         $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this->HeaderColor[2]);
  24.     foreach($this->aCols as $col)
  25.         $this->Cell($col['w'],6,$col['c'],1,0,'C',$fill);
  26.     $this->Ln();
  27. }
  28.  
  29. function Row($data)
  30. {
  31.     $this->SetX($this->TableX);
  32.     $ci=$this->ColorIndex;
  33.     $fill=!empty($this->RowColors[$ci]);
  34.     if($fill)
  35.         $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this->RowColors[$ci][2]);
  36.        
  37.     foreach($this->aCols as $col)
  38.        // esto agregue $data[$col['f']] = str_replace($find, $repl, $data[$col['f']]);
  39.         $this->Cell($col['w'],5,$data[$col['f']],1,0,$col['a'],$fill);
  40.     $this->Ln();
  41.     $this->ColorIndex=1-$ci;
  42. }
  43.  
  44. function CalcWidths($width,$align)
  45. {
  46.     //Compute the widths of the columns
  47.     $TableWidth=0;
  48.     foreach($this->aCols as $i=>$col)
  49.     {
  50.         $w=$col['w'];
  51.         if($w==-1)
  52.             $w=$width/count($this->aCols);
  53.         elseif(substr($w,-1)=='%')
  54.             $w=$w/100*$width;
  55.         $this->aCols[$i]['w']=$w;
  56.         $TableWidth+=$w;
  57.     }
  58.     //Compute the abscissa of the table
  59.     if($align=='C')
  60.         $this->TableX=max(($this->w-$TableWidth)/2,0);
  61.     elseif($align=='R')
  62.         $this->TableX=max($this->w-$this->rMargin-$TableWidth,0);
  63.     else
  64.         $this->TableX=$this->lMargin;
  65. }
  66.  
  67. function AddCol($field=-1,$width=-1,$caption='',$align='L')
  68. {
  69.     //Add a column to the table
  70.     if($field==-1)
  71.         $field=count($this->aCols);
  72.     $this->aCols[]=array('f'=>$field,'c'=>$caption,'w'=>$width,'a'=>$align);
  73. }
  74.  
  75. function Table($query,$prop=array())
  76. {
  77.     //Issue query
  78.     $res=mysql_query($query) or die('Error: '.mysql_error()."<BR>Query: $query");
  79.     //Add all columns if none was specified
  80.     if(count($this->aCols)==0)
  81.     {
  82.         $nb=mysql_num_fields($res);
  83.         for($i=0;$i<$nb;$i++)
  84.             $this->AddCol();
  85.     }
  86.     //Retrieve column names when not specified
  87.     foreach($this->aCols as $i=>$col)
  88.     {
  89.        
  90.         if($col['c']=='')
  91.         {
  92.             if(is_string($col['f']))
  93.            
  94.                 $this->aCols[$i]['c']=ucfirst($col['f']);
  95.             else
  96.            
  97.                 $this->aCols[$i]['c']=ucfirst(mysql_field_name($res,$col['f']));
  98.         }
  99.     }
  100.     //Handle properties
  101.     if(!isset($prop['width']))
  102.         $prop['width']=0;
  103.     if($prop['width']==0)
  104.         $prop['width']=$this->w-$this->lMargin-$this->rMargin;
  105.     if(!isset($prop['align']))
  106.         $prop['align']='C';
  107.     if(!isset($prop['padding']))
  108.         $prop['padding']=$this->cMargin;
  109.     $cMargin=$this->cMargin;
  110.     $this->cMargin=$prop['padding'];
  111.     if(!isset($prop['HeaderColor']))
  112.         $prop['HeaderColor']=array();
  113.     $this->HeaderColor=$prop['HeaderColor'];
  114.     if(!isset($prop['color1']))
  115.         $prop['color1']=array();
  116.     if(!isset($prop['color2']))
  117.         $prop['color2']=array();
  118.     $this->RowColors=array($prop['color1'],$prop['color2']);
  119.     //Compute column widths
  120.     $this->CalcWidths($prop['width'],$prop['align']);
  121.     //Print header
  122.     $this->TableHeader();
  123.     //Print rows
  124.     $this->SetFont('Arial','',11);
  125.     $this->ColorIndex=0;
  126.     $this->ProcessingTable=true;
  127.     while($row=mysql_fetch_array($res))
  128.     $this->Row($row);
  129.     $this->ProcessingTable=false;
  130.     $this->cMargin=$cMargin;
  131.     $this->aCols=array();
  132. }
  133. }

Probe lo de la codificación al row que me aconsejaste pero no funciono.

Este es el archivo mysql_table.php completo, en la function Row($data) se encuentra los datos en el array $data[$col['f']] pero a ponerle el srt_replace desaparecen las primeras dos columnas solo muestra la ultima.
  #7 (permalink)  
Antiguo 11/09/2014, 19:58
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: como hacer un str_replace al crear un PDF

¿pusiste los valores de $find y $repl?
Código PHP:
Ver original
  1. function Row($data)
  2. {
  3.     $find = array('&Aacute;', '&Eacute;', '&Iacute;', '&Oacute;', '&Uacute;', '&Ntilde;','&uuml;', '&aacute;', '&eacute;', '&iacute;', '&oacute;', '&uacute;', '&ntilde;','&uuml;','&quot;');
  4.     $repl = array('a', 'e', 'i', 'o', 'u', 'n', 'u', 'á', 'é', 'í', 'ó', 'ú', 'ñ', 'u','');
  5.  
  6.     $this->SetX($this->TableX);
  7.     $ci=$this->ColorIndex;
  8.     $fill=!empty($this->RowColors[$ci]);
  9.     if($fill)
  10.         $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this->RowColors[$ci][2]);
  11.  
  12.     foreach($this->aCols as $col)
  13.         $txt = str_replace($find, $repl, $data[$col['f']]);
  14.         $this->Cell($col['w'],5,$txt,1,0,$col['a'],$fill);
  15.     $this->Ln();
  16.     $this->ColorIndex=1-$ci;
  17. }
  #8 (permalink)  
Antiguo 11/09/2014, 20:18
 
Fecha de Ingreso: noviembre-2005
Mensajes: 144
Antigüedad: 19 años
Puntos: 2
Respuesta: como hacer un str_replace al crear un PDF

Si me olvide colocar los rangos a remplazar dentro de la function :P bueno ahora funciona parcialmente. paso de &aacute; a á, etc

  #9 (permalink)  
Antiguo 12/09/2014, 05:37
 
Fecha de Ingreso: abril-2011
Ubicación: Vilcún, cerca de Temuco
Mensajes: 67
Antigüedad: 13 años, 7 meses
Puntos: 5
Respuesta: como hacer un str_replace al crear un PDF

¿y si ahora intentas con utf8_decode()?

foreach($this->aCols as $col){
$txt = str_replace($find, $repl, $data[$col['f']]);
$txt = utf8_decode($txt);
$this->Cell($col['w'],5,$txt,1,0,$col['a'],$fill);
}

Etiquetas: fecha, pdf, select, variable
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 12:56.