Yii2框架中使用mPDF设置文档分栏报错如何解决
mPDF 双栏布局报错/不生效解决方法
问题核心原因
触发报错、配置不生效的根源是三个常见配置错误:
- 调用
SetColumns()时机错误:mPDF未生成默认页面对象时就调用分栏方法,会直接访问空对象属性触发致命错误 - 分栏配置重复冲突:同时尝试HTML标签、配置项、直接调用API三种方式设置分栏,重复初始化分栏状态会触发逻辑报错
- 表格未做分栏适配:默认表格宽度未做限制,超过单栏宽度时会触发布局溢出错误
正确实现步骤
两种实现方式二选一即可,绝对不要混用:
方式1:HTML标签控制分栏(推荐,适配Yii2视图渲染逻辑)
- 删掉配置项
methods数组中注释的SetColumns项,同时删掉代码里所有直接调用$mpdf->SetColumns()的行,避免配置冲突 - 打开渲染用的
resultscore视图文件,在所有HTML内容的最顶部(不要嵌套在任何p、div标签内部)加入分栏标签:
<columns column-count="2" vAlign="J" column-gap="5" />
- 修改mPDF初始化的
cssInline配置,给表格加自适应样式,避免宽度溢出单栏:
'cssInline' => '.left{margin-right: 100px;} table{width:100%;border-collapse:collapse;} td,th{word-break:break-word;}',
- 如果有报表标题这类需要跨整页显示的内容,在对应内容前后加标签临时关闭分栏即可:
<columnbreak="off" /> <h1>年度考核报表</h1> <columnbreak="on" /> <!-- 后续表格内容自动按双栏渲染 -->
方式2:PHP API调用设置分栏
如果习惯用代码逻辑控制分栏,按以下顺序调整代码,调用顺序不能随意改动:
$mpdf = $pdf->api; $mpdf->useSubstitutions = false; $mpdf->SetFooter('<p class="text-left">' . $now .'</p> Page {PAGENO} '); // 必须先AddPage生成页面对象,再调用SetColumns,否则必报错 $mpdf->AddPage(); $mpdf->SetColumns(2, 'J', 5); $pdf->content = $htmlContent; return $pdf->render();
避坑提示
- 双栏模式下不要给表格设置超过单栏宽度的固定宽度,A4竖版单栏有效宽度约90mm,表格统一设置
width:100%自适应即可 - 短表格可以添加CSS属性
page-break-inside: avoid;避免被强制拆分到下一栏,长表格不要加该属性,否则会出现内容溢出页面的问题 - 开启
$mpdf->simpleTables = true;可以提升双栏下表格的渲染稳定性,但会丢失部分复杂表格样式,按需开启即可
内容的提问来源于stack exchange,提问作者Tox
相关产品推荐
相关产品推荐

