简体   繁体   中英

Attach PDF file to email with DOMPDF in Laravel

I'm using my MyEmail model to attach a PDF file to it. The mail gets sent with all the data I want and a PDF gets attached but it is empty, how can I import my layout and data into the PDF if I attach?

<?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]);
    }
}

Here's the function to send the email my controller:

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;
    
}

The PDF also requires a view, like so:

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

Where the view looks like this:

<?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>

So i recommend first creating the PDF, and only then attaching it to the email

Keep in mind this is very specific to our own use case and you will need to modify this.

If you are using barryvdh/laravel-dompdf package, you can simply use loadView() function, that takes your .blade file and the data you want. Inside that blade, you will generate PDF layout and inject your variables. Simple example would be something like this:

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

You can now use this $name variable in your pdf.blade file:

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

After you generate the pdf with desired layout and data, you can attach it to Mail class like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM