PDF-Rendering of Product-Detail-Pages
PDF-Rendering of Product-Detail-Pages
we need a PDF-Version for Product-Detail pages.
A Product-Detail URL looks like desireisen.de/reise/2685755-ostseeurlaub-vom-feinsten---sant-royale-ruegen-resort.
In order to render a PDF, a new Query-Param have to be implementened.
e.g.: desireisen.de/reise/2685755-ostseeurlaub-vom-feinsten---sant-royale-ruegen-resort?pdf=true
The query-param should be configureable in Catalog Reader-Settings. If the pdf-query-param is present, the ReaderWidget must render a PDF and return the resulting PDF-File as File-Download.
A common Reader-Template is not suitable for PDF-Printing (JavaScript and mobile-constraints), therefore we need a Reader-Template for the PDF-Version. Besides the existing reader_template, we need a "reader_pdf_template"-Selection.
Implementation:
- PDF-Render engine
add chrome-php/chrome to tscatalog
- migrate 2 new Database-Columns (text and varchar): "reader_pdf_template" (the Template for the PDF-Version) and "pdf_query_param" (whether the Reader-Widget should return a PDF-File instead of html)
- create a new blank Migration: cd wp-content/plugins/travelsellercatalog && yii migrate/create 'add_Pdf_Rendering_Cols'
- look here for examples
- execute the migration:
yii migrate - undo migration:
yii migrate down 1
- in ReaderWidget, check query-params for existence of $pdf_query_param, if so:
- render reader_pdf_template as html and pass it to chrome
- stream PDF as Download to Browser (e.g.:
return Yii::$app->response->sendFile($pdfFile,'myfile.pdf')->send())
A basic Implementation for a "renderPDF()" could be:
<?php
// app/widgets/shortcode/RenderReader.php
declare(strict_types=1);
namespace ts\catalog\widgets\shortcode;
use HeadlessChromium\BrowserFactory;
use SplFileInfo;
// ...
private function renderPDF(): SplFileInfo
{
$browserFactory = new BrowserFactory('/usr/bin/chromium-browser');
// starts headless chrome
$browser = $browserFactory->createBrowser();
$outputFileName = tempnam('/tmp', 'tscatalog_pdf_');
try {
// creates a new page and navigate to an URL
$page = $browser->createPage();
$page->setHtml($html);
$pdf = $page->pdf($options);
file_put_contents($outputFileName, base64_decode($pdf->getBase64()));
} finally {
// bye
$browser->close();
}
return new SplFileInfo($outputFilename);
}