Unire più file PDF con PHP

Recentemente ho avuto la necessità di unire più file PDF usando PHP.
Facendo una ricerca su internet ho trovato la libreria PDFMerger su GitHub che svolge questo compito.
Essa si basa a sua volta sulle librerie TCPDF e TCPDI e supporta l’importazione dei PDF fino alla versione 1.6.

Non c’è nessun particolare vincolo riguardo l’origine dei file PDF quindi, ad esempio potete unire un file caricato dall’utente con uno creato in PHP.

Siccome avevo bisogno di ancora più funzionalità ho pensato di fare un fork del progetto e ho aggiunto le seguenti nuove features:

  • Supporto alle versioni di PHP dalla 5.3 alla 7.2
  • Supporto allo standard PSR-4
  • Supporto dei Namespaces
  • Possibilità di stampare l’header e/o il footer su tutte le pagine del file di output

Esempi di utilizzo

$loader = require __DIR__ . '/../vendor/autoload.php';

$pdf = new andreaventuri\PdfMerger\PdfMerger;

$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4');
$pdf->addPDF('samplepdfs/two.pdf', '1-2');
$pdf->addPDF('samplepdfs/three.pdf');


$pdf->merge('file', 'samplepdfs/TEST2.pdf'); // generate the file

$pdf->merge('download', 'samplepdfs/test.pdf'); // force download

// REPLACE 'file' WITH 'browser', 'download', 'string', or 'file' for output options

Il metodo addPDF riceve due parametri, il primo è obbligatorio ed è la path completa del file PDF, mentre il secondo è facoltativo ed è l’elenco delle pagine da copiare.

Header e footer

Ho modificato la libreria per poter applicare l’header ed il footer a tutte le pagine del PDF risultante, in questo modo:

/**
 * @see https://tcpdf.org/examples/example_003/
 */
class MyCustomPdf extends \TCPDI
{
	/**
	 * Page header
	 */
    public function Header()
	{
		// Position at 5 mm from top
		$this->SetY(5);

        // Set font
        $this->SetFont('helvetica', 'B', 20);

        // Title
        $this->Cell(0, 15, '<< Example header >>', 0, false, 'C', 0, '', 0, false, 'M', 'M');
    }

    /**
	 * Page footer
	 */
    public function Footer()
	{
        // Position at 15 mm from bottom
        $this->SetY(-15);

        // Set font
        $this->SetFont('helvetica', 'I', 8);

        // Page number
        $this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M');
    }
}


$obj = new MyCustomPdf();

$pdf = new andreaventuri\PdfMerger\PdfMerger($obj);

$pdf->addPDF(__DIR__.'/pdf/one.pdf', '1,3,4')
	->addPDF(__DIR__.'/pdf/two.pdf', '1-2')
	->addPDF(__DIR__.'/pdf/three.pdf')
	->merge('file', __DIR__.'/output02.pdf');

Sfruttando la libreria TCPDF e attraverso la Dependency injection è possibile definire gli stile per l’intestazione ed il pié di pagina.

Installazione

E’ possibile installare il pacchetto attraverso Composer con il comando composer require andreaventuri/pdfmerger, oppure semplicemente effettuando il download da GitHub.


 


One thought to “Unire più file PDF con PHP”

  1. La psiegazione è chiarissima ma ioho un altro, credo, problema:
    devo produrre un programma in php che genera diversi documenti pdf per spedirli via mail.
    Fino a qui tutto bene.
    Poi devo generare un unico file pdf per far si che l’operatore veda cosa ha spedito e a chi (la somma dei file spediti via mail)
    Il tutto devo provarlo in locale e poi spedirlo sul server aruba
    Credo di avere qualche problema anche perché PDFMerger non ne vuol sapere di ufunzionare.
    I singoli files pdf li ho generati con tcpdf.php per cui non capisco dove sto sbagliando
    Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.