
当 mpdf 表格中存在多层嵌套(尤其是表格内嵌表格)且 rowspan 跨越大量内容时,会触发自动缩放字体行为;正确做法是禁用自动缩放、显式控制分页,并避免嵌套表格结构。
当 mpdf 表格中存在多层嵌套(尤其是表格内嵌表格)且 rowspan 跨越大量内容时,会触发自动缩放字体行为;正确做法是禁用自动缩放、显式控制分页,并避免嵌套表格结构。
在使用 mPDF 生成 PDF 报表时,rowspan 属性本应优雅地跨行合并单元格,但若其内部内容过多(尤其当该单元格还包含子表格、长文本或复杂 HTML),mPDF 的默认渲染逻辑可能误判为“表格整体超宽/超高”,进而触发 shrink_tables_to_fit 的自动字体压缩机制——即使你已将 shrink_tables_to_fit => 1 或
✅ 正确解决方案
1. 彻底禁用自动缩放
$mpdf = new \Mpdf\Mpdf([
'shrink_tables_to_fit' => 0, // 关键:设为 0,完全禁用字体压缩
'tableMinSizePriority' => false, // 避免最小字号优先策略干扰
'use_kwt' => true,
'autoScriptToLang' => true,
]);⚠️ 注意:shrink_tables_to_fit => 1 实际表示“允许缩放至 100%”,而非“禁止缩放”;设为 0 才代表“绝不缩放”。
2. 强制分页:用 CSS 控制断点
在含长 rowspan 的
<table border="1">
<tr>
<td rowspan="10" style="page-break-inside: avoid; vertical-align: top;">
<!-- 此处放置长内容(建议用 div 包裹,避免再嵌 table) -->
<div>内容段落 1...</div>
<div>内容段落 2...</div>
<div>内容段落 3...</div>
<!-- ... 更多内容 -->
</td>
<td>右侧常规列</td>
</tr>
<!-- 其他行 -->
</table>3. 替代嵌套表格:用 CSS Grid/Flex 模拟布局
避免
<td style="vertical-align: top;">
<div style="display: grid; grid-template-columns: 1fr 2fr; gap: 4px;">
<div><strong>项目:</strong></div>
<div>值 A</div>
<div><strong>状态:</strong></div>
<div>已完成</div>
</div>
</td>4. 主动预估高度 + 插入分页符(进阶)
若内容高度可估算,可在关键位置插入:
// PHP 中动态判断是否接近页面底部
if ($mpdf->y > $mpdf->h - 80) { // 剩余空间不足 80mm
$mpdf->AddPage();
}? 总结与最佳实践
- 永远避免表格嵌套:这是引发 rowspan 渲染异常的首要诱因;
- shrink_tables_to_fit => 0 是防止字体被意外压缩的必要前提;
- 使用 page-break-inside: avoid + vertical-align: top 组合保障 rowspan 单元格整体不被截断;
- 长内容优先采用 + CSS 布局替代子表格,提升渲染稳定性;
- 如需精确控制,结合 $mpdf->y 动态检测并调用 AddPage()。
通过以上调整,即可让 mPDF 尊重你的排版意图:内容过多时自然分页,而非牺牲可读性强行缩放字体。


















