
本文详解如何使用 dompdf 为 pdf 文档中的每一页单独指定纸张尺寸与方向(如前3页横向、后3页纵向),并提供可直接运行的完整 php 示例代码及关键注意事项。
本文详解如何使用 dompdf 为 pdf 文档中的每一页单独指定纸张尺寸与方向(如前3页横向、后3页纵向),并提供可直接运行的完整 php 示例代码及关键注意事项。
Dompdf 原生不支持单次 loadHtml() 渲染中动态切换多页纸张方向(即无法在一个 HTML 字符串内通过 CSS 或标签声明实现混合方向),但可通过分页加载 + 多次渲染 + 合并输出的方式优雅解决该需求。核心思路是:将每页内容拆分为独立 HTML 片段(或文件),逐页设置纸张方向、加载内容、渲染,并最终合并为一个 PDF 文件。
✅ 正确实现方式(推荐:单 PDF 文件,含混合方向页)
Dompdf 的 setPaper() 方法需在每次 loadHtml() 之前调用,且 render() 后的内容会累积到当前文档中。因此,正确做法是:
- 初始化 Dompdf 实例;
- 对每一页:
- 调用 setPaper('A4', 'landscape') 或 'portrait';
- loadHtml($html) 加载该页 HTML;
- 不立即 render(否则会覆盖前页);
- 所有页面加载完毕后统一 render —— 但注意:Dompdf 默认不允许多次 loadHtml() 后合并渲染不同方向页(v2.x+ 已支持,需确保版本 ≥ 2.0.0)。
✅ 可靠方案(兼容 Dompdf v2+):
require_once 'vendor/autoload.php';
use Dompdf\Dompdf;
// 配置 Dompdf(启用远程资源、字体等可选)
$options = new \Dompdf\Options();
$options->set('isRemoteEnabled', true);
$dompdf = new Dompdf($options);
// 定义每页配置:HTML 内容(或路径)与方向
$pages = [
['content' => file_get_contents('sayfa1.html'), 'orientation' => 'landscape'],
['content' => file_get_contents('sayfa2.html'), 'orientation' => 'landscape'],
['content' => file_get_contents('sayfa3.html'), 'orientation' => 'landscape'],
['content' => file_get_contents('sayfa4.html'), 'orientation' => 'portrait'],
['content' => file_get_contents('sayfa5.html'), 'orientation' => 'portrait'],
['content' => file_get_contents('sayfa6.html'), 'orientation' => 'portrait'],
];
// 关键:逐页加载,但仅在最后统一渲染
foreach ($pages as $index => $page) {
// 每页独立设置纸张(必须在 loadHtml 前!)
$dompdf->setPaper('A4', $page['orientation']);
// 加载 HTML(自动追加为新页)
$dompdf->loadHtml($page['content'], 'UTF-8');
}
// 所有页面加载完成后一次性渲染
$dompdf->render();
// 输出为浏览器下载(不保存附件)
$dompdf->stream('multi_orientation_output.pdf', ['Attachment' => false]);
⚠️ 注意事项:
- Dompdf 版本要求:必须使用 dompdf/dompdf:^2.0 或更高版本(旧版 v1.x 不支持多方向页叠加);
- HTML 内容纯净性:若 HTML 中含 PHP 标签(如 ),务必预处理移除,避免解析错误:
$cleanHtml = preg_replace('//s', '', $rawHtml);- CSS 页面控制:可在各 HTML 片段中使用 @page { size: landscape; } 辅助控制,但以 setPaper() 为准;
- 性能优化:如页面较多,建议启用缓存或异步生成,避免超时;
- 字体支持:中文需显式注册字体(如 Noto Sans CJK),否则乱码。
? 替代方案(生成多个 PDF 后合并)
若受环境限制无法升级 Dompdf,可先生成 6 个独立 PDF,再用 tcpdf 或 FPDI 合并。但此法复杂度高、体积大,不推荐作为首选。
✅ 总结
Dompdf 支持多页混合方向的核心在于:按顺序调用 setPaper() → loadHtml() → 最终 render()。只要确保 Dompdf 版本 ≥ 2.0,并合理组织 HTML 内容源,即可轻松生成包含横向报表页与纵向说明页的复合 PDF 文档。务必验证输出效果,尤其关注分页符、页眉页脚及中文字体渲染。











