I have created preference for Magento\Sales\Model\Order\Pdf\Invoice file inside preference Invoice class I overwrite getPdf function but it is showing below error
Exception #0 (Exception): Notice: Undefined property: Webkeon\Custompdf\Model\Order\Pdf\Invoice::$appEmulation
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Webkeon\Custompdf\Model\Order\Pdf; /** * Sales Order Invoice PDF model * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Invoice extends \Magento\Sales\Model\Order\Pdf\Invoice { /** * Draw header for item table * * @param \Zend_Pdf_Page $page * @return void */ protected function _drawHeader(\Zend_Pdf_Page $page) { /* Add table head */ $this->_setFontRegular($page, 10); $page->setFillColor(new \Zend_Pdf_Color_Rgb(0.93, 0.92, 0.92)); $page->setLineColor(new \Zend_Pdf_Color_GrayScale(0.5)); $page->setLineWidth(0.5); $page->drawRectangle(25, $this->y, 570, $this->y - 15); $this->y -= 10; $page->setFillColor(new \Zend_Pdf_Color_Rgb(0, 0, 0)); //columns headers $lines[0][] = ['text' => __('Products'), 'feed' => 35]; //$lines[0][] = ['text' => __('SKU'), 'feed' => 290, 'align' => 'right']; $lines[0][] = ['text' => __('Qty'), 'feed' => 435, 'align' => 'right']; $lines[0][] = ['text' => __('Price'), 'feed' => 360, 'align' => 'right']; $lines[0][] = ['text' => __('Tax'), 'feed' => 495, 'align' => 'right']; $lines[0][] = ['text' => __('Subtotal'), 'feed' => 565, 'align' => 'right']; $lineBlock = ['lines' => $lines, 'height' => 5]; $this->drawLineBlocks($page, [$lineBlock], ['table_header' => true]); $page->setFillColor(new \Zend_Pdf_Color_GrayScale(0)); $this->y -= 20; } /** * Return PDF document * * @param array|Collection $invoices * @return \Zend_Pdf */ public function getPdf($invoices = []) { $this->_beforeGetPdf(); $this->_initRenderer('invoice'); $pdf = new \Zend_Pdf(); $this->_setPdf($pdf); $style = new \Zend_Pdf_Style(); $this->_setFontBold($style, 10); foreach ($invoices as $invoice) { if ($invoice->getStoreId()) { $this->appEmulation->startEnvironmentEmulation( $invoice->getStoreId(), \Magento\Framework\App\Area::AREA_FRONTEND, true ); $this->_storeManager->setCurrentStore($invoice->getStoreId()); } $page = $this->newPage(); $order = $invoice->getOrder(); $this->y = 730; /* Add image */ //$this->insertLogo($page, $invoice->getStore()); /* Add address */ // $this->insertAddress($page, $invoice->getStore()); /* Add head */ $this->insertOrder( $page, $invoice, $order, $this->_scopeConfig->isSetFlag( self::XML_PATH_SALES_PDF_INVOICE_PUT_ORDER_ID, \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $order->getStoreId() ) ); $this->y -= 50; /* Add document text and number */ $this->insertDocumentNumber($page, __('Invoice # ') . $invoice->getIncrementId()); /* Add table */ $this->_drawHeader($page); /* Add body */ foreach ($invoice->getAllItems() as $item) { if ($item->getOrderItem()->getParentItem()) { continue; } /* Draw item */ $this->_drawItem($item, $page, $order); $page = end($pdf->pages); } /* Add totals */ $this->insertTotals($page, $invoice); if ($invoice->getStoreId()) { $this->appEmulation->stopEnvironmentEmulation(); } } $this->_afterGetPdf(); return $pdf; } }
Hello @webkeonsanjeev
Correct the Custom Class
namespace Webkeon\Custompdf\Model\Order\Pdf; use Magento\Sales\Model\Order\Pdf\Invoice as BaseInvoice; use Magento\Framework\App\State; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Sales\Model\ResourceModel\Order\Invoice\CollectionFactory; class Invoice extends BaseInvoice { /** * Custom Invoice constructor. * * @param State $appState * @param \Magento\Framework\Filesystem $filesystem * @param DirectoryList $directoryList * @param CollectionFactory $invoiceCollectionFactory * @param \Magento\Store\Model\App\Emulation $appEmulation * @param \Magento\Framework\Translate\Inline\StateInterface $translateInline * @param \Magento\Sales\Model\Order\Pdf\Config $pdfConfig * @param \Magento\Sales\Model\Order\Pdf\Total\Factory $pdfTotalFactory * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate * @param array $data */ public function __construct( State $appState, \Magento\Framework\Filesystem $filesystem, DirectoryList $directoryList, CollectionFactory $invoiceCollectionFactory, \Magento\Store\Model\App\Emulation $appEmulation, \Magento\Framework\Translate\Inline\StateInterface $translateInline, \Magento\Sales\Model\Order\Pdf\Config $pdfConfig, \Magento\Sales\Model\Order\Pdf\Total\Factory $pdfTotalFactory, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, array $data = [] ) { parent::__construct( $appState, $filesystem, $directoryList, $invoiceCollectionFactory, $appEmulation, $translateInline, $pdfConfig, $pdfTotalFactory, $localeDate, $data ); } /** * Override the getPdf function * @param array $invoices * @return \Zend_Pdf */ public function getPdf($invoices = []) { // Your custom logic here return parent::getPdf($invoices); } }
Verify di.xml
php bin/magento setup:di:compile
php bin/magento cache:flush
Hope it helps !
If you find our reply helpful, please give us kudos.
A Leading Magento Development Agency That Delivers Powerful Results, Innovation, and Secure Digital Transformation.
WebDesk Solution Support Team
Get a Free Quote | | Adobe Commerce Partner | Hire Us | Call Us 877.536.3789
Thank You,
WebDesk Solution Support Team
Get a Free Quote | Email | Adobe Commerce Partner | Hire Us | Call Us 877.536.3789
Location: 150 King St. W. Toronto, ON M5H 1J9