0

In generated pdf for the invoice, I have the name of the products overlapping the SKU column , I have changed some code but I don't really know how to get rid of this problem , if anyone can help me to align the SKU from product's rows, it will be appreciated, thanks in advance.

1 Answer 1

1

Based on your explanation you might have used a custom module overriding InvoicePdf , plase use this code on your Overriden InvoicePDF page. Or if you didn't override , please paste this code in the below path.

vendor\magento\module-sales\Model\Order\Pdf\Invoice.php

    <?php
    /**
     * Copyright © Magento, Inc. All rights reserved.
     * See COPYING.txt for license details.
     */
    namespace Magento\Sales\Model\Order\Pdf;

    use Magento\Sales\Model\ResourceModel\Order\Invoice\Collection;

    /**
     * Sales Order Invoice PDF model
     * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
     */
    class Invoice extends AbstractPdf
    {
        /**
         * @var \Magento\Store\Model\StoreManagerInterface
         */
        protected $_storeManager;

        /**
         * @var \Magento\Framework\Locale\ResolverInterface
         */
        protected $_localeResolver;

        /**
         * @param \Magento\Payment\Helper\Data $paymentData
         * @param \Magento\Framework\Stdlib\StringUtils $string
         * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
         * @param \Magento\Framework\Filesystem $filesystem
         * @param Config $pdfConfig
         * @param \Magento\Sales\Model\Order\Pdf\Total\Factory $pdfTotalFactory
         * @param \Magento\Sales\Model\Order\Pdf\ItemsFactory $pdfItemsFactory
         * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate
         * @param \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation
         * @param \Magento\Sales\Model\Order\Address\Renderer $addressRenderer
         * @param \Magento\Store\Model\StoreManagerInterface $storeManager
         * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
         * @param array $data
         *
         * @SuppressWarnings(PHPMD.ExcessiveParameterList)
         */
        public function __construct(
            \Magento\Payment\Helper\Data $paymentData,
            \Magento\Framework\Stdlib\StringUtils $string,
            \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
            \Magento\Framework\Filesystem $filesystem,
            Config $pdfConfig,
            \Magento\Sales\Model\Order\Pdf\Total\Factory $pdfTotalFactory,
            \Magento\Sales\Model\Order\Pdf\ItemsFactory $pdfItemsFactory,
            \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
            \Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
            \Magento\Sales\Model\Order\Address\Renderer $addressRenderer,
            \Magento\Store\Model\StoreManagerInterface $storeManager,
            \Magento\Framework\Locale\ResolverInterface $localeResolver,
            array $data = []
        ) {
            $this->_storeManager = $storeManager;
            $this->_localeResolver = $localeResolver;
            parent::__construct(
                $paymentData,
                $string,
                $scopeConfig,
                $filesystem,
                $pdfConfig,
                $pdfTotalFactory,
                $pdfItemsFactory,
                $localeDate,
                $inlineTranslation,
                $addressRenderer,
                $data
            );
        }

        /**
         * 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->_localeResolver->emulate($invoice->getStoreId());
                    $this->_storeManager->setCurrentStore($invoice->getStoreId());
                }
                $page = $this->newPage();
                $order = $invoice->getOrder();
                /* Add image */
                $this->insertLogo($page, $invoice->getStore());
                /* Add address */
                $this->insertAddress($page, $invoice->getStore());
                /* Add head */
                $this->insertOrder(
                    $page,
                    $order,
                    $this->_scopeConfig->isSetFlag(
                        self::XML_PATH_SALES_PDF_INVOICE_PUT_ORDER_ID,
                        \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
                        $order->getStoreId()
                    )
                );
                /* 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->_localeResolver->revert();
                }
            }
            $this->_afterGetPdf();
            return $pdf;
        }

        /**
         * Create new page and assign to PDF object
         *
         * @param  array $settings
         * @return \Zend_Pdf_Page
         */
        public function newPage(array $settings = [])
        {
            /* Add new table head */
            $page = $this->_getPdf()->newPage(\Zend_Pdf_Page::SIZE_A4);
            $this->_getPdf()->pages[] = $page;
            $this->y = 800;
            if (!empty($settings['table_header'])) {
                $this->_drawHeader($page);
            }
            return $page;
        }
    }

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.