2009-09-14 9 views
13

J'utilise java port de fpdf. Je rencontre des erreurs de fowwlowing. 1) .Quand j'appelle multicellule 2 fois chaque fois que le texte est imprimé sur une nouvelle ligne.problème de rupture de ligne avec MultiCell dans FPDF

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

Je veux qu'il n'y ait pas de saut de ligne après l'appel à multicelluler. Comment puis-je le faire?

2) Si je fais la chose suivante alors une partie de ma chaîne est imprimée sur une ligne et d'autres sur la suivante.

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

3) Si je fais ce qui suit, il y a beaucoup de lignes vides après la ligne sur laquelle myString est imprimée. Cela fonctionne correctement si j'utilise un second paramètre 1 an

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

Quel est le problème?

+0

pourquoi personne ne répond? – user156073

Répondre

15

je recevrais la position actuelle Y avant d'écrire le MultiCell puis déplacez le dos « curseur » à cette position Y après la génération MultiCell. Comme ceci:

$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); 

Quelque chose comme ça.

1

J'ai modifié la méthode MultiCell, cela fonctionne comme la réponse ci-dessus, et vous pouvez utiliser la méthode de la même manière que la méthode 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

La modification directe d'une méthode est effrayante. Que se passe-t-il si les mises à jour FPDF d'une manière drastique invalident vos modifications? J'ai déjà vu ce genre de scénario auparavant. Je pense qu'il est préférable de faire une nouvelle méthode qui entoure 'MultiCell' au lieu de le modifier directement. –

3

J'ai créé une nouvelle méthode appelée MultiAlignCell. Il prend les mêmes paramètres que MultiCell mais avec le champ ln ajouté de Cell. Vous pouvez l'ajouter à votre classe étendue 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

Pourquoi déclarez-vous la méthode comme «private»? – Andrea

Questions connexes