
如何在 mpdf 中实现并排显示多个 div(如图片网格布局):mpdf 不支持 css grid 布局,且对 `float` 的解析依赖完整 html 结构和显式宽度控制;正确做法是预先拼接 html 字符串、为浮动元素设置小于 50% 的宽度,并插入 `clear: both` 清除浮动。
mPDF 是一个功能强大的 PHP PDF 生成库,但其 HTML/CSS 渲染引擎并非完整浏览器内核,不支持现代 CSS 布局特性(如 display: grid 或 flexbox)。这也是你使用 grid-template-columns: auto auto 在浏览器中正常、却在 PDF 中失效的根本原因。同时,WriteHTML() 方法对分段调用敏感——若将
✅ 正确实践的关键三点:
- 一次性传入完整 HTML 片段:避免多次调用 WriteHTML() 拼接结构,应在 PHP 中先构建完整的 HTML 字符串,再统一传入;
- 为浮动元素设置明确宽度:float: left/right 要生效,子元素宽度之和必须 ≤ 父容器宽度(建议单个 div 宽度设为 45%,预留间距余量);
- 及时清除浮动:每两个并排元素后添加 ,防止后续内容塌陷或错位。
以下是可直接运行的推荐写法(兼容 mPDF v7.x / v8.x):
$html = '';
$images = ['img1.jpg', 'img2.jpg', 'img3.jpg', 'img4.jpg']; // 替换为你的图片数组
foreach ($images as $index => $image) {
$width = '45%';
$float = ($index % 2 === 0) ? 'left' : 'right';
$html .= '';
$html .= '@@##@@';
$html .= '';
// 每两列后清除浮动(即 index = 1, 3, 5... 时)
if ($index > 0 && $index % 2 === 1) {
$html .= '';
}
}
// 处理奇数个元素:末尾补一个 clear
if (count($images) % 2 === 1) {
$html .= '';
}
$mpdf->WriteHTML($html);
$mpdf->Output();⚠️ 注意事项:
- 使用 htmlspecialchars() 对文件路径转义,防止 XSS 或路径解析异常;
- 推荐为
添加 max-width: 100% 和 height: auto,提升响应式适配性;
- 若需严格等宽两栏,可改用 table 布局(mPDF 对表格支持极佳),例如
;... ... - 避免使用 margin-top/bottom 控制垂直间距,优先用 padding 或 line-height,因 mPDF 对外边距折叠处理不稳定。
总结:mPDF 的布局能力受限于其轻量级渲染器定位,拥抱兼容性写法比强行套用现代 CSS 更高效可靠。掌握“预生成 HTML + 浮动 + 清除”这一组合模式,即可稳定实现双列、三列乃至多列图文排版。










