Unire PDF in Laravel e laravel-pdfmerger

Mattepuffo's logo
Unire PDF in Laravel e laravel-pdfmerger

Unire PDF in Laravel e laravel-pdfmerger

laravel-pdfmerger è una libreria PHP per Laravel che ci permette di unire PDF creandone uno unico.

In questo articolo vediamo come usarla, in congiunzione a Dompdf (di cui vi rimando a questo articolo per l'installazione e configurazione).

Cominciamo con l'installazione della libreria, che si porta dietro diverse dipendenze:

composer require webklex/laravel-pdfmerger

Poi aprite il file config/app.php ed aggiungete queste due righe:

'providers' => [
    ...
    Webklex\PDFMerger\Providers\PDFMergerServiceProvider::class
],

'aliases' => [
    ...
    'PDFMerger' => Webklex\PDFMerger\Facades\PDFMergerFacade::class
]

A questo punto vediamo il controller:

namespace App\Http\Controllers;

use Barryvdh\DomPDF\Facade as PDF;
use Illuminate\Support\Facades\Storage;
use Webklex\PDFMerger\Facades\PDFMergerFacade as PDFMerger;

class TestController extends Controller {

    public function index() {
        try {
            $data = array('nome' => 'matteo');
            $pdf = PDF::loadView('test', ['data' => $data]);
            Storage::put('public/tmp_pdf/test.pdf', $pdf->output());

            $data2 = array('nome' => 'matteo2');
            $pdf2 = PDF::loadView('test', ['data' => $data2]);
            Storage::put('public/tmp_pdf/test2.pdf', $pdf2->output());

            $oMerger = PDFMerger::init();
            $oMerger->addPDF(storage_path('app/public/tmp_pdf/test.pdf'), 'all');
            $oMerger->addPDF(storage_path('app/public/tmp_pdf/test2.pdf'), 'all');
            $oMerger->merge();
            $oMerger->setFileName('file.pdf');
            return $oMerger->download();
        } catch (\RuntimeException $ex) {
            return response()->json([
                'res' => 'ko',
                'message' => 'Errore: ' . $ex->getMessage()
            ]);
        }
    }

}

Prima creiamo due PDF partendo dallo stesso template, ma passandogli diversi valori.

Poi li uniamo e li mandiamo in download.

Giusto per completezza, questo il template:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title></title>
    </head>
    <body>
        <style>
            @page {
                margin: 0 0;
            }

            body {
                margin-top: 3.3cm;
                margin-left: 2cm;
                margin-right: 2cm;
                margin-bottom: 2cm;
                font-size: 16px;
            }

            .pagenum:before {
                content: counter(page);
            }
        </style>

        <footer id="prev_footer">
            <span class="pagenum"></span>
        </footer>

        <main>

            <!-- PAG 1 -->
            <div style="page-break-after: always;">
                <h2>{{$data['nome']}}</h2>
            </div>

        </main>

    </body>
</html>

Enjoy!


Condividi

Commentami!