#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");
}
Я получаю следующее:
Однако, похоже, что 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-файл.