Magento 2 PDF generator
Magento 2 module to ease the pdf generation using wkhtmltopdf features
Installation
composer require "staempfli/magento2-module-pdf":"~1.0"
Setup
Install wkhtmltopdf
This module needs wkhtmltopdf installed on your computer. You can download and install it from here:
NOTE: Do not install it using apt-get
on Linux systems. See troubleshooting section for more info.
Module configuration
Stores > Configuration > Advanced PDF Generation
Usage
This module can generate a PDF from any frontControllerAction
-
Create you Controller path with the correspinding Blocks and
.phtml
templates<!-- route_actions_generatePdf.xml --> <layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd"> <container name="root"> <block class="Vendor\Package\Block\YourBlock" name="vendor.package.somename"> </container> </layout>
-
Return pdf instance on Controller
<?php namespace Vendor\Package\Controller\Actions; use Magento\Framework\App\Action\Action; use Staempfli\Pdf\Model\View\PdfResult; use Staempfli\Pdf\Service\PdfOptions; class GeneratePdf extends Action { public function execute() { return $this->renderPdfResult(); } protected function renderPdfResult() { /** @var PdfResult $result */ $result = $this->resultFactory->create(PdfResult::TYPE); $result->addGlobalOptions( new PdfOptions( [ PdfOptions::KEY_GLOBAL_TITLE => __('Return PDF'), PdfOptions::KEY_PAGE_ENCODING => PdfOptions::ENCODING_UTF_8, PdfOptions::KEY_GLOBAL_ORIENTATION => PdfOptions::ORIENTATION_PORTRAIT, PdfOptions::FLAG_PAGE_PRINT_MEDIA_TYPE, ] ) ); $result->addPageOptions( new PdfOptions( [ PdfOptions::KEY_PAGE_COOKIES => ${'_COOKIE'}, ] ) ); return $result; } }
Header and Footer
Header and footer html can be added as follows:
-
Create your
header.html
andfooter.html
files inside your Module template dir<!doctype html> <!-- app/code/Vendor/Package/view/frontend/templates/pdf/header.html --> <html> <body> Header text </body> </html>
<!doctype html> <!-- app/code/Vendor/Package/view/frontend/templates/pdf/footer.html --> <html> <body> Footer text </body> </html>
-
Attach those files to the Controller pdf generation
<?php namespace Vendor\Package\Controller\Actions; use Magento\Framework\App\Action\Action; use Magento\Framework\View\Element\Template\File\Resolver as TemplateResolver; use Staempfli\Pdf\Model\View\PdfResult; use Staempfli\Pdf\Service\PdfOptions; class GeneratePdf extends Action { /** * @var TemplateResolver */ private $templateResolver; public function __construct( TemplateResolver $templateResolver, Context $context ) { parent::__construct($context); $this->templateResolver = $templateResolver; } public function execute() { return $this->renderPdfResult(); } protected function renderPdfResult() { /** @var PdfResult $result */ $result = $this->resultFactory->create(PdfResult::TYPE); $result->addGlobalOptions( new PdfOptions( [ PdfOptions::KEY_GLOBAL_TITLE => __('Return PDF'), PdfOptions::KEY_PAGE_ENCODING => PdfOptions::ENCODING_UTF_8, PdfOptions::KEY_GLOBAL_ORIENTATION => PdfOptions::ORIENTATION_PORTRAIT, PdfOptions::FLAG_PAGE_PRINT_MEDIA_TYPE, PdfOptions::KEY_PAGE_HEADER_SPACING => "10", ] ) ); $result->addPageOptions( new PdfOptions( [ PdfOptions::KEY_PAGE_COOKIES => ${'_COOKIE'}, PdfOptions::KEY_PAGE_HEADER_HTML_URL => $this->templateResolver ->getTemplateFileName('Vendor_Package::pdf/header.html'), PdfOptions::KEY_PAGE_FOOTER_HTML_URL => $this->templateResolver ->getTemplateFileName('Vendor_ Package::pdf/footer.html'), ] ) ); return $result; } }
NOTE: Only the header or only the footer as html
is not possible, either both or none. Otherwise top and bottom margins are ignored.
Troubleshooting
The switch --print-media, is not support using unpatched qt:
wkhtmltopdf
should not be installed via apt-get. See:
Tiny or very small output on Mac:
- It seems to be a bug on
wkhtmltopdf
version 0.12.4. It can be fixed by installing 0.12.3
Requirements
- PHP >= 7.0.*
- Magento >= 2.1.*
Support
If you have any issues with this extension, open an issue on GitHub.
Contribution
Any contribution is highly appreciated. The best way to contribute code is to open a pull request on GitHub.
Developer
Staempfli Webteam, Fabian Schmengler, integer_net and all other contributors
License
Open Software License ("OSL") v. 3.0
Copyright
(c) 2018, Stämpfli AG