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

Core PHP中使用FPDF生成PDF模板遇文本重叠问题求助

PDF表格文本换行与行列对齐修复

当前效果:
当前结果

需求

  • 文本禁止重叠,必须实现自动换行
  • 适配两种数据场景:
    • 日期列内容行数多于响应列(如图所示)
    • 响应列内容行数多于日期列

当前代码

$data = $this->getExportData($survey_id, $question_id);
        
$pdf = new PDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);

// 添加问卷名称标题
$pdf->Cell(0, 10, $survey_name, 0, 1, 'C');

// 添加结果表格
$pdf->SetFont('Arial', '', 12);
$pdf->SetFillColor(242, 242, 242);
$pdf->Cell(80, 10, '时间', 1, 0, 'C', true);
$pdf->Cell(0, 10, '回复内容', 1, 1, 'C', true);
$pdf->SetFont('Arial', '', 10);

// 添加数据
foreach ($data as $row) {
    $pdf->Cell(80, 10, $row['Date'], 1, 0, 'C');
    $pdf->WordWrap($text,80);
    $pdf->Cell(0, 10, $row['Response'], 1, 1, 'L');
    $pdf->WordWrap($text,0);
}
// 输出PDF到浏览器
$pdf->Output();

修复方案

核心用MultiCell替代Cell实现自动换行,同时计算单元格高度保证行列对齐:

$data = $this->getExportData($survey_id, $question_id);
        
$pdf = new PDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);

// 添加问卷名称标题
$pdf->Cell(0, 10, $survey_name, 0, 1, 'C');

// 添加结果表格表头
$pdf->SetFont('Arial', '', 12);
$pdf->SetFillColor(242, 242, 242);
$pdf->Cell(80, 10, '时间', 1, 0, 'C', true);
$pdf->Cell(0, 10, '回复内容', 1, 1, 'C', true);
$pdf->SetFont('Arial', '', 10);

// 定义列宽:日期列固定80,响应列占页面剩余宽度
$dateColWidth = 80;
$responseColWidth = $pdf->GetPageWidth() - $dateColWidth - $pdf->lMargin - $pdf->rMargin;

foreach ($data as $row) {
    // 先计算两列内容的渲染高度(不绘制边框)
    $pdf->SetFont('Arial', '', 10);
    $dateHeight = $pdf->MultiCell($dateColWidth, 10, $row['Date'], 0, 'C', false, 0, '', '', true, 0, false, true, 10, 'M');
    $responseHeight = $pdf->MultiCell($responseColWidth, 10, $row['Response'], 0, 'L', false, 0, '', '', true, 0, false, true, 10, 'M');
    
    // 取最大高度作为当前行的统一高度
    $rowHeight = max($dateHeight, $responseHeight);
    
    // 回到当前行起始位置,绘制带边框的日期单元格
    $currentY = $pdf->GetY() - $rowHeight;
    $pdf->SetXY($pdf->lMargin, $currentY);
    $pdf->MultiCell($dateColWidth, $rowHeight, $row['Date'], 1, 'C', true);
    
    // 绘制带边框的响应单元格
    $pdf->SetXY($pdf->lMargin + $dateColWidth, $currentY);
    $pdf->MultiCell($responseColWidth, $rowHeight, $row['Response'], 1, 'L', true);
}

// 输出PDF到浏览器
$pdf->Output();

方案说明

  1. MultiCell原生支持文本自动换行,解决内容重叠问题
  2. 先计算内容高度,再统一绘制单元格,确保两列高度一致,适配两种数据场景
  3. 响应列宽度自动适配页面,避免固定宽度导致的内容溢出
  4. 保留原有的表头样式和字体设置,保证视觉一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:53:14