Magento2: Cómo crear un PDF en un módulo personalizado

8

Me gustaría generar un pdf personalizado a la venta y adjuntarlo al correo electrónico de ventas, todo dentro de un módulo personalizado.

Creo que necesito extender Magento\Sales\Model\Order\Pdf\AbstractPdfpara generar el pdf, pero no estoy seguro.

¿Alguien ha hecho esto antes o tiene alguna idea si estoy en el camino correcto?

// editar:

Según los comentarios, aquí hay un diseño básico de cómo incluí http://www.fpdf.org/ en mi módulo personalizado:

Primero descargué el paquete fpdf. Extraje los archivos y los coloqué todos en mi Helpercarpeta Módulos , que ahora se ve así:

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

Data.php es el único archivo que ya tenía en esta carpeta ya que contiene mi clase de datos de ayuda.

Luego edité el FPDF.php y le agregué el espacio de nombres de mis módulos.

Edité mi Data.phparchivo auxiliar y uso mis espacios de nombres de la clase FPDF:

use Company\ModuleName\Helper\FPDF as FPDF;

Definí cualquier información en PDF que necesito en la Clase de datos; no necesita esto:

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


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

y construirlo

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

Luego creé mi método y generé el 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;
}

Luego llama a su método en su controlador a través de su ayudante (que debe incluir, por supuesto):

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

tecjam
fuente
¿Haz alcanzado algo con esto?
LM_Fielding
1
No tomé esa ruta después de todo. Lo intenté pero al final me pareció demasiado complejo intentar usar la clase AbstractPdf. Terminé incluyendo FPDF con mi módulo (en Helper) y lo usé para generar los archivos pdf. fpdf.org
tecjam
1
Brillante. ¿Consideraste dompdf? github.com/dompdf/dompdf
LM_Fielding
1
Lo hice, pero una razón de por qué no lo usé fue que no quería tener que renderizar el html primero y luego tener que renderizar el html en el pdf. También hubo otras razones, pero no recuerdo cuáles fueron. Para su uso, puede ser mejor, pero solo usted puede decidir eso.
tecjam
Hola, cualquier actualización sobre esta pregunta. Estoy tratando de generar PFD para mi módulo personalizado: Magento2.
Dev

Respuestas:

1

Puede usar FPDF o TCPDF para crear PDF.

Intente ejecutar uno de los siguientes comandos desde el directorio raíz M2

composer require setasign/fpdf:1.8.1

Agregará la biblioteca fpdf en la carpeta del proveedor como setasign / fpdf. Una vez instalado fpdf, puede usar FPDF en su módulo personalizado para crear PDF.

$ pdf = nuevo \ FPDF ();

O

composer require tecnickcom/tcpdf

Agregará la biblioteca tcpdf en la carpeta del proveedor como tecnickcom / tcpdf. Una vez que instale tcpdf, puede usar TCPDF en su módulo personalizado para crear PDF.

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

Ajay
fuente
0

Magento2: Cómo crear un PDF en un 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
fuente