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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:15:30