在 Laravel 中使用 DOMPDF 将 PDF 文件附加到电子邮件

Attach PDF file to email with DOMPDF in Laravel

我正在使用我的 MyEmail 模型将 PDF 文件附加到它。邮件中包含我想要的所有数据并附有 PDF,但它是空的,如果我附上附件,如何将我的布局和数据导入 PDF?

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Course;
use Barryvdh\DomPDF\PDF;

class MyEmail extends Mailable {
    use Queueable, SerializesModels;
    public $data;
    public $course;
    private $pdf;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($data, Course $course) {
        $this->course = $course;
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build() {
        return $this->subject('Thanks')->view('emails.my_email')->attachData($this->pdf, 'my_pdf.pdf')->with(['data' => $this->data, 'course' => $this->course]);
    }
}

这是向我的控制器发送电子邮件的函数:

public function sendMail(Request $request) {

    $data = array(
        'first_name'        => $request->first_name,
        'last_name'         => $request->last_name,
        'id'                => $request->id,
        'course_id'         => $request->course_id,
    );

    $resultJson = $this->validateRecaptcha($request);

    $course= Course::where('id', $data['course_id'])->first();

    if($resultJson->success != true) :
        return redirect()->back()->with(['success' => 'success']);
    else :
        \Mail::to($request->email)
             ->cc('my@*******')
             ->queue(
            new Mail\MyEmail($data, $course)
        );
        return redirect()->back()->with(['success' => 'Success!']);
    endif;
    
}

PDF 还需要一个视图,如下所示:

// creating the pfd:
$pdf = PDF::loadView('pdf.multiple_pages', [
            'pages' => $this->pages,
            'title' => $this->options->get('documentName'),
        ]);

视图看起来像这样:

<?php

$imgPath = public_path('store/assets/images/new_logo.png');
$img = base64_encode(file_get_contents($imgPath));
?>
<html lang="{{ app()->getLocale() }}">
<head>
    <title>{{ $title ?? 'document' }}</title>

</head>
<body>
<style>
    @php
        include(public_path('/css/pdf/multiple_pages.css'))
    @endphp

    div.page {
        background-image: url("data:image/png;base64, {{ $img }}");
    }
</style>
@foreach($pages as $page)
    <div class="page">
        {!! html_entity_decode($page) !!}
    </div>
@endforeach
</body>
</html>

所以我建议先创建 PDF,然后再将其附加到电子邮件中

请记住,这是针对我们自己的用例的,您需要对其进行修改。

如果您正在使用 barryvdh/laravel-dompdf package, you can simply use loadView() 函数,它会获取您的 .blade 文件和您想要的数据。在 blade 中,您将生成 PDF 布局并注入您的变量。简单的例子是这样的:

$name = 'John';
$pdf = PDF::loadView('your_view', $name);

您现在可以在 pdf 中使用这个 $name 变量。blade 文件:

<h1>Hi {{name}}</h1>

生成具有所需布局和数据的 pdf 后,您可以将其附加到邮件 class,如下所示:

->attachData($pdf->output(), 'your_file_name');