John Davidson

php - TCPDF with different rendering classes and merging

0 comments
Message:


currently I'm rendering PDFs with TCPDF in Laravel 9 (PHP8.1) for labels for products. The PDF contains many pages, depends on the selected products. I start a TCPDF and do a addPage() per product and output() at the end.


Now I got a request to change the content abit for different kind of products. So I would like to create classes for the different product types. But I still need to be able to get one PDF file at the end. I would like to avoid to save the PDF as a file since it's always a download anyway.


But how to merge PDF-pages from different classes?


I was using FPDF/FPDI in the past but I would like to avoid adding to many old PDF libs to Laravel and they might not work with PHP8.1. I also only know for FPDI the way to load a PDF file from disk (setSourceFile()) for merging, which is not, what I need.


Is there a good way with TCPDF to add the flexibility?



My Answer:
One way to achieve this with TCPDF is to create separate TCPDF instances for each product type and then merge the pages from each instance into a single PDF file. Here's a basic outline of how you can do this:

1. Create separate rendering classes for each product type, each extending TCPDF:

php
class ProductType1PDF extends TCPDF {
// Add custom rendering logic for product type 1
}

class ProductType2PDF extends TCPDF {
// Add custom rendering logic for product type 2
}


2. In your controller or service, instantiate the appropriate rendering class for each product type and render the PDF pages:

php
$product1PDF = new ProductType1PDF();
$product1PDF->AddPage();
// Add content for product type 1

$product2PDF = new ProductType2PDF();
$product2PDF->AddPage();
// Add content for product type 2

// Output PDF for product type 1
$pdf1Data = $product1PDF->Output('', 'S');

// Output PDF for product type 2
$pdf2Data = $product2PDF->Output('', 'S');


3. Merge the PDF pages from each product type into a single PDF file using TCPDF's `importPage()` method:

php
$mergedPDF = new TCPDF();
$mergedPDF->setPrintHeader(false);
$mergedPDF->setPrintFooter(false);

// Import pages from product type 1 PDF
$pages = $mergedPDF->importPages($pdf1Data);
foreach ($pages as $page) {
$mergedPDF->AddPage();
$mergedPDF->useTemplate($page);
}

// Import pages from product type 2 PDF
$pages = $mergedPDF->importPages($pdf2Data);
foreach ($pages as $page) {
$mergedPDF->AddPage();
$mergedPDF->useTemplate($page);
}

// Output the merged PDF
$mergedPDFData = $mergedPDF->Output('', 'S');


4. Finally, you can return the merged PDF data as a download to the user:

php
return response($mergedPDFData)
->header('Content-Type', 'application/pdf')
->header('Content-Disposition', 'attachment; filename="merged.pdf"');


This approach allows you to maintain separate rendering logic for each product type while still being able to merge the PDF pages into a single file for download.

Rate this post

3 of 5 based on 1486 votes

Comments




© 2024 Hayatsk.info - Personal Blogs Platform. All Rights Reserved.
Create blog  |  Privacy Policy  |  Terms & Conditions  |  Contact Us