FPDF height of a MultiCell Element

Thomas1703 picture Thomas1703 · Aug 21, 2013 · Viewed 28.1k times · Source

I use the FPDF library to export some document files as PDF. One document includes a list of strings which have a different length. I print all strings as $pdf->MultiCell(). Now I would like to have the current height of that MultiCell to have the same line spacing in case that they have just one line or more.

Code Example:

//MySQL Query
while($row = mysql_fetch_array($res) {
   $pdf->SetXY(18, $x);
   $pdf->MultiCell(80, 5, $rowr['text']); //text has one or more lines
   $x = $x + 10; // Here I would prefer a solution to say: $x = $x + 2 + height of the MultiCell()
}

Answer

user4029967 picture user4029967 · Apr 15, 2015

I had the exact same problem; I use FPDF to generate invoices and there are four cells per row with first cell being a MultiCell with varying height (default height is 5, but if order name is too long it adds another line to a total height of 10, and so on). The problem is that the remaining 3 cells have fixed height.

After looking for solutions it seems the only way is to write a complex function or use some third party tool. Since I want my app to be as light as possible I used the following approach to solve it which in my opinion is way simpler than external plugin.

  1. Rows with details on the Invoice start at Y=95 so I use $Y=95; before my while loop
  2. My first cell (the MultiCell) is as follows:

    $pdf->SetXY(10,$Y);
    $pdf->MultiCell(60,5,$row['Name'],1,1,'L');
    
  3. I use the FPDF's GetY() function to get current height and save it as H:

    $H = $pdf->GetY();
    

    If the MultiCell's height is 5 GetY() will give back 100, if the height is 10 GetY() gives back 105 and so on.

  4. I add new variable $height:

    $height= $H-$Y;
    

    Which as result gives me precisely the height of the MultiCell.

  5. I use $Y and $height to set current position and column height:

    $pdf->SetXY(130,$Y);
    $pdf->Cell(40,$height,$row['RowName'],1,1,'L');
    
  6. Before finishing the while loop set give $Y the $H's value:

    $Y=$H;
    

Entire loop looks as follows and works perfectly:

$Y= 95;

$query = mysqli_query($con,"SELECT * FROM table");

while($row = mysqli_fetch_array($query)) {
    $pdf->SetXY(10,$Y);
    $pdf->MultiCell(60,5,$row['ROW1'],1,1,'L');

    $H = $pdf->GetY();
    $height= $H-$Y;

    $pdf->SetXY(70,$Y);
    $pdf->Cell(60,$height,$row['ROW2'],1,1,'L');
    $pdf->SetXY(130,$Y);
    $pdf->Cell(40,$height,$row['ROW3'],1,1,'L');
    $pdf->SetXY(170,$Y);
    $pdf->Cell(30,$height,$row['ROW4'],1,1,'L');

    $Y=$H;
}

If you have 2 MultiCell columns or more in each row it gets tricky but still can be solved in a similar manner.