Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO reporte pdf delimitar tamaño campo

Estas en el tema de reporte pdf delimitar tamaño campo en el foro de PHP en Foros del Web. Amigos necesito su ayuda por favor. Les comento, tengo un módulo que me genera un reporte en pdf, yo lo armo con "fpdf", hasta ahi ...
  #1 (permalink)  
Antiguo 04/05/2016, 07:57
 
Fecha de Ingreso: abril-2016
Mensajes: 65
Antigüedad: 8 años
Puntos: 4
reporte pdf delimitar tamaño campo

Amigos necesito su ayuda por favor.
Les comento, tengo un módulo que me genera un reporte en pdf, yo lo armo con "fpdf", hasta ahi ni un problema, lo que pasa es que tengo un campo (zona) que es tiene algunos datos muy extendos y se sobreponen a los de la siguiente columna.

Si es de utilidad les dejo el codigo del reporte con fpdf usando informix.


Código PHP:
Ver original
  1. <?php
  2. require('fpdf.php');
  3.  
  4. class PDF extends  FPDF
  5. {
  6.     public $sucursal;
  7.     public $_ini;
  8.     public $f_fin;
  9.  
  10.     //Cabecera de página
  11.     function Header()
  12.     {
  13.         $this->Rect(1, 1, 213, 31);
  14.         $this->Rect(1, 31, 213, 1, 'DF');
  15.         //Logo
  16.         $this->Image('../loguin_files/logo.png', 13, 2, 25, 27);
  17.         //Arial bold 15
  18.         $this->SetFont('Arial', 'B', 14);
  19.         //Movernos a la derecha
  20.         $this->Cell(30);
  21.         //Título
  22.         $this->Cell(170, 4, 'BANCO CENTRAL DE BOLIVIA', 0, 0, 'C');
  23.         $this->Ln(2);
  24.         $this->SetFont('Arial', 'B', 10);
  25.         $this->Cell(36);
  26.         $this->MultiCell(170, 5, 'Reporte de: ');
  27.         //$this->SetFont('Arial','',6);
  28.  
  29.         $this->SetFont('Arial', '', 7);
  30.         $this->Line(1, 32, 214, 32);
  31.  
  32.         $this->Text(12, 36, 'No.');
  33.         $this->Text(22, 36, 'Codigo');
  34.         $this->Text(40, 36, 'Telefono');
  35.         $this->Text(80, 36, 'Zona');
  36.         $this->Text(120, 36, 'Nombre');
  37.         $this->Line(1, 38, 214, 38);
  38.         $this->Line(1, 39, 214, 39);
  39.         //Salto de línea
  40.         $this->Ln(10);
  41.         $this->SetY(45);
  42.     }
  43.  
  44.     //Pie de página
  45.     function Footer()
  46.     {
  47.         //Posición: a 1,5 cm del final
  48.         $this->SetY(-15);
  49.         //Arial italic 8
  50.         $this->SetFont('Arial','I',7);
  51.         //Número de página
  52.         $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
  53.         $fecha= date("Y-m-d");
  54.         $hora=date("H:i:s");
  55.         $this->Line(1,266,214,266);
  56.         $this->Line(1,273,214,273);
  57.         $fecha= date("Y-m-d");
  58.         $hora=date("H:i:s");
  59.         $this->Text(10,270.5,$fecha);
  60.         $this->Text(30,270.5,$hora);
  61.         $this->Text(148,270.5,$this->f_ini);
  62.         $this->Text(180,270.5,$this->f_fin);
  63.     }
  64.     function __construct()
  65.     {
  66.         //Llama al constructor de su clase Padre.
  67.         //Modificar aka segun la forma del papel del reporte
  68.         parent::__construct('P','mm','Letter');
  69.     }
  70. }
  71. //Creación del objeto de la clase heredada
  72. $pdf=new PDF();
  73. $pdf->SetTopMargin(5.4);
  74. $pdf->SetLeftMargin(4.5);
  75. $pdf->AliasNbPages();
  76. $pdf->SetFont('Times','',7);
  77.  
  78. $conexion= new PDO("informix:host=10.0.0.0; service=9030;database=basededatos; server=servidor; protocol=onsoctcp;EnableScrollableCursors=1;CLIENT_LOCALE=en_US.CP1252;DB_LOCALE=en_US.819", "usu", "pass");
  79.  
  80. //$cadbusca = $conexion->prepare("select *  from tabla where .......");
  81. //$cadbusca->execute();
  82.  
  83. $cadbusca = ("select *  from tabla where .......");
  84.  
  85. $result = $conexion->query($cadbusca);
  86.  
  87.  
  88. $j=1;
  89. $pdf->AddPage();
  90. $row = $result->fetchAll();
  91.  
  92. //for($i=0; $row = $result->fetchObject(); $i++){
  93. foreach($row AS $result ){
  94.    // while($row = $result->fetchAll()){
  95.     $name = $result[1];
  96.     $apellidos = $result[6];
  97.     $gerencia = $result[4];
  98.     $cargo = $result[2];
  99.  
  100.     $pdf->Text(12,$pdf->GetY(),($j));
  101.     $pdf->Text(22,$pdf->GetY(),$name);
  102.     $pdf->Text(40,$pdf->GetY(),$apellidos);
  103.     $pdf->Text(80,$pdf->GetY(),$gerencia);
  104.     $pdf->Text(120,$pdf->GetY(),$cargo);
  105.     $pdf->cell(0,5.5,'',0,1);
  106.     $j=$j+1;
  107. }
  108. unset($pdo);
  109. unset($query);
  110. $pdf->cell(0,8,'',0,1);
  111. $pdf->Text(30,$pdf->GetY(),'Nombre');
  112. $pdf->Text(115,$pdf->GetY(),'Fecha');
  113. $pdf->Text(160,$pdf->GetY(),'Firma');
  114. $pdf->cell(0,5,'',0,1);
  115. $pdf->Text(15,$pdf->GetY(),'_________________________________________');
  116. $pdf->Text(100,$pdf->GetY(),'________________________');
  117. $pdf->Text(145,$pdf->GetY(),'________________________');
  118. $pdf->Output();
  119. ?>
  #2 (permalink)  
Antiguo 04/05/2016, 11:58
Avatar de kip13  
Fecha de Ingreso: agosto-2011
Mensajes: 167
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: reporte pdf delimitar tamaño campo

Podrías mostrar una imagen de como los sobrepasa?

Te dejo por si no lo has leido la doc de fpdf.

http://www.fpdf.org/en/doc/

Saludos
  #3 (permalink)  
Antiguo 04/05/2016, 13:44
 
Fecha de Ingreso: abril-2016
Mensajes: 65
Antigüedad: 8 años
Puntos: 4
Respuesta: reporte pdf delimitar tamaño campo

Ahorita no tengo como mostrarte una imagen de que es lo que pasa, asi que intentare explcarte por aca...
Digamos que mi reporte me saca de una tabla X 4 columnas, todo esta alineado bien, pero digamos que hay un nombre muy largo se se pasa hasta fecha y fecha esta sobre escrito en su lugar
No.-----Cod-----Nombre-----Fecha
1 ----- a1 ----- luis ----- 01/01/01
2 ----- a2------luislusisjsij(sisjijsislis)lislilsilisl
------------------------02/01/01 --> esta fecha me aparece arriba sobreescrita jussto donde estan las letras rojas
  #4 (permalink)  
Antiguo 04/05/2016, 14:09
Avatar de kip13  
Fecha de Ingreso: agosto-2011
Mensajes: 167
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: reporte pdf delimitar tamaño campo

Entiendo, se pueden utilizar scripts que estan en la pagina de fpdf, la que postee alla arriba, para resolverlo.

Aqui te dejo un codigo para que lo implementes:

Código PHP:
Ver original
  1. <?php
  2. require('fpdf.php');
  3.  
  4. class FPDF_CellFit extends FPDF {
  5.  
  6.     //Cell with horizontal scaling if text is too wide
  7.     function CellFit($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $scale=false, $force=true)
  8.     {
  9.         //Get string width
  10.         $str_width=$this->GetStringWidth($txt);
  11.  
  12.         //Calculate ratio to fit cell
  13.         if($w==0)
  14.             $w = $this->w-$this->rMargin-$this->x;
  15.         $ratio = ($w-$this->cMargin*2)/$str_width;
  16.  
  17.         $fit = ($ratio < 1 || ($ratio > 1 && $force));
  18.         if ($fit)
  19.         {
  20.             if ($scale)
  21.             {
  22.                 //Calculate horizontal scaling
  23.                 $horiz_scale=$ratio*100.0;
  24.                 //Set horizontal scaling
  25.                 $this->_out(sprintf('BT %.2F Tz ET',$horiz_scale));
  26.             }
  27.             else
  28.             {
  29.                 //Calculate character spacing in points
  30.                 $char_space=($w-$this->cMargin*2-$str_width)/max($this->MBGetStringLength($txt)-1,1)*$this->k;
  31.                 //Set character spacing
  32.                 $this->_out(sprintf('BT %.2F Tc ET',$char_space));
  33.             }
  34.             //Override user alignment (since text will fill up cell)
  35.             $align='';
  36.         }
  37.  
  38.         //Pass on to Cell method
  39.         $this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link);
  40.  
  41.         //Reset character spacing/horizontal scaling
  42.         if ($fit)
  43.             $this->_out('BT '.($scale ? '100 Tz' : '0 Tc').' ET');
  44.     }
  45.  
  46.     //Cell with horizontal scaling only if necessary
  47.     function CellFitScale($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
  48.     {
  49.         $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,true,false);
  50.     }
  51.  
  52.     //Cell with horizontal scaling always
  53.     function CellFitScaleForce($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
  54.     {
  55.         $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,true,true);
  56.     }
  57.  
  58.     //Cell with character spacing only if necessary
  59.     function CellFitSpace($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
  60.     {
  61.         $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,false,false);
  62.     }
  63.  
  64.     //Cell with character spacing always
  65.     function CellFitSpaceForce($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='')
  66.     {
  67.         //Same as calling CellFit directly
  68.         $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,false,true);
  69.     }
  70.  
  71.     //Patch to also work with CJK double-byte text
  72.     function MBGetStringLength($s)
  73.     {
  74.         if($this->CurrentFont['type']=='Type0')
  75.         {
  76.             $len = 0;
  77.             $nbbytes = strlen($s);
  78.             for ($i = 0; $i < $nbbytes; $i++)
  79.             {
  80.                 if (ord($s[$i])<128)
  81.                     $len++;
  82.                 else
  83.                 {
  84.                     $len++;
  85.                     $i++;
  86.                 }
  87.             }
  88.             return $len;
  89.         }
  90.         else
  91.             return strlen($s);
  92.     }
  93.  
  94. }
  95. ?>

En total hay cuatro metodos en el codigo que coloque arriba:

CellFitScale()
CellFitScaleForce()
CellFitSpace()
CellFitSpaceForce()


Creo que el mas adecuado seria el CellFitSpace(), para resolver tu problema.

Ejemplo de uso:

Código PHP:
Ver original
  1. <?php
  2. require('cellfit.php');
  3.  
  4. $txt_short = 'This text is short enough.';
  5. $txt_long = 'This text is way too long.';
  6.  
  7. $pdf->CellFitSpace(0,10,$txt_short,1,1);
  8. $pdf->CellFitSpace(0,10,$txt_long,1,1,'',1);
  9.  
  10. $pdf->Output();
  11. ?>

Espero te sirva.

Saludos

Fuente: Script Fit text to cell
  #5 (permalink)  
Antiguo 04/05/2016, 14:11
 
Fecha de Ingreso: abril-2016
Mensajes: 65
Antigüedad: 8 años
Puntos: 4
Respuesta: reporte pdf delimitar tamaño campo

Tienes toda la razón no leí bien el manual o se me pasó de largo, muchas gracias por la ayuda.
  #6 (permalink)  
Antiguo 04/05/2016, 16:36
 
Fecha de Ingreso: abril-2016
Mensajes: 65
Antigüedad: 8 años
Puntos: 4
Respuesta: reporte pdf delimitar tamaño campo

Amigo necesito tu ayuda ya logre hacer el objetivo principal pero con un error.
Tomando el ejemplo anterior
No.-----Cod-----Nombre-----Fecha
1 ----- a1 ----- ------ ----- 01/01/01
luis
2 ----- a2-----------------02/02/02
luislusisjsijisjijsislisislilsilisl --> me sale ahi abajo, no encuentro en las propiedades donde decir que quiero que comienze, como en
Text
$this->Text(22, 36, 'Codigo');
porfa si pudieras ayudarme en eso
  #7 (permalink)  
Antiguo 04/05/2016, 17:51
Avatar de kip13  
Fecha de Ingreso: agosto-2011
Mensajes: 167
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: reporte pdf delimitar tamaño campo

¿Podrias colocar el código de como estas haciendolo?

Mira para resolver lo que ahora necesitas debes aplicar SetXY().

Cita:
SetXY

SetXY(float x, float y)

Description
Defines the abscissa and ordinate of the current position. If the passed values are negative, they are relative respectively to the right and bottom of the page.

Parameters

x
The value of the abscissa.

y
The value of the ordinate.
Tambien recuerda que los parametros para CellfitSpace() son estos, siguiendo la sintaxis:

Código PHP:
Ver original
  1. CellFit(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link [, boolean scale [, boolean force]]]]]]]]])

Ejemplo:
Código PHP:
Ver original
  1. <?php
  2.  
  3. require('cellfit.php');
  4.  
  5. $txt_short = 'This text is short enough.';
  6. $txt_long = 'This text is way too long.';
  7. for ($i = 1; $i <= 2; $i++)
  8.     $txt_long.=' '.$txt_long;
  9.  
  10. $pdf = new FPDF_CellFit();
  11. $pdf->AddPage();
  12. $pdf->SetFillColor(0xff,0xff,0x99);
  13. $pdf->SetFont('Arial','B',16);
  14.  
  15. $pdf->SetFont('','B');
  16. $pdf->Write(10,'Ejemplo');
  17. $pdf->SetFont('');
  18. $pdf->SetXY(10,30);
  19. $pdf->CellFitSpace(0,10,$txt_long,1,1,'',1);
  20. $pdf->SetXY(20,40);
  21. $pdf->CellFitSpace(60,10,$txt_short,1,1);
  22. $pdf->SetXY(30,50);
  23. $pdf->CellFitSpace(0,10,$txt_long,1,1,'',1);
  24. $pdf->SetXY(40,60);
  25. $pdf->CellFitSpace(60,10,$txt_short,1,1);
  26. $pdf->Output();
  27. ?>

Resultado:


Te recomiendo que codifiques 3 funciones en el archivo cellfit.php, utilizando claro esta Cellfitspace() en estas, en estas funciones establezcas los parametros y configuraciones para mostrar las tablas sin necesidad de configurar cada celda.
Las funciones serian: una para la cabecera, otra para los datos en las celdas y otra para juntas estas dos, para poder utilizar esto que te recomiendo podrias capturar los datos de la base en un array dandole como indices los nombres que quieres que aparezcan en la cabecera, para los datos de la cabecera seria igual un array con los nombres que le daras a cada una, en fin espero entiendas y no haberte confundido, no soy un experto pero intento ayudarte.

Avisanos si te sirvio.

Saludos

Última edición por kip13; 04/05/2016 a las 22:11
  #8 (permalink)  
Antiguo 05/05/2016, 06:52
 
Fecha de Ingreso: abril-2016
Mensajes: 65
Antigüedad: 8 años
Puntos: 4
Respuesta: reporte pdf delimitar tamaño campo

Primero que nada Kip13 muchas gracias por la ayuda, me sirvió de mucho todo.

Ahora respondiendo a esto
Cita:
Iniciado por kip13 Ver Mensaje
Código PHP:
Ver original
  1. CellFit(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link [, boolean scale [, boolean force]]]]]]]]])
no veo donde le indico la posición si bien tengo ya definidos mi set x y no veo donde incluirlos
  #9 (permalink)  
Antiguo 05/05/2016, 11:14
Avatar de kip13  
Fecha de Ingreso: agosto-2011
Mensajes: 167
Antigüedad: 12 años, 8 meses
Puntos: 13
Respuesta: reporte pdf delimitar tamaño campo

Fijate en el ejemplo que postee alla arriba, colocas antes de cada celda el SetXY().

Código PHP:
Ver original
  1. <?php
  2.  
  3. require('cellfit.php');
  4.  
  5. $txt_short = 'This text is short enough.';
  6. $txt_long = 'This text is way too long.';
  7. for ($i = 1; $i <= 2; $i++)
  8.     $txt_long.=' '.$txt_long;
  9.  
  10. $pdf = new FPDF_CellFit();
  11. $pdf->AddPage();
  12. $pdf->SetFillColor(0xff,0xff,0x99);
  13. $pdf->SetFont('Arial','B',16);
  14.  
  15. $pdf->SetFont('','B');
  16. $pdf->Write(10,'Ejemplo');
  17. $pdf->SetFont('');
  18. $pdf->SetXY(10,30);// antes de cada celda fijo las posiciones con respecto a XY, en CellfitSpace() solo se fija en ancho y largo de la celda, nada mas.
  19. $pdf->CellFitSpace(0,10,$txt_long,1,1,'',1);
  20. $pdf->SetXY(20,40);// antes de cada celda fijo las posiciones con respecto a XY, en CellfitSpace() solo se fija en ancho y largo de la celda, nada mas.
  21. $pdf->CellFitSpace(60,10,$txt_short,1,1);
  22. $pdf->SetXY(30,50); // antes de cada celda fijo las posiciones con respecto a XY, en CellfitSpace() solo se fija en ancho y largo de la celda, nada mas.
  23. $pdf->CellFitSpace(0,10,$txt_long,1,1,'',1);
  24. $pdf->SetXY(40,60);// antes de cada celda fijo las posiciones con respecto a XY, en CellfitSpace() solo se fija en ancho y largo de la celda, nada mas.
  25. $pdf->CellFitSpace(60,10,$txt_short,1,1);
  26. $pdf->Output();
  27. ?>

Si puedes coloca el código de como estas armando el documento.

Saludos

Última edición por kip13; 05/05/2016 a las 11:27
  #10 (permalink)  
Antiguo 06/05/2016, 06:48
 
Fecha de Ingreso: abril-2016
Mensajes: 65
Antigüedad: 8 años
Puntos: 4
Respuesta: reporte pdf delimitar tamaño campo

Kip13 te cuento que ya esta solucionado gracias por la ayuda.

Etiquetas: campo, fecha, pdf, reporte, select, tabla, tamaño
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:24.