Magento2: Como criar um PDF em um módulo personalizado

8

Gostaria de gerar um pdf personalizado na venda e anexá-lo ao email de vendas, tudo dentro de um módulo personalizado.

Acho que preciso estender Magento\Sales\Model\Order\Pdf\AbstractPdfpara gerar o pdf, mas não tenho certeza.

Alguém já fez isso antes ou tem alguma idéia se estou no caminho certo?

// editar:

De acordo com os comentários, aqui está um layout básico de como incluí http://www.fpdf.org/ no meu módulo personalizado:

Primeiro baixei o pacote fpdf. Extraí os arquivos e os coloquei na Helperpasta Módulos , que agora se parece com isso:

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

Data.php é o único arquivo que eu já tinha nesta pasta, pois contém minha classe de dados auxiliar.

Em seguida, editei o FPDF.php e adicionei o namespace dos meus módulos.

Data.phpEditei meu arquivo auxiliar e usei a classe FPDF dos espaços para nome:

use Company\ModuleName\Helper\FPDF as FPDF;

Eu defini todas as informações em pdf necessárias na Classe de dados - você não precisa disso:

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


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

e construa

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

Criei meu método e gere o 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;
}

Em seguida, você chama seu método no seu controlador através do seu ajudante (que você precisa incluir, é claro):

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

tecjam
fonte
Você chegou a algum lugar com isso?
LM_Fielding
11
Eu não segui esse caminho, afinal. Eu tentei, mas no final parecia muito complexo tentar usar a classe AbstractPdf. Acabei incluindo o FPDF com o meu módulo (no Helper) e o usei para gerar os arquivos pdf. fpdf.org
tecjam
11
Brilhante. Você considerou dompdf? github.com/dompdf/dompdf
LM_Fielding
11
Sim, mas um dos motivos pelos quais não o usei foi o fato de não querer renderizar o html primeiro e depois renderizá-lo no pdf. Havia outras razões também, mas não me lembro o que eram. Para seu uso, pode ser melhor, mas somente você pode decidir isso.
tecjam
Olá, todas as atualizações sobre esta questão. Estou tentando gerar PFD para o meu módulo personalizado - Magento2.
Dev

Respostas:

1

Você pode usar o FPDF ou o TCPDF para criar PDF.

Tente executar um dos seguintes comandos no diretório raiz M2

composer require setasign/fpdf:1.8.1

Ele adicionará a biblioteca fpdf na pasta do fornecedor como setasign / fpdf. Após a instalação do fpdf, você pode usar o FPDF em seu módulo personalizado para criar PDF.

$ pdf = novo \ FPDF ();

OU

composer require tecnickcom/tcpdf

Ele adicionará a biblioteca tcpdf na pasta do fornecedor como tecnickcom / tcpdf. Após a instalação do tcpdf, você pode usar o TCPDF em seu módulo personalizado para criar PDF.

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

Ajay
fonte
0

Magento2: Como criar um PDF em um módulo personalizado

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
fonte