Magento 2.x – create a PDF and its downloadable link
With the following code snippet, you will be able to create a link in your store, where an action is called and a custom PDF is sent to download.
Bear in mind, that first, you will need to create your action, in app\code\<vendor>\<module>\Controller\<controller>\<action>.php, extending the core \Magento\Framework\App\Action\Action .
Then, you can use the following skeleton as kickoff point for your pdfs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<?php namespace <Vendor>\<Module>\Controller\<controllername>; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; class DownloadTest 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","test@example.com"), $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' ); } } |
The following file should be brought for download.
source: https://webkul.com/blog/generate-pdf-programmatically-magento2/