You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FPDF中实现数据库驱动PDF表格的单元格文本换行?

解决FPDF表格单元格文本换行且保持排版对齐的问题

当使用FPDF的MultiCell时,默认会将光标移动到单元格底部,导致后续单元格错位,核心解决思路是手动控制坐标位置,确保同一行的所有单元格都从相同的Y坐标开始绘制,再统一调整到下一行的起始位置。

修改后的代码实现

替换你原代码中while ($row = mysqli_fetch_assoc($result)) { ... }的部分为以下内容:

// Set data from database
$pdf->SetFont('Arial', '', 12);
$cell_height = 10; // 基础行高(和表头保持一致)
while ($row = mysqli_fetch_assoc($result)) {
    $y_start = $pdf->GetY(); // 记录当前行的起始Y坐标
    $col_widths = [10, 40, 80, 25, 10, 20]; // 各列宽度,和表头对应
    $cell_data = [
        $row['ID'],
        $row['Trainee'],
        $row['training_title'],
        $row['training_date'],
        $row['is_attended'],
        $row['remarks']
    ];
    $alignments = ['C', 'L', 'L', 'C', 'C', 'L']; // 各列对齐方式

    // 计算该行所有单元格的最大高度
    $max_height = $cell_height;
    foreach ($cell_data as $idx => $text) {
        $text_width = $pdf->GetStringWidth($text);
        $line_count = ceil($text_width / $col_widths[$idx]);
        $current_height = $line_count * $cell_height;
        if ($current_height > $max_height) {
            $max_height = $current_height;
        }
    }

    // 逐个绘制单元格
    $x_current = 0; // 起始X坐标
    foreach ($cell_data as $idx => $text) {
        $pdf->SetXY($x_current, $y_start); // 定位到当前单元格的起始位置
        // 绘制MultiCell,使用计算出的最大行高(单行单元格会垂直居中)
        $pdf->MultiCell($col_widths[$idx], $cell_height, $text, 1, $alignments[$idx], false);
        $x_current += $col_widths[$idx]; // 更新X坐标到下一列
    }

    // 将光标移动到下一行的起始位置
    $pdf->SetY($y_start + $max_height);
}

关键说明

  1. 坐标控制:通过SetXY手动指定每个单元格的起始位置,确保同一行的所有单元格都从$y_start开始绘制,避免MultiCell自动换行导致的错位。
  2. 行高计算:提前计算每行所有单元格的文本所需行数,取最大高度作为该行的统一行高,保证单行单元格垂直居中,多行单元格完整显示。
  3. 对齐配置:通过$alignments数组设置各列的文本对齐方式,和表头保持视觉一致。

这样修改后,Trainee和Training Title列的文本会自动换行,同时整个表格的排版能保持整齐对齐。

内容的提问来源于stack exchange,提问作者user87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:30:58