How to Generate PDF Programmatically in Magento 2?

In a Magento 2 store, the store admin generally likes to share their store data. Whether it is an invoice to be shared with a customer or some quotations to be shared with potential visitors. PDF is the most preferred format to share the data as it is easier to view the content on any device with this format. When it comes to security, PDF is a trusted platform for security as it comes with password protection.

Magento 2 does bring in the default methods to generate PDF files but those aren't flexible enough to get the work done with ease. Therefore, we thought it'd be great to help with a method to programmatically generate PDF in Magento 2. This method will let you generate the PDF regardless of the type of store data, be it grid or invoice or customer data etc.

All you'd be required to do is, to implement the below code in your controller action file:

<?php
namespace Vendor\Extension\Controller\Index;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\Response\Http\FileFactory;
class Index extends Action
{
    protected $fileFactory;
 
    public function __construct(
        Context $context,
        FileFactory $fileFactory
    ) {
        $this->fileFactory = $fileFactory;
        parent::__construct($context);
    }
    public function execute()
    {
        $pdf = new \Zend_Pdf();
        $pdf->pages[] = $pdf->newPage(\Zend_Pdf_Page::SIZE_A4);
        $page = $pdf->pages[0]; // this will get reference to the first page.
        $style = new \Zend_Pdf_Style();
        $style->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0));
        $font = \Zend_Pdf_Font::fontWithName(\Zend_Pdf_Font::FONT_TIMES);
        $style->setFont($font,15);
        $page->setStyle($style);
        $width = $page->getWidth();
        $hight = $page->getHeight();
        $x = 30;
        $pageTopalign = 700; 
        $this->y = 700 - 100; 
        
        $style->setFont($font,15);
        $page->setStyle($style);
        $page->drawRectangle(30, $this->y + 10, $page->getWidth()-30, $this->y +70, \Zend_Pdf_Page::SHAPE_DRAW_STROKE);
        
        $style->setFont($font,15);
        $page->setStyle($style);
        $page->drawText(__("Cutomer Details"), $x + 5, $this->y+50, 'UTF-8');
        $style->setFont($font,11);
        $page->setStyle($style);
        $page->drawText(__("Name : %1", "Test MageDelight"), $x + 5, $this->y+33, 'UTF-8');
        $page->drawText(__("Email : %1","[email protected]
"), $x + 4, $this->y+15, 'UTF-8');
        $style->setFont($font,11);
        $page->setStyle($style);
        $page->drawText(__("PRODUCT NAME"), $x + 60, $this->y-10, 'UTF-8');
        $page->drawText(__("PRODUCT PRICE"), $x + 200, $this->y-10, 'UTF-8');
        $page->drawText(__("QTY"), $x + 310, $this->y-10, 'UTF-8');
        $page->drawText(__("SUB TOTAL"), $x + 440, $this->y-10, 'UTF-8');
        $style->setFont($font,10);
        $page->setStyle($style);
        $add = 9;
        $page->drawText("$12.00", $x + 210, $this->y-30, 'UTF-8');
        $page->drawText(10, $x + 330, $this->y-30, 'UTF-8');
        $page->drawText("$120.00", $x + 470, $this->y-30, 'UTF-8');
        $pro = "TEST product";
        $page->drawText($pro, $x + 65, $this->y-30, 'UTF-8');
        $page->drawRectangle(30, $this->y -62, $page->getWidth()-30, $this->y + 10, \Zend_Pdf_Page::SHAPE_DRAW_STROKE);
        $page->drawRectangle(30, $this->y -62, $page->getWidth()-30, $this->y - 100, \Zend_Pdf_Page::SHAPE_DRAW_STROKE);
        $style->setFont($font,15);
        $page->setStyle($style);
        $page->drawText(__("Total : %1", "$50.00"), $x + 435, $this->y-85, 'UTF-8');
        $style->setFont($font,10);
        $page->setStyle($style);
        $page->drawText(__("Test Footer example"), ($page->getWidth()/2)-50, $this->y-200);
        $fileName = 'magedelight.pdf';
        $this->fileFactory->create(
           $fileName,
           $pdf->render(),
           \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR, // this pdf will be saved in var directory with the name magedelight.pdf
           'application/pdf'
        );
    }
}

We hope this way of generating PDFs helped you communicate better with your customer and offer a better experience in your store. If you face any issues while implementing, our Magento 2 Experts will be happy to help. Feel free to reach us out.