Dompdf stream() Not Rendering Properly and Returning Random Characters Laravel 8

Viewed 272

I am generating a pdf file and am trying to preview it using stream() as well as attach it to an email.

When I try to stream() the pdf using the code:

function previewPDF(Request $request) {
       $pdfData = $this->getPDFData($request);
       $domainData = $this->getDomainData($request);
       $hourSumData = $this->getHourSumData($request);
       $userData = Auth::user();
       
       $pdf = PDF::loadView('trackerPDF', ['pdfData' => $pdfData, 'domainData' => $domainData, 'hourSumData' => $hourSumData, 'userData' => $userData]);

       return $pdf->stream("mypdf.pdf");
   }

I get the following:

dompdfissue

However, it seems that the pdf should be generating correctly as I am able to generate and attach the pdf to an email with no issues using this:

function pdf(Request $request) {

        $messages = [
            'recipientname.required' => "The Recipient's Name is required field is required.",
            'recipientemail.required' => "The Recipient's Email is required field is required.",
            'recipientemail.email' => "The Recipient's Email must be a valid email address.",
        ];
        
        Validator::make($request->all(), [
            'recipientemail' => ['required','email'],
            'recipientname' => ['required'],
        ], $messages)->validate();

        $pdfData = $this->getPDFData($request);
        $domainData = $this->getDomainData($request);
        $hourSumData = $this->getHourSumData($request);
        $userData = Auth::user();

        $pdf = PDF::loadView('trackerPDF', ['pdfData' => $pdfData, 'domainData' => $domainData, 'hourSumData' => $hourSumData, 'userData' => $userData]);

        /*Emailing stuff*/
        $data["title"] = "Professional Development From ". (string)Auth::user()->name;
        $data["body"] = (string)$request->emailmessage;
        $data["recipientname"] = (string)$request->recipientname;
        $data["toaddress"] = (string)$request->recipientemail;
        $data["ccaddress"] = (string)Auth::user()->email;
        $data["fromname"] = (string)Auth::user()->name;
        $data["credentials"] = str_replace(array("[", "]", "\"", "\\"), "", (string)Auth::user()->designation);

        if ( $request->sendtoself) {
            Mail::send('emailtemplates.trackeremail', $data, function($message)use($data, $pdf) {
                $message->to($data["toaddress"])
                        ->cc($data["ccaddress"])
                        ->subject($data["title"])
                        ->attachData($pdf->output(), "Professional Development Tracker.pdf");
            });
        } else {
            Mail::send('emailtemplates.trackeremail', $data, function($message)use($data, $pdf) {
                $message->to($data["toaddress"])
                        ->subject($data["title"])
                        ->attachData($pdf->output(), "Professional Development Tracker.pdf");
            });
        }

  
        return redirect()->route('tracker')
                    ->with('message', 'Email Sent Successfully.');
    }

I am using Jetstream with Interia.js & Vue.js.

Here is my route:

Route::middleware(['auth:sanctum', 'verified'])->post('tracker/preview-pdf', 
[DynamicPDFController::class, 'previewPDF']);

And how I am posting the form in the Vue page:

previewPDF() {
      this.$inertia.post("/tracker/preview-pdf", this.form);
    },

All of the data is loaded the exact same way. I have searched but cannot figure out what I am doing wrong, any help or direction would be appreciated.

1 Answers

Don't use inertia routing for this purpose, use <a></a> tag.

In TrackerController;

public function pdf($id){
  //Using domPdf
  $data = []; //get data using $id
  $pdf = App::make('dompdf.wrapper');
  $pdf->loadView('print_view_file', compact('data''));
  return $pdf->stream();
};

Now in Page.vue use;

 <a :href="route('tracker.pdf', tracker.id)" 
 target="__blank">Print</a>

This will open new tab and stream the pdf file.

Related