2009-09-14 98 views
13

Estoy usando el puerto de fpdf de Java. Estoy encontrando errores de fowwlowing.problema de corte de línea con MultiCell en FPDF

1). Cuando llamo a multicell 2 veces cada vez que el texto se imprime en una nueva línea.

MultiCell(0, 1, "abcd", currentBorders, Alignment.LEFT, false); //prints on one line 
MultiCell(0, 1, "efg", currentBorders, Alignment.LEFT, false); //prints on next line 

Quiero que no hay salto de línea después de la llamada a multicelular. ¿Cómo puedo hacerlo?

2) Si hago lo siguiente, una parte de mi cadena se imprime en una línea y otra en la siguiente.

MultiCell(getStringWidth(myString), 1, myStringcurrentBorders, Alignment.LEFT, false); 

3) Si hago la siguiente cosa entonces hay muchas líneas en blanco después de la línea en la que se imprime miCadena. Funciona correctamente si uso uno 1 ans segundo parámetro

MultiCell(0, myFontSize, "123456", currentBorders, Alignment.LEFT, false); 

¿Cuál es el problema?

+0

qué está respondiendo a nadie? Necesito que mal – user156073

Respuesta

15

que tendría la Y posición actual antes de escribir el MultiCell y mueva el "cursor" de nuevo a ese Y posición después de la generación MultiCell. De esta manera:

$current_y = $pdf->GetY(); 
$current_x = $pdf->GetX(); 

$cell_width = 50; 
MultiCell($cell_width, 1, "abcd", currentBorders, Alignment.LEFT, false); 

$pdf->SetXY($current_x + $cell_width, $current_y); 

$current_x = $pdf->GetX(); 
MultiCell($cell_width, 1, "abcd", currentBorders, Alignment.LEFT, false); 

Algo así.

1

He modificado el método MultiCell, funciona como la respuesta anterior, y puede usar el método de la misma manera que el método Cell.

function MultiCell($w, $h, $txt, $border=0, $ln=0, $align='J', $fill=false) 
{ 
    // Custom Tomaz Ahlin 
    if($ln == 0) { 
     $current_y = $this->GetY(); 
     $current_x = $this->GetX(); 
    } 

    // Output text with automatic or explicit line breaks 
    $cw = &$this->CurrentFont['cw']; 
    if($w==0) 
     $w = $this->w-$this->rMargin-$this->x; 
    $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; 
    $s = str_replace("\r",'',$txt); 
    $nb = strlen($s); 
    if($nb>0 && $s[$nb-1]=="\n") 
     $nb--; 
    $b = 0; 
    if($border) 
    { 
     if($border==1) 
     { 
      $border = 'LTRB'; 
      $b = 'LRT'; 
      $b2 = 'LR'; 
     } 
     else 
     { 
      $b2 = ''; 
      if(strpos($border,'L')!==false) 
       $b2 .= 'L'; 
      if(strpos($border,'R')!==false) 
       $b2 .= 'R'; 
      $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2; 
     } 
    } 
    $sep = -1; 
    $i = 0; 
    $j = 0; 
    $l = 0; 
    $ns = 0; 
    $nl = 1; 
    while($i<$nb) 
    { 
     // Get next character 
     $c = $s[$i]; 
     if($c=="\n") 
     { 
      // Explicit line break 
      if($this->ws>0) 
      { 
       $this->ws = 0; 
       $this->_out('0 Tw'); 
      } 
      $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); 
      $i++; 
      $sep = -1; 
      $j = $i; 
      $l = 0; 
      $ns = 0; 
      $nl++; 
      if($border && $nl==2) 
       $b = $b2; 
      continue; 
     } 
     if($c==' ') 
     { 
      $sep = $i; 
      $ls = $l; 
      $ns++; 
     } 
     $l += $cw[$c]; 
     if($l>$wmax) 
     { 
      // Automatic line break 
      if($sep==-1) 
      { 
       if($i==$j) 
        $i++; 
       if($this->ws>0) 
       { 
        $this->ws = 0; 
        $this->_out('0 Tw'); 
       } 
       $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); 
      } 
      else 
      { 
       if($align=='J') 
       { 
        $this->ws = ($ns>1) ?  ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; 
        $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); 
       } 
       $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); 
       $i = $sep+1; 
      } 
      $sep = -1; 
      $j = $i; 
      $l = 0; 
      $ns = 0; 
      $nl++; 
      if($border && $nl==2) 
       $b = $b2; 
     } 
     else 
      $i++; 
    } 
    // Last chunk 
    if($this->ws>0) 
    { 
     $this->ws = 0; 
     $this->_out('0 Tw'); 
    } 
    if($border && strpos($border,'B')!==false) 
     $b .= 'B'; 
    $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); 
    $this->x = $this->lMargin; 

    // Custom Tomaz Ahlin 
    if($ln == 0) { 
     $this->SetXY($current_x + $w, $current_y); 
    } 
} 
+2

Modificar directamente un método da miedo. ¿Qué sucede si las actualizaciones FPDF de una manera drástica que invalida sus modificaciones? He visto ese tipo de escenario antes. Creo que es mejor crear un nuevo método que envuelva 'MultiCell' en lugar de modificarlo directamente. –

3

Creé un nuevo método llamado MultiAlignCell. Toma los mismos parámetros que MultiCell pero con el campo ln agregado de Cell. Puede agregarlo a su clase extendida FPDF.

/** 
* MultiCell with alignment as in Cell. 
* @param float $w 
* @param float $h 
* @param string $text 
* @param mixed $border 
* @param int $ln 
* @param string $align 
* @param boolean $fill 
*/ 
private function MultiAlignCell($w,$h,$text,$border=0,$ln=0,$align='L',$fill=false) 
{ 
    // Store reset values for (x,y) positions 
    $x = $this->GetX() + $w; 
    $y = $this->GetY(); 

    // Make a call to FPDF's MultiCell 
    $this->MultiCell($w,$h,$text,$border,$align,$fill); 

    // Reset the line position to the right, like in Cell 
    if($ln==0) 
    { 
     $this->SetXY($x,$y); 
    } 
} 
+0

¿Por qué declaras el método como 'privado '? – Andrea

Cuestiones relacionadas