Creare documenti PDF da HTML con PHP e la libreria TCPDF

Nella scorsa puntata abbiamo creato dei report in PDF con la libreria FPDF; oggi vedremo un’altra libreria di questo genere, ovvero TCPDF. In effetti quest’ultima è più diffusa rispetto a FPDF, grazie all’installazione molto semplice (non dipende da librerie o estensioni) ma soprattutto per alcune funzionalità avanzate e molto interessanti.

Un giro di prova

Il classico Hello World è molto facile da realizzare, è sufficiente installare la libreria seguendo queste istruzioni:

  • scaricare il pacchetto dal sito ufficiale;
  • estrarre i file nel proprio spazio web. Nel nostro esempio li estrarremo nella sotto-directory lib/tcpdf/;
  • includere i file PHP necessari nei propri script.

Ecco quindi il classico Hello World:

<?php
require_once('lib/tcpdf/config/lang/ita.php');
require_once('lib/tcpdf/tcpdf.php');

// crea un documento PDF
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

$pdf->AddPage();

// imposta grassetto (Bold)
$pdf->SetFont('', 'B');
$pdf->Write(null, 'Hello World', null, null, 'C', true);

// imposta font standard
$pdf->SetFont('', '');

$txt = <<<EOD
Lorem ipsum dolor sit amet, in diam nisl ut tellus a in, in vestibulum ante...
Imperdiet nec odio et donec accumsan lacinia, dolor ut, metus aptent curabitur...

EOD;
$pdf->Write(null, $txt);

// Invia PDF inline
$pdf->Output('helloworld.pdf', 'I');

 

Analizziamone brevemente alcuni elementi:

  • la prima istruzione require_once istruisce TCPDF sulla lingua da utilizzare per alcuni elementi, ad esempio le etichette per la paginazione, intestazioni, ecc. Nel nostro caso non sono usate, ma per report non banali è sempre meglio specificare la lingua giusta;
  • il secondo require_once carica la libreria vera e propria;
  • le istruzioni seguenti creano il PDF vero e proprio, creando prima un’istanza della classe TCPDF e poi aggiungendo i vari elementi;
  • la variabile $txt viene specificata utilizzando l’operatore <<<, sintassi chiamata “heredoc” e che permette di scrivere molte linee di testo senza doverle concatenare;
  • infine viene creato il PDF con il metodo Output(). È importante notare come il parametro ‘I’ serva per inviare il PDF direttamente nella finestra del browser, altre opzioni (cfr. documentazione) permettono di forzare il download o di salvare il file sul server stesso.

Ed ecco come appare nel browser:

 

Creazione di un PDF da (X)HTML

Una delle funzionalità più interessanti è sicuramente la capacità di creare dei documenti PDF a partire da sorgenti (X)HTML, aprendo la strada a diverse possibilità molto interessanti:

  • creazione facilitata di documenti PDF senza dover utilizzare i metodi della classe TCPDF, che sono moltissimi e con diversi parametri da conoscere bene;
  • creazione di una versione PDF delle pagine di un sito;
  • realizzazione di report;
  • archiviazione di siti web.

Vediamo come fare:

<?php
require_once('lib/tcpdf/config/lang/ita.php');
require_once('lib/tcpdf/tcpdf.php');

// crea un documento PDF
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

$pdf->AddPage();

$html = <<<EOD
<h1>Esempio HTML</h1>
<p>
<strong>Lorem ipsum dolor sit amet</strong>, in diam nisl ut tellus a in...
</p>
<p>
Imperdiet nec odio et donec accumsan lacinia, dolor ut, metus aptent curabitur...
</p>

EOD;

$pdf->writeHTMLCell(0, 0, 10, 10, $html);

// Invia PDF inline
$pdf->Output('esempio_html.pdf', 'I');

 

Come potete notare, l’unica differenza è l’utilizzo del metodo writeHTMLCell(), che a differenza di Write() sa interpretare correttamente il codice HTML. In alternativa si può usare il metodo writeHTML(), che ha qualche parametro in meno. Il risultato è il seguente:

 

Questo metodo purtroppo ha qualche limitazione, ad esempio l’HTML deve essere ben formato (ovvero i tag devono essere bilanciati), inoltre non tutti gli elementi HTML sono supportati.

Links