PHP使用FPDF生成表格时MultiCell对齐失效、内容仍同行问题求助
问题原因
- 现有代码仅实现了多列
MultiCell的顶部对齐效果,未对内容高度做限制:FPDF的MultiCell会根据内容长度自动换行,只要内容超出单行列宽就会生成多行,单元格高度也会随内容行数增加而变大,直接破坏你固定18行每页的布局规则。 MultiCell的第二个参数为单行文本的行间距,你当前设置为7,一旦内容换行,单元格总高度为7 * 行数,必然超过你原本的单行行高,所以看不到预期的适配效果。
解决方案
场景1:必须完整显示所有内容,接受微调行高但保持每页18行总高度不变
你可以先预计算每一行两个长内容列的最大行数,再统一设置当前行的行高,保证所有单元格高度一致,同时重新计算每页18行的固定行高上限,确保总页面高度不变。
示例代码:
// 先预计算两个长文本列的行数 $lineCount1 = count(explode("\n", $pdf->WordWrap($row['col1'], $width_cell[1]))); $lineCount2 = count(explode("\n", $pdf->WordWrap($row['col2'], $width_cell[2]))); $maxLines = max($lineCount1, $lineCount2); // 固定行高上限,比如你原来的行高是7,最大允许2行的话就设为14,保证不超总页面高度 $rowHeight = min(7 * $maxLines, 14); // 输出第一列 $current_x = $pdf->GetX(); $current_y = $pdf->GetY(); $pdf->MultiCell($width_cell[1], $rowHeight / $maxLines, $row['col1'], 1, 'C', false); // 输出第二列 $pdf->SetXY($current_x + $width_cell[1], $current_y); $pdf->MultiCell($width_cell[2], $rowHeight / $maxLines, $row['col2'], 1, 'C', false); // 光标移动到行尾 $pdf->SetXY($current_x + $width_cell[1] + $width_cell[2], $current_y); // 输出剩余列 // ... 其他列的Cell输出代码 // 移动到下一行开头 $pdf->SetY($current_y + $rowHeight);
场景2:不允许改变原有行高,优先保证每页18行的布局
可以自动缩小字号适配固定单元格,或者超出宽度的内容自动截断加省略号:
// 固定行高7,固定列宽 $fixedHeight = 7; $colWidth = $width_cell[1]; $content = $row['example']; // 自动缩小字号适配 $fontSize = 12; while($fontSize > 6) { // 最小字号6 $pdf->SetFontSize($fontSize); $stringWidth = $pdf->GetStringWidth($content); if($stringWidth <= $colWidth - 2) { // 留2px边距 break; } $fontSize -= 0.5; } $pdf->Cell($colWidth, $fixedHeight, $content, 1, 0, 'C', false); // 输出完恢复默认字号 $pdf->SetFontSize(12);
如果可以接受内容截断,用更简单的实现:
$fixedHeight = 7; $colWidth = $width_cell[1]; $content = $row['example']; while($pdf->GetStringWidth($content) > $colWidth - 4 && strlen($content) > 0) { $content = mb_substr($content, 0, -1); } if(mb_strlen($content) < mb_strlen($row['example'])) { $content .= '...'; } $pdf->Cell($colWidth, $fixedHeight, $content, 1, 0, 'C', false);
内容的提问来源于stack exchange,提问作者pilotman
相关产品推荐
相关产品推荐

