Magento2: So erstellen Sie ein PDF in einem benutzerdefinierten Modul


8

Ich möchte beim Verkauf ein benutzerdefiniertes PDF erstellen und es innerhalb eines benutzerdefinierten Moduls an die Verkaufs-E-Mail anhängen.

Ich denke, ich muss erweitern Magento\Sales\Model\Order\Pdf\AbstractPdf, um das PDF zu generieren, aber ich bin nicht sicher.

Hat das schon mal jemand gemacht oder hat er eine Idee, ob ich auf dem richtigen Weg bin?

// edit:

Gemäß den Kommentaren finden Sie hier ein grundlegendes Layout, wie ich http://www.fpdf.org/ in mein benutzerdefiniertes Modul aufgenommen habe:

Zuerst habe ich das fpdf-Paket heruntergeladen. Ich habe die Dateien extrahiert und sie alle in meinen Modulordner gelegt Helper, der jetzt so aussieht:

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

Data.php ist die einzige Datei, die ich bereits in diesem Ordner hatte, da sie meine Hilfsdatenklasse enthält.

Als nächstes habe ich die Datei FPDF.php bearbeitet und meinen Modul-Namespace hinzugefügt.

Ich habe Data.phpmeine Hilfsdatei bearbeitet und die FPDF-Klasse meiner Namespaces verwendet:

use Company\ModuleName\Helper\FPDF as FPDF;

Ich habe alle PDF-Informationen definiert, die ich in der Datenklasse benötige - das brauchen Sie nicht:

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


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

und konstruiere es

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

Ich habe dann meine Methode erstellt und das PDF generiert:

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

Dann rufen Sie Ihre Methode in Ihrem Controller über Ihren Helfer auf (was Sie natürlich einschließen müssen):

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


Hast du damit etwas erreicht?
LM_Fielding

1
Ich bin diesen Weg doch nicht gegangen. Ich habe es versucht, aber am Ende schien es zu komplex, um die AbstractPdf-Klasse zu verwenden. Am Ende habe ich FPDF in mein Modul (im Helper) aufgenommen und es zum Generieren der PDF-Dateien verwendet. fpdf.org
Tecjam

1
Brillant. Hast du dompdf in Betracht gezogen? github.com/dompdf/dompdf
LM_Fielding

1
Ich habe es getan, aber ein Grund, warum ich es nicht verwendet habe, war, dass ich nicht zuerst das HTML und dann das HTML in das PDF rendern musste. Es gab auch andere Gründe, aber ich kann mich nicht erinnern, was sie waren. Für Ihren Gebrauch mag es besser sein, aber nur Sie können das entscheiden.
Tecjam

Hallo, alle Updates zu dieser Frage. Ich versuche, PFD für mein benutzerdefiniertes Modul Magento2 zu generieren.
Dev

Antworten:


1

Sie können FPDF oder TCPDF zum Erstellen von PDF verwenden.

Versuchen Sie, einen der folgenden Befehle im M2-Stammverzeichnis auszuführen

composer require setasign/fpdf:1.8.1

Es wird eine fpdf-Bibliothek im Herstellerordner als setasign / fpdf hinzugefügt. Nach der Installation von fpdf können Sie FPDF in Ihrem benutzerdefinierten Modul zum Erstellen von PDF-Dateien verwenden.

$ pdf = new \ FPDF ();

ODER

composer require tecnickcom/tcpdf

Es wird eine tcpdf-Bibliothek im Herstellerordner als tecnickcom / tcpdf hinzugefügt. Nach der Installation von tcpdf können Sie TCPDF in Ihrem benutzerdefinierten Modul zum Erstellen von PDF-Dateien verwenden.

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


0

Magento2: So erstellen Sie ein PDF in einem benutzerdefinierten Modul

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'
        );
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.