Getting output from a class
Class-based PDFs are designed to abstract away calls to stream
, download
and inline
to cover 99% of use-cases, which would typically involve a scenario in which a PDF is generated and returned to the browser in a controller.
However, it's also possible to be explicit about it by calling the individual methods, just like you would on an Output
instance.
No build-step
The first thing to note is that there is no build step when using the class-based approach. Builds are handled automatically, as and when needed.
Ineferred return (common use-case)
Once you have a PDF class ready to use, you can instantiate it and then return it in your controller.
use App\Models\TaxInvoice;
use App\PDFs\TaxInvoicePDF;
class ViewTaxInvoicePDF
{
public function __invoke(TaxInvoice $invoice)
{
return new TaxInvoicePDF($invoice);
}
}
This works because the base PDF
class is Responsable
, meaning that Laravel will call toResponse
for you, and this method will automatically build and stream the PDF.
It is also possible to call toResponse
manually.
$pdf = new TaxInvoicePDF($invoice);
return $pdf->toResponse($request);
Default stream mode
By default, returned class instances will stream inline to the browser.
If you want to force a download instead, then you need only override the streamMode
method on your class:
use WeasyPrint\Enums\StreamMode;
class TaxInvoicePDF extends PDF
{
// …
public function streamMode(): StreamMode
{
return StreamMode::DOWNLOAD;
}
}
Direct return
You can also call stream
, download
or inline
directly:
use WeasyPrint\Enums\StreamMode;
$pdf = new TaxInvoicePDF($invoice);
return $pdf->stream(StreamMode::DOWNLOAD);
return $pdf->stream(StreamMode::INLINE);
// OR
return $pdf->download();
return $pdf->inline();