
本教程旨在解决在使用 Laravel MPDF 扩展包生成 PDF 文档时,如何加载多个 Blade 视图并将其合并到单个 PDF 文件中的问题。通过循环遍历视图并使用 `AddPage()` 和 `WriteHTML()` 方法,可以轻松实现多页面 PDF 文档的生成。
在使用 Laravel 开发 Web 应用时,经常需要生成 PDF 报告或文档。mccarlosen/laravel-mpdf 是一个流行的 Laravel 扩展包,它基于 mPDF 库,能够方便地生成 PDF 文件。然而,该扩展包的默认用法通常只允许从单个 Blade 视图生成 PDF。如果需要将多个 Blade 视图合并到一个 PDF 文件中(例如,每一页使用不同的视图),则需要进行一些额外的处理。
以下是如何使用 Laravel MPDF 加载多个 Blade 视图生成 PDF 文档的详细步骤和示例代码:
步骤 1:安装 Laravel MPDF 扩展包
如果尚未安装,请使用 Composer 安装 mccarlosen/laravel-mpdf 扩展包:
composer require mccarlosen/laravel-mpdf
安装完成后,需要发布配置文件 (可选):
php artisan vendor:publish --tag=laravel-mpdf
步骤 2:创建 Blade 视图文件
创建需要合并到 PDF 文档中的 Blade 视图文件。例如,创建 resources/views/pdf/page1.blade.php,resources/views/pdf/page2.blade.php 和 resources/views/pdf/page3.blade.php。
示例:resources/views/pdf/page1.blade.php
Page 1
This is Page 1
Content for page 1.
示例:resources/views/pdf/page2.blade.php
Page 2
This is Page 2
Content for page 2.
MediPro城市美食门户网站系统
具有餐馆发布、菜式发布、信息发布、FB活动聚会和会员交流等互动功能和强大的文章发布、图片展示、下载、广告管理等网站内容管理功能。具有灵活的会员权限控制和会员管理系统;灵活的可视化模版引擎可满足个性化的美食门户建站需求;支持HTML静态页面生成和多语言支持;适于创建城市美食门户网站。v5.1版本增加了多项功能,支持了PHP5+MYSQL5环境,前台网站插件开放源码,更利于个性化的美食网站开发。
下载
步骤 3:编写 Controller 代码
在 Controller 中,编写生成 PDF 的逻辑。核心思路是循环遍历所有需要加载的 Blade 视图,并使用 AddPage() 方法添加新页面,然后使用 WriteHTML() 方法将视图的内容写入到 PDF 中。
'bar'];
// 定义所有视图 (每个视图对应一页)
$pdfPages = [
'pdf.page1',
'pdf.page2',
'pdf.page3'
];
$pdf = null;
// 循环所有视图
foreach ($pdfPages as $view) {
// 如果 PDF 实例尚未定义,则创建第一个页面
if (is_null($pdf)) {
$pdf = PDF::loadView($view, $data);
continue;
}
// 添加新页面,并将视图的 HTML 内容写入到该页面
$pdf->getMpdf()->AddPage();
$pdf->getMpdf()->WriteHTML((string)View::make($view, $data));
}
return $pdf->stream('document.pdf');
}
}代码解释:
- $data = ['foo' => 'bar'];: 定义传递给 Blade 视图的数据。
- $pdfPages = ['pdf.page1', 'pdf.page2', 'pdf.page3'];: 定义一个数组,其中包含所有需要加载的 Blade 视图的文件名。
- $pdf = null;: 初始化 PDF 实例为 null。
- foreach ($pdfPages as $view): 循环遍历 $pdfPages 数组,处理每个视图。
- if (is_null($pdf)): 检查 PDF 实例是否已经创建。如果尚未创建,则使用 PDF::loadView() 方法加载第一个视图,并将其作为 PDF 的第一页。
- $pdf->getMpdf()->AddPage();: 对于后续的视图,首先使用 AddPage() 方法在 PDF 文档中添加一个新页面。
- $pdf->getMpdf()->WriteHTML((string)View::make($view, $data));: 使用 WriteHTML() 方法将视图的内容写入到新添加的页面。这里需要注意的是,View::make($view, $data) 方法用于渲染 Blade 视图,并将其转换为 HTML 字符串。
- return $pdf->stream('document.pdf');: 最后,使用 stream() 方法将生成的 PDF 文档发送到浏览器。
步骤 4:配置路由
在 routes/web.php 文件中定义路由,以便访问生成 PDF 的 Controller 方法:
Route::get('/generate-pdf', 'App\Http\Controllers\ReportController@generate_pdf');步骤 5:测试
访问 /generate-pdf 路由,即可生成包含多个 Blade 视图的 PDF 文档。
注意事项:
- 确保 Blade 视图文件存在,并且路径正确。
- WriteHTML() 方法需要接收 HTML 字符串作为参数,因此需要使用 View::make() 方法将 Blade 视图渲染为 HTML。
- 根据实际需求,可以调整 Blade 视图的内容和样式。
- 如果 PDF 文档中需要包含图片或其他资源,请确保资源路径正确。
总结:
通过循环遍历 Blade 视图,并使用 AddPage() 和 WriteHTML() 方法,可以轻松地使用 Laravel MPDF 扩展包生成包含多个页面的 PDF 文档。这种方法灵活且易于扩展,能够满足各种复杂的 PDF 生成需求。









