I am trying to display Gift Message for individual Item on Invoice PDF Admin Backend Sales Order Grid.
Below same code is working for me if you open an order from Sales Order Grid for Individual Items but not working in Invoice print PDF class.
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice" type="Vendor\Module\Model\Order\Pdf\Items\Invoice\DefaultInvoice" />
</config>
Vendor\Module\Model\Order\Pdf\Items\Invoice\DefaultInvoice.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Vendor\Module\Model\Order\Pdf\Items\Invoice;
use Magento\GiftMessage\Api\OrderItemRepositoryInterface;
/**
* Sales Order Invoice Pdf default items renderer
*/
class DefaultInvoice extends \Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice
{
/**
* Core string
*
* @var \Magento\Framework\Stdlib\StringUtils
*/
protected $string;
protected $orderItemGiftRepo;
private $logger;
/**
* @param \Magento\Framework\Model\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Tax\Helper\Data $taxData
* @param \Magento\Framework\Filesystem $filesystem
* @param \Magento\Framework\Filter\FilterManager $filterManager
* @param \Magento\Framework\Stdlib\StringUtils $string
* @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
* @param array $data
*/
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Tax\Helper\Data $taxData,
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\Filter\FilterManager $filterManager,
\Magento\Framework\Stdlib\StringUtils $string,
\Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
OrderItemRepositoryInterface $orderItemGiftRepo,
\Psr\Log\LoggerInterface $logger,
array $data = []
) {
$this->string = $string;
$this->orderItemGiftRepo = $orderItemGiftRepo;
$this->logger = $logger;
parent::__construct(
$context,
$registry,
$taxData,
$filesystem,
$filterManager,
$string,
$resource,
$resourceCollection,
$data
);
}
/**
* Draw item line
*
* @return void
*/
public function draw()
{
$order = $this->getOrder();
$item = $this->getItem();
$pdf = $this->getPdf();
$page = $this->getPage();
$giftWrap = $this->getGiftMessages($order->getId(),$item->getId());
$this->logger->info("GiftData".json_encode($giftWrap));
$lines = [];
$giftItem = "<br/>"."<b style='color:red;'>Test Products</b>";
// draw Product name
$lines[0] = [['text' => $this->string->split($item->getName().$giftItem, 35, true, true), 'feed' => 35]];
// draw GiftWrap Message
//$lines[0] = [['text' => $this->string->split("TestProduct", 20, true, true), 'feed' => 20]];
// draw SKU
$lines[0][] = [
'text' => $this->string->split($this->getSku($item), 17),
'feed' => 290,
'align' => 'right',
];
// draw QTY
$lines[0][] = ['text' => $item->getQty() * 1, 'feed' => 435, 'align' => 'right'];
// draw item Prices
$i = 0;
$prices = $this->getItemPricesForDisplay();
$feedPrice = 395;
$feedSubtotal = $feedPrice + 170;
foreach ($prices as $priceData) {
if (isset($priceData['label'])) {
// draw Price label
$lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedPrice, 'align' => 'right'];
// draw Subtotal label
$lines[$i][] = ['text' => $priceData['label'], 'feed' => $feedSubtotal, 'align' => 'right'];
$i++;
}
// draw Price
$lines[$i][] = [
'text' => $priceData['price'],
'feed' => $feedPrice,
'font' => 'bold',
'align' => 'right',
];
// draw Subtotal
$lines[$i][] = [
'text' => $priceData['subtotal'],
'feed' => $feedSubtotal,
'font' => 'bold',
'align' => 'right',
];
$i++;
}
// draw Tax
$lines[0][] = [
'text' => $order->formatPriceTxt($item->getTaxAmount()),
'feed' => 495,
'font' => 'bold',
'align' => 'right',
];
// custom options
$options = $this->getItemOptions();
if ($options) {
foreach ($options as $option) {
// draw options label
$lines[][] = [
'text' => $this->string->split($this->filterManager->stripTags($option['label']), 40, true, true),
'font' => 'italic',
'feed' => 35,
];
// Checking whether option value is not null
if ($option['value'] !== null) {
if (isset($option['print_value'])) {
$printValue = $option['print_value'];
} else {
$printValue = $this->filterManager->stripTags($option['value']);
}
$values = explode(', ', $printValue);
foreach ($values as $value) {
$lines[][] = ['text' => $this->string->split($value, 30, true, true), 'feed' => 40];
}
}
}
}
$lineBlock = ['lines' => $lines, 'height' => 20];
$page = $pdf->drawLineBlocks($page, [$lineBlock], ['table_header' => true]);
$this->setPage($page);
}
public function getGiftMessages($order_id,$itemId) {
$this->logger->info("order_id".$order_id);
$this->logger->info("itemId".$itemId);
$order_id = $order_id;
$giftMessage = array();
try{
$giftItems = !empty($this->orderItemGiftRepo->get($order_id, $itemId)) ? $this->orderItemGiftRepo->get($order_id, $itemId) : null;
if($giftItems):
$giftMessage['message'] = $giftItems->getMessage();
$giftMessage['recipient'] = $giftItems->getRecipient();
$giftMessage['sender'] = $giftItems->getSender();
endif;
} catch (\Exception $e) {
return null;
}
return $giftMessage;
}
}
If any idea, please suggest me. Thanks in Advance..!!