当 mpdf 渲染含复杂 rowspan 的嵌套表格时,会强制缩小字体以适配单元格高度,而非自然分页;本文提供禁用自动缩放、启用智能分页与结构优化的完整解决方案。
当 mpdf 渲染含复杂 rowspan 的嵌套表格时,会强制缩小字体以适配单元格高度,而非自然分页;本文提供禁用自动缩放、启用智能分页与结构优化的完整解决方案。
mPDF 默认对表格采用“收缩适配”策略(shrink_tables_to_fit),尤其在遇到跨多行的 且其内容高度显著超过其他行时,会自动降低整个表格的字体大小(甚至低至 4–6pt),导致可读性严重下降。更关键的是,
该行为在嵌套表格(table inside table)场景下被显著放大
——外层表格的 rowspan 单元格若包裹了内层表格,mPDF 往往无法准确预估高度,从而触发过度收缩,而非按预期将内容推至下一页。
✅ 正确配置:关闭收缩 + 启用分页控制
首先,必须
彻底禁用自动缩放
,并配合分页提示:
⚠️ 注意:shrink_tables_to_fit => 1 是问题根源,设为 0 才能交由 CSS 和分页逻辑接管。
✅ HTML/CSS 层:强制分页与结构规范
在 HTML 中,需主动引导分页,并规避嵌套陷阱:
✅ 进阶技巧:动态检测 & 强制分页
若 rowspan 内容高度不可控,可在生成前估算并插入分页符:
? 总结要点
根本原因
:shrink_tables_to_fit = 1 + 嵌套表格 → mPDF 高度计算失效 → 字体被暴力压缩;
核心修复
:shrink_tables_to_fit => 0 + page-break-inside: avoid + 拆除嵌套结构;
最佳实践
:用语义化
$mpdf = new \Mpdf\Mpdf([
'shrink_tables_to_fit' => 0, // 关键:禁用字体收缩(默认为 1)
'autoScriptToLang' => true,
'autoLangToFont' => true,
'use_kwt' => true,
]);
长文本内容...
- 条目1
- 条目2
常规列内容
第2行
第3行
第4行
第5行
// PHP 侧简易高度预判(基于行数/字符数启发式)
$content = "大量文本...";
if (mb_strlen($content) > 800 || substr_count($content, "\n") > 15) {
$html .= '';
}
$html .= '' . htmlspecialchars($content) . ' '; 替代内层 ,配合 CSS 控制布局与分页;
调试建议
:开启 mPDF debug 模式('debug' => true)查看日志中 Table height overflow 提示,定位具体单元格。
遵循以上方案,即可让 rowspan 表格内容自然分页,彻底告别字体“隐身”问题。
