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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:30:52