MPDF项目中使用@page规则实现高级分页控制
2025-06-03 17:16:11作者:卓艾滢Kingsley
理解CSS分页媒体模型
MPDF基于CSS分页媒体模型实现PDF文档的分页控制,这个模型定义了页面布局的基本结构:
______________________________
| | |<- 纸张边界
| |<--+-- 裁剪标记
| ______________________|___|
| | A | |
| | ______________ |<--+-- 页面框
| | D | 页眉区域 | B | |
| | | | | |
| | | |<--+---+-- 实际内容区域
| | | | | |
| | | | | |
| | | | | |
| | |___页脚区域___| | |
| | C | |
| |______________________| |
| |
|_____________________________|
- A: 上边距(margin-top)
- B: 右边距(margin-right)
- C: 下边距(margin-bottom)
- D: 左边距(margin-left)
@page规则基础用法
在MPDF中,@page规则用于定义页面样式,基本语法如下:
@page {
size: A4 landscape; /* 页面尺寸和方向 */
margin: 2cm; /* 页面边距 */
margin-header: 1cm; /* 页眉边距 */
margin-footer: 1cm; /* 页脚边距 */
marks: crop cross; /* 裁剪和十字标记 */
header: html_myHeader; /* 使用HTML定义的页眉 */
footer: html_myFooter; /* 使用HTML定义的页脚 */
}
关键参数说明
-
size属性:
- 接受具体尺寸(如
210mm 297mm) - 或预设值(
A4,letter等) - 方向参数(
portrait纵向,landscape横向) auto表示使用默认纸张尺寸
- 接受具体尺寸(如
-
margin系列属性:
- 百分比值基于页面框的宽度(左右)或高度(上下)
- 支持所有标准CSS单位(px, pt, cm, mm, in)
-
header/footer属性:
- 引用通过HTML定义的页眉页脚
- 必须添加
html_前缀 - 设为
_blank可禁用页眉页脚
高级分页控制技巧
1. 伪类选择器
MPDF支持三种页面伪类选择器:
/* 奇数页/右侧页样式 */
@page :right {
margin-top: 3cm;
header: html_headerOdd;
}
/* 偶数页/左侧页样式 */
@page :left {
margin-top: 2.5cm;
header: html_headerEven;
}
/* 文档首页特殊样式 */
@page :first {
margin-top: 5cm;
header: none;
}
注意:伪类选择器中不能修改左右边距和页面尺寸。
2. 命名页面样式
可以创建命名的页面样式并在需要时应用:
/* 定义横向页面样式 */
@page landscape_page {
size: A4 landscape;
margin: 1.5cm;
}
/* 在元素上应用命名样式 */
div.landscape-section {
page: landscape_page;
page-break-before: right;
}
3. 分页控制属性
结合page-break-before属性实现精确分页:
/* 强制从新页面开始 */
.new-chapter {
page-break-before: always;
}
/* 确保从奇数页开始 */
.important-section {
page-break-before: right;
}
/* 确保从偶数页开始 */
.appendix {
page-break-before: left;
}
实际应用示例
下面是一个完整的页眉页脚控制示例:
<?php
$mpdf = new \Mpdf\Mpdf();
$mpdf->useOddEven = 1; // 启用奇偶页不同样式
$html = '
<html>
<head>
<style>
@page {
odd-header-name: html_headerOdd;
even-header-name: html_headerEven;
odd-footer-name: html_footerOdd;
even-footer-name: html_footerEven;
}
@page noheaders {
odd-header-name: _blank;
even-header-name: _blank;
}
.no-headers {
page: noheaders;
}
</style>
</head>
<body>
<!-- 定义奇偶页眉 -->
<htmlpageheader name="headerOdd">
<div style="text-align: right;">奇数页标题</div>
</htmlpageheader>
<htmlpageheader name="headerEven">
<div style="text-align: left;">偶数页标题</div>
</htmlpageheader>
<!-- 定义奇偶页脚 -->
<htmlpagefooter name="footerOdd">
<div style="text-align: right;">第{PAGENO}页</div>
</htmlpagefooter>
<htmlpagefooter name="footerEven">
<div style="text-align: left;">第{PAGENO}页</div>
</htmlpagefooter>
<!-- 文档内容 -->
<p>普通内容页面会显示页眉页脚</p>
<div class="no-headers">
<p>这部分内容不会有页眉显示</p>
</div>
</body>
</html>';
$mpdf->WriteHTML($html);
$mpdf->Output();
最佳实践建议
-
保持一致性:文档中的页面样式变化不宜过多,保持统一的视觉风格
-
合理使用命名页面:为不同类型的页面内容(如目录、章节、附录)定义不同的页面样式
-
注意边距计算:页面框边距是向内计算的,与常规CSS盒模型不同
-
测试输出效果:复杂的页面布局应在不同尺寸的纸张上测试输出效果
-
性能考虑:过多的页面样式变化可能会增加处理时间和文件大小
通过合理运用MPDF的@page规则,开发者可以实现高度定制化的PDF文档布局,满足各种专业排版需求。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0155- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112
热门内容推荐
项目优选
收起
暂无描述
Dockerfile
733
4.76 K
deepin linux kernel
C
31
16
Ascend Extension for PyTorch
Python
652
797
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.25 K
155
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.1 K
611
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.01 K
1.01 K
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
147
237
昇腾LLM分布式训练框架
Python
168
200
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
434
395
暂无简介
Dart
987
253