如何在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); }
关键说明
- 坐标控制:通过
SetXY手动指定每个单元格的起始位置,确保同一行的所有单元格都从$y_start开始绘制,避免MultiCell自动换行导致的错位。 - 行高计算:提前计算每行所有单元格的文本所需行数,取最大高度作为该行的统一行高,保证单行单元格垂直居中,多行单元格完整显示。
- 对齐配置:通过
$alignments数组设置各列的文本对齐方式,和表头保持视觉一致。
这样修改后,Trainee和Training Title列的文本会自动换行,同时整个表格的排版能保持整齐对齐。
内容的提问来源于stack exchange,提问作者user87
相关产品推荐
相关产品推荐

