如何在cell()/multi_cell()同一单元格内设置粗斜体等不同字体
同单元格局部字体样式实现方法
原生cell()、multi_cell()方法默认仅支持全局统一字体样式,会将传入的所有内容按当前设置的同一种字体、字重、字形渲染,无法直接识别<strong>、<em>等HTML标签实现局部样式调整,可通过以下两种方案实现需求:
方案1:文本片段拆分+逐块样式切换(原生无依赖,兼容性最好)
核心逻辑是将单元格内容按样式差异拆分为多个独立文本片段,每写入一个片段前切换到对应字体样式,依靠文本流写入保证片段连续排列,可实现和普通单元格完全一致的排版效果,同时支持局部粗体、斜体等样式。
以FPDF类库为例,实现代码如下:
// 初始化PDF、新增页面 $pdf = new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial','',12); // 初始化默认常规字体 // 定义单元格尺寸参数 $cellLeft = $pdf->GetX(); $cellTop = $pdf->GetY(); $cellWidth = 100; $lineHeight = 8; // 按样式拆分文本片段 $fragments = [ ['content' => 'In this scenario you will see a ', 'style' => ''], ['content' => 'driving', 'style' => 'B'], ['content' => ' route', 'style' => ''] ]; // 常用字体样式参数对应关系: - 空字符串`''`:常规字形 - `'B'`:粗体 - `'I'`:斜体 - `'BI'`:粗斜体 // 设置文本右边界,实现自动换行(和multi_cell换行逻辑一致) $pdf->SetRightMargin($pdf->GetPageWidth() - $cellLeft - $cellWidth); // 逐片段写入 foreach ($fragments as $frag) { $pdf->SetFont('Arial', $frag['style'], 12); $pdf->Write($lineHeight, $frag['content']); } // 若需要单元格边框,可在内容写入完成后,回到单元格起始位置绘制空单元格边框 $pdf->SetXY($cellLeft, $cellTop); $pdf->MultiCell($cellWidth, $lineHeight, '', 1);
方案2:使用支持富文本解析的扩展方法
如果不想手动拆分文本、计算样式,可以使用支持HTML解析的PDF类库(如TCPDF、带HTML扩展插件的FPDF),直接调用类库提供的writeHTML()方法,传入带简单样式标签的文本即可自动渲染局部样式,不需要手动切换字体:
// 调用支持HTML解析的写入方法,直接传入带<strong>标签的内容 $pdf->writeHTML('<p>In this scenario you will see a <strong>driving</strong> route</p>');
注意:直接将带HTML标签的字符串传入原生
cell()或multi_cell()方法时,标签会被当做普通文本直接打印,不会被解析为样式效果。
内容的提问来源于stack exchange,提问作者Ala Garbey
相关产品推荐
相关产品推荐

