Dompdf stream() не отображается должным образом и возвращает случайные символы Laravel 8

#php #laravel #vue.js #dompdf #inertiajs

#php #laravel #vue.js #dompdf #inertiajs

Вопрос:

Я создаю PDF-файл и пытаюсь просмотреть его, используя stream() , а также прикрепить его к электронной почте.

Когда я пытаюсь stream() использовать PDF-файл с помощью кода:

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

 

Я получаю следующее:

dompdfissue

Однако, похоже, что PDF-файл должен генерироваться правильно, поскольку я могу сгенерировать и прикрепить PDF-файл к электронному письму без проблем, используя это:

 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.');
    }
 

Я использую Jetstream с Interia.js amp; Vue.js .

Вот мой маршрут:

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

И как я размещаю форму на странице Vue:

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

Все данные загружаются точно так же. Я искал, но не могу понять, что я делаю неправильно, любая помощь или направление будут оценены.

Ответ №1:

Не используйте инерционную маршрутизацию для этой цели, используйте <a></a> tag .

В 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();
};
 

Теперь Page.vue используется;

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

Откроется новая вкладка и будет транслироваться PDF-файл.