
本教程旨在解决在使用 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
<!DOCTYPE html><html><head> <title>Page 1</title></head><body> <h1>This is Page 1</h1> <p>Content for page 1.</p></body></html>登录后复制
示例:resources/views/pdf/page2.blade.php
<!DOCTYPE html><html><head> <title>Page 2</title></head><body> <h1>This is Page 2</h1> <p>Content for page 2.</p></body></html>登录后复制
步骤 3:编写 Controller 代码
Q.AI视频生成工具 支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI
73 查看详情
在 Controller 中,编写生成 PDF 的逻辑。核心思路是循环遍历所有需要加载的 Blade 视图,并使用 AddPage() 方法添加新页面,然后使用 WriteHTML() 方法将视图的内容写入到 PDF 中。
<?phpnamespace App\Http\Controllers;use PDF;use Illuminate\Support\Facades\View;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((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 生成需求。
以上就是Laravel MPDF 加载多个 Blade 视图生成 PDF 文档的详细内容,更多请关注php中文网其它相关文章!
