Magento2: come creare un PDF in un modulo personalizzato


8

Vorrei generare un pdf personalizzato al momento della vendita e allegarlo all'e-mail di vendita, tutto all'interno di un modulo personalizzato.

Penso di dover estendere Magento\Sales\Model\Order\Pdf\AbstractPdfper generare il pdf ma non ne sono certo.

Qualcuno l'ha mai fatto prima o ha idea se sono sulla strada giusta?

// modificare:

Come da commenti, ecco un layout di base su come ho incluso http://www.fpdf.org/ nel mio modulo personalizzato:

Per prima cosa ho scaricato il pacchetto fpdf. Ho estratto i file e li ho inseriti tutti nella mia Helpercartella Modules , che ora ha questo aspetto:

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

Data.php è l'unico file che ho già avuto in questa cartella in quanto contiene la mia classe di dati di supporto.

Successivamente ho modificato FPDF.php e vi ho aggiunto lo spazio dei nomi dei miei moduli.

Ho modificato il mio Data.phpfile di supporto e utilizzo la classe FPDF dei miei spazi dei nomi:

use Company\ModuleName\Helper\FPDF as FPDF;

Ho definito tutte le informazioni pdf di cui ho bisogno nella classe di dati - non è necessario questo:

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


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

e costruirlo

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

Ho quindi creato il mio metodo e generato il 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;
}

Quindi chiami il tuo metodo nel tuo controller tramite il tuo helper (che ovviamente devi includere):

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


Sei arrivato da qualche parte con questo?
— LM_Fielding

1
Dopotutto non ho seguito quella strada. Ci ho provato ma alla fine mi è sembrato troppo complesso provare ad usare la classe AbstractPdf. Ho finito per includere FPDF con il mio modulo (nell'Helper) e l'ho usato per generare i file pdf. fpdf.org
— tecjam,

1
Brillante. Hai considerato dompdf? github.com/dompdf/dompdf
— LM_Fielding

1
L'ho fatto, ma uno dei motivi per cui non l'ho usato era che non volevo prima rendere l'html e poi renderizzare l'html nel pdf. C'erano anche altri motivi, ma non riesco a ricordare quali fossero. Per il tuo uso potrebbe essere migliore, ma solo tu puoi decidere.
— Tecjam,

Ciao, eventuali aggiornamenti su questa domanda. Sto cercando di generare PFD per il mio modulo personalizzato Magento2.
— Dev

Risposte:


1

È possibile utilizzare FPDF o TCPDF per la creazione di PDF.

Prova a eseguire uno dei seguenti comandi dalla directory principale di M2

composer require setasign/fpdf:1.8.1

Aggiungerà la libreria fpdf nella cartella del fornitore come setasign / fpdf. Una volta installato fpdf puoi usare FPDF nel tuo modulo personalizzato per creare PDF.

$ pdf = new \ FPDF ();

O

composer require tecnickcom/tcpdf

Aggiungerà la libreria tcpdf nella cartella del fornitore come tecnickcom / tcpdf. Una volta installato tcpdf è possibile utilizzare TCPDF nel modulo personalizzato per la creazione di PDF.

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


0

Magento2: come creare un PDF in un modulo personalizzato

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'
        );
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.