text: <?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;
      }
  }
  