line break problem with MultiCell in FPDF line break problem with MultiCell in FPDF php php

line break problem with MultiCell in FPDF


I would get the current Y position before writing the MultiCell and then move the "cursor" back to that Y position after the MultiCell generation. Like this:

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

Something like that.


I created a new method called MultiAlignCell. It takes the same parameters as MultiCell but with the added ln field from Cell. You can add it to your extended FPDF class.

/*** 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);    }}


I have modified the MultiCell method, it works as the above answer, and you can use the method in the same way as the Cell method.

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