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

  • tegatti

    Salve, sono alla disperata ricerca di qualcuno mi aiuti a risolvere un problema che mi sta assillando da diversi
    giorni.

    Cercherò di descrivere il problema.

    Grazie a FPDF.PHP ho generato un file PDF per la stampa del registro del professore.
    Esso stampa le lezioni svolte durante il quadrimestre. Se un insegnante svolge
    poche lezioni durante tale periodo, la pagina creata dal file PDF riesce bene a
    contenerle, e vengono correttamente visualizzate.

    Il problema si verifica quando in una materia sono previste diverse ore
    d’insegnamento per mese e nella pagina creata dal file PDF vengono visualizzate
    solo in parte, cioè solo le lezioni di settembre e una parte del mese di
    ottobre e le lezioni svolte fino a gennaio non vengono stampate, come mostrato
    nel esempio :

    http://registroonweb.it/registro/stampaRegistro.php?a=1&b=C300&c=1

    Vorrei, che una volta stampate le prime 15 lezioni, il programma automaticamente
    creasse una nuova pagina con l’elenco degli alunni e le successive 15 lezioni e
    così via per tutte le lezioni svolte durante il quadrimestre.

    Grazie in anticipo.

    Tegatti

  • Francesco

    NON funziona…mi restituisce questa stringa di errore :

    “Some data has already been output to browser, can’t send PDF file”
    Help Please!