
本文介绍了如何使用 Laravel MPDF 扩展包生成包含多个 Blade 视图的 PDF 文档。通过循环遍历视图数组,并利用 `AddPage()` 和 `WriteHTML()` 方法,可以将多个视图的内容添加到同一个 PDF 文件中,从而实现多页 PDF 文档的生成。
在使用 Laravel MPDF 生成 PDF 文档时,有时需要将多个 Blade 视图的内容合并到一个 PDF 文件中,例如生成包含多个页面的报告。默认情况下,PDF::loadView() 方法只能加载一个视图。本文将介绍一种通过循环加载视图并手动添加页面的方法,来实现多页 PDF 文档的生成。
实现方法
核心思路是:首先加载第一个视图,然后循环遍历剩余的视图,每次循环都添加一个新的页面,并将当前视图的内容写入到该页面。
以下是示例代码:
具有餐馆发布、菜式发布、信息发布、FB活动聚会和会员交流等互动功能和强大的文章发布、图片展示、下载、广告管理等网站内容管理功能。具有灵活的会员权限控制和会员管理系统;灵活的可视化模版引擎可满足个性化的美食门户建站需求;支持HTML静态页面生成和多语言支持;适于创建城市美食门户网站。v5.1版本增加了多项功能,支持了PHP5+MYSQL5环境,前台网站插件开放源码,更利于个性化的美食网站开发。
use PDF;
use Illuminate\Support\Facades\View; // 确保引入 View Facade
class ReportController extends Controller
{
public function generate_pdf()
{
// 定义模板数据
$data = ['foo' => '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(View::make($view, $data)->render());
}
return $pdf->stream('document.pdf');
}
}代码解释
- $data: 定义了传递给 Blade 视图的数据。
- $pdfPages: 是一个数组,包含了所有需要加载的 Blade 视图的文件名。每个视图对应 PDF 文档中的一页。
- $pdf: 用于存储 PDF 实例的变量。初始值为 null。
-
foreach 循环: 遍历 $pdfPages 数组,加载每个视图。
- if (is_null($pdf)): 判断 $pdf 是否为 null。如果是,说明这是第一个视图,使用 PDF::loadView() 方法加载视图并赋值给 $pdf。
- $pdf->getMpdf()->AddPage(): 在已有的 PDF 文档中添加一个新的页面。getMpdf() 方法返回底层的 mPDF 实例,然后调用 AddPage() 方法添加新页。
- $pdf->getMpdf()->WriteHTML((string)view($view, $data)): 将当前视图的 HTML 内容写入到新添加的页面。view($view, $data) 方法渲染 Blade 视图,并将其转换为字符串,然后使用 WriteHTML() 方法写入到 PDF 文档中。注意这里需要使用 View::make($view, $data)->render(),确保将视图渲染成字符串。
- return $pdf->stream('document.pdf'): 将生成的 PDF 文档以流的形式返回给浏览器,并设置文件名为 document.pdf。
注意事项
- 确保已经正确安装和配置了 mccarlosen/laravel-mpdf 扩展包。
- 确保 Blade 视图文件存在,并且路径正确。
- 可以根据实际需求调整视图数组 $pdfPages 和传递给视图的数据 $data。
- 可以自定义 PDF 文档的各种属性,例如页面大小、字体、边距等,通过修改 PDF::loadView() 方法的参数来实现。
总结
通过循环加载视图并手动添加页面的方法,可以灵活地生成包含多个 Blade 视图的 PDF 文档。这种方法适用于需要动态生成多页报告、发票等场景。理解并掌握这种方法,可以更好地利用 Laravel MPDF 扩展包来满足实际开发需求。









