Reading list Switch to dark mode

    Generate PDF programmatically in Magento2

    Updated 1 April 2024

    Generate PDF programmatically in Magento2

    Today I am going to explain that how you can generate a PDF file programmatically in magento 2 in this article. So  you can apply the following code according to your requirement in any file, i.e. block, controller, model, helper, etc. I have written in controller file only for example.

    <?php
    namespace Company\Module\Controller\Index;
    
    use Magento\Framework\App\Action\Action;
    use Magento\Framework\App\Action\Context;
    
    class Index extends Action
    {
        /**
         * @var \Magento\Framework\App\Response\Http\FileFactory
         */
        protected $fileFactory;
    
        /**
         * @param Context                               $context
         */
        public function __construct(
            Context $context,
            \Magento\Framework\App\Response\Http\FileFactory $fileFactory
        ) {
            $this->fileFactory = $fileFactory;
            parent::__construct($context);
        }
    
        /**
         * to generate pdf
         *
         * @return void
         */
        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 = 850; //default PDF page height
            $this->y = 850 - 100; //print table row from page top – 100px
            //Draw table header row’s
            $style->setFont($font,16);
            $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", "John Smith"), $x + 5, $this->y+33, 'UTF-8');
            $page->drawText(__("Email : %1","[email protected]"), $x + 5, $this->y+16, 'UTF-8');
    
            $style->setFont($font,12);
            $page->setStyle($style);
            $page->drawText(__("PRODUCT NAME"), $x + 60, $this->y-10, 'UTF-8');
            $page->drawText(__("PRICE"), $x + 200, $this->y-10, 'UTF-8');
            $page->drawText(__("QUANTITY"), $x + 310, $this->y-10, 'UTF-8');
            $page->drawText(__("TOTAL"), $x + 440, $this->y-10, 'UTF-8');
    
            $style->setFont($font,10);
            $page->setStyle($style);
            $add = 9;
            $page->drawText("$10.00", $x + 210, $this->y-30, 'UTF-8');
            $page->drawText(5, $x + 330, $this->y-30, 'UTF-8');
            $page->drawText("$50.00", $x + 470, $this->y-30, 'UTF-8');
            $pro = "ABC 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(__("ABC Footer example"), ($page->getWidth()/2)-50, $this->y-200);
    
            $fileName = 'example.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 example.pdf
               'application/pdf'
            );
        }
    }

    Now when you hit above controller, i.e. module/index/index then there will be a pop up to save/open PDF file. Below is the output of above PDF:

    Hope this blog will help you to develop custom functionality in your module in a better way. Try this and if you have any query then just comment below 🙂

    Searching for an experienced
    Magento 2 Company ?
    Find out More
    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    Be the first to comment.

    Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home