2009-09-14 205 views
13

我正在使用fpdf的java端口。我遇到了錯誤。FPDF中MultiCell的換行符問題

1)。當我每次在新行上打印文本時調用多單元2次。

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

我希望在多單元調用之後沒有換行符。我該怎麼做?

2)如果我做了以下事情,那麼我的字符串的某些部分打印在一行上,而下一部分打印。 3)如果我做了以下事情,那麼在打印myString的行後面有許多空白行。它工作正常,如果我使用一個1安第二參數

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

什麼問題?

+0

爲什麼沒有人回答?我很需要它 – user156073 2009-09-14 17:20:44

回答

15

我將獲得當前Y位置寫MultiCell之前再MultiCell後一代移動「光標」回到那個Y位置。像這樣:

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

類似的東西。

1

我修改了MultiCell方法,它的工作方式與上面的答案一樣,您可以像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

直接修改方法是可怕的。如果FPDF以非常激烈的方式進行更新會導致修改無效,該怎麼辦?我以前見過這種場景。我認爲最好是製作一個包裹'MultiCell'而不是直接修改它的新方法。 – 2015-05-20 20:05:36

3

我創建了一個名爲MultiAlignCell的新方法。它採用與MultiCell相同的參數,但從Cell增加了ln字段。您可以將其添加到您的擴展課程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

爲什麼你將該方法聲明爲「private」? – Andrea 2015-12-02 11:45:50