Magento2: Как создать PDF в пользовательском модуле

8

Я хотел бы создать собственный PDF-файл после продажи и прикрепить его к электронному письму, посвященному продажам.

Я думаю, что мне нужно расширить Magento\Sales\Model\Order\Pdf\AbstractPdfдля создания PDF, но я не уверен.

Кто-нибудь делал это раньше или есть идеи, если я на правильном пути?

// редактировать:

Что касается комментариев, вот базовый макет того, как я включил http://www.fpdf.org/ в свой пользовательский модуль:

Сначала я скачал пакет fpdf. Я извлек файлы и поместил их в Helperпапку « Модули », которая теперь выглядит следующим образом:

- Helper -- font (folder) -- makefont (folder) -- FPDF.php -- Data.php

Data.php это единственный файл, который у меня уже был в этой папке, так как он содержит мой вспомогательный класс данных.

Затем я отредактировал FPDF.php и добавил к нему пространство имен моих модулей.

Я отредактировал свой вспомогательный Data.phpфайл и использую класс FPDF для своих пространств имен:

use Company\ModuleName\Helper\FPDF as FPDF;

Я определил любую информацию в формате PDF, которая мне нужна, в классе данных - вам это не нужно:

// PDF INFOS
protected $pdfFileDir = 'someDir/someSubDir/';
protected $logo1 = 'myLogo.jpg';
protected $logo2 = 'myExtraLogo.jpg';


/**
 * @var \Company\ModuleName\Helper\FPDF
 */
protected $_pdf;

и построить его

/**
 * @param \Company\ModuleName\Helper\FPDF $pdf
 * @param array $data
 */
public function __construct(
    (...)
    FPDF $pdf,
    (...)
    array $data = []
) {
    (...)
    $this->_pdf = $pdf;
    (...)
    parent::__construct($context);
}

Затем я создал свой метод и сгенерировал PDF:

public function generatePdf($productId, $someOtherVars)
{
    #start the pdf
    $pdf = new FPDF();

    $pdf->AddPage();
    $pdf->SetAutoPageBreak(0, 5);
    $pdf->SetFont('Arial', 'B', 16);

    // do your FPDF stuff here
    // eg: $pdf->Cell('', '', iconv('UTF-8', 'windows-1252', 'Page Header Title'), 0, 1);

    // $pdf->Ln(8);
    // $pdf->Cell('', '', $today, 0, 1, 'L');
    // and so forth .. see the FPDF documentation

    // render pdf
    $filename = 'somename' . $productId . '.pdf';
    $pdf->Output($this->getPdfBaseDir() . $filename, 'F');

    return $this->getPdfBaseDir() . $filename;
}

Затем вы вызываете ваш метод в вашем контроллере через вашего помощника (который вам, конечно, нужно включить):

$this->dataHelper->generatePdf($yourVars);

tecjam
источник
Вы получили что-нибудь с этим?
LM_Fielding
1
Я не пошел по этому пути в конце концов. Я пытался, но в конце концов оказалось слишком сложным, чтобы попытаться использовать класс AbstractPdf. В итоге я включил FPDF с моим модулем (в помощнике) и использовал его для генерации PDF-файлов. fpdf.org
tecjam
1
Brilliant. Вы рассматривали dompdf? github.com/dompdf/dompdf
LM_Fielding
1
Я сделал, но одна из причин, по которой я не использовал его, заключалась в том, что я не хотел сначала отображать html, а затем отображать html в pdf. Были и другие причины, но я не могу вспомнить, чем они были. Для вашего использования это может быть лучше, но только вы можете решить это.
tecjam
Здравствуйте, любые обновления по этому вопросу. Я пытаюсь сгенерировать PFD для моего пользовательского модуля - Magento2.
Дев

Ответы:

1

Вы можете использовать FPDF или TCPDF для создания PDF.

Попробуйте запустить одну из следующих команд из корневого каталога M2

composer require setasign/fpdf:1.8.1

Это добавит библиотеку fpdf в папку продавца как setasign / fpdf. После установки fpdf вы можете использовать FPDF в своем пользовательском модуле для создания PDF.

$ pdf = new \ FPDF ();

ИЛИ

composer require tecnickcom/tcpdf

Это добавит библиотеку tcpdf в папку продавца как tecnickcom / tcpdf. После установки tcpdf вы можете использовать TCPDF в своем пользовательском модуле для создания PDF.

$ pdf = new \ TCPDF (PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

Аджай
источник
0

Magento2: Как создать PDF в пользовательском модуле

public function execute()
{
    $file = $this->getRequest()->getParam('file');

    if(isset($file) && !empty($file)) {

        $pdf = \Zend_Pdf::load($this->directory_list->getPath(DirectoryList::MEDIA) . DIRECTORY_SEPARATOR . $file);
        $fileName = test.pdf;
        $this->fileFactory->create(
        $fileName,
        str_replace('/Annot /Subtype /Link', '/Annot /Subtype /Link /Border[0 0 0]', $pdf->render()),
        \Magento\Framework\App\Filesystem\DirectoryList::VAR_DIR,
        'application/pdf'
        );
    }
Divyesh
источник