MultiCell元素的FPDF高度

时间:2013-08-21 11:24:40

标签: php fpdf

我使用FPDF库将一些文档文件导出为PDF。一个文档包括具有不同长度的字符串列表。我将所有字符串打印为$pdf->MultiCell()。现在我希望MultiCell的当前高度具有相同的行间距,以防它们只有一行或更多行。

代码示例:

//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()
}

2 个答案:

答案 0 :(得分:15)

我有完全相同的问题;我使用FPDF生成发票,每行有四个单元格,第一个单元格是高度不同的MultiCell(默认高度为5,但如果订单名称太长,则会在总高度10上添加另一行,依此类推) 。问题是剩下的3个细胞有固定的高度。

在寻找解决方案后,似乎唯一的方法是编写复杂的功能或使用某些第三方工具。由于我希望我的应用程序尽可能轻,我使用以下方法来解决它,在我看来,这比外部插件简单。

  1. 有关发票详细信息的行从Y = 95开始,因此我使用$Y=95; 在我的while循环之前
  2. 我的第一个单元格(MultiCell)如下:

    $pdf->SetXY(10,$Y);
    $pdf->MultiCell(60,5,$row['Name'],1,1,'L');
    
  3. 我使用FPDF的GetY()函数获取当前高度并将其保存为H:

    $H = $pdf->GetY();
    

    如果MultiCell的高度为5,GetY()将返回100,如果高度为10,则GetY()返回105,依此类推。

  4. 我添加了新变量$ height:

    $height= $H-$Y;
    

    结果我精确地给出了MultiCell的高度。

  5. 我使用$ Y和$ height来设置当前位置和列高:

    $pdf->SetXY(130,$Y);
    $pdf->Cell(40,$height,$row['RowName'],1,1,'L');
    
  6. 在完成while循环设置之前,给$ Y $ $ H的值:

    $Y=$H;
    
  7. 整个循环如下所示并完美运行:

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

    如果每行有2个或更多的MultiCell列,它会变得棘手,但仍然可以用类似的方式解决。

答案 1 :(得分:0)

我在这里找到了有趣的解决方案-https://github.com/artkonekt/pdf-invoice/blob/master/src/InvoicePrinter.php#L469

$calculateHeight = new self;
$calculateHeight->addPage();
$calculateHeight->setXY(0, 0);
$calculateHeight->SetFont($this->font, '', 7);
$calculateHeight->MultiCell($this->firstColumnWidth, 3, $item['description'], 0, 'L', 1);
$descriptionHeight = $calculateHeight->getY() + $cellHeight + 2;

因此,他从字面上创建了一个“临时” PDF,添加了多单元格,然后简单地测量了高度(newY-oldY)

此外,请记住,如果文本换行,单元格的高度将为{number_of_lines * $height(将高度作为第二个参数传递给MultiCell)

因此,如果您将$ height传递给5,并且临时PDF测量该单元格将为15,则可以确定文本会扩展为3行。