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);


¿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);


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'
        );
    }
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.