Generare report PDF con PHP: sembrava impossibile, ma ce l’abbiamo fatta

Uno dei misteri più profondi e da sempre irrisolti dell’umanità è quello relativo a come fare a generare un maledetto report con PHP.

Dopo infinite ricerche e capelli strappati ecco che la soluzione l’ho trovata… non è esattamente come usare Crystal Reports, ma è sempre meglio che posizionare a mano ogni elemento sulla pagina.

Un po’ di storia!

(Questa parte non serve a niente, se volete subito la soluzione leggete più in basso… impazienti!)

Inizia tutto quando ho avuto la necessità di produrre report PDF da PHP. Per prima cosa ho scartato le varie soluzioni che promettevano di produrre documenti tramite posizionamenti assoluti e pazzie varie (metti la prima parola qua, poi cambia colore, ora spostati 10pt a destra, ora 15pt in basso, oh accidenti è finita la pagina e mo’ che faccio??).

Continuando le ricerche, ho quindi scoperto l’esistenza di TCPDF… non male, a prima vista. Tra le varie cose, permette di scrivere sul PDF tramite una sintassi HTML/CSS. Come si usa? Ah, non ci sono brevi crash course per iniziare… vabbè dai, c’è la documentazione. Poi dopo un’oretta di test capisci che non c’è un modo sano per implementare un sistema di template. Inoltre varie proprietà CSS non sono supportate (padding, margin, border…). Torno a strapparmi i capelli e cerco altro.

Html2pdf… interessante, ma il nome non mi convince. Farà quello che mi serve? Un po’. Il sito ufficiale è figo, ma la documentazione non esiste. Scopro poi che fortunatamente almeno il codice PHP è ben commentato. Scelgo questo progetto come soluzione definitiva… ma vediamo come.

Insomma com’è che devo fare?

Il trucco è unire html2pdf a un gestore di template (io ho usato l’ottimo Smarty). Questo ci permette di definire dei template HTML che riempiremo con i nostri dati tramite Smarty e che poi passeremo a html2pdf per la generazione del report.

Qualcosa come (tralasciando le inizializzazioni varie):

$smarty->assign('descrizione', 'abcde');
$content = $smarty->fetch('reports/mioreport.tpl');
$html2pdf->writeHTML($content);
$html2pdf->Output('prova.pdf');

Il template sarebbe invece simile al seguente (chiedo scusa per la formattazione, odio wordpress quanto voi):

<style type=”text/css”>
/* CSS vario */
</style>
<page backtop=”30pt” backbottom=”30pt” sbackleft=”15pt” sbackright=”15pt”>
<page_header>
<div style=”height: 30pt; border-bottom: solid 1px #000000;”>Abc s.r.l.</div>
</page_header>
<page_footer>
<div style=”text-align:right; border-top: solid 1px #000000;”>pagina [[page_cu]] di [[page_nb]]</div>
</page_footer>
<h1>Descrizione: {$descrizione|escape:’html’}</h1>

Notare che se nel template vogliamo aggiungere un riferimento alla pagina corrente o al numero di pagine (ad esempio, nel footer), possiamo utilizzare gli elementi [[page_cu]] e [[page_nb]].

2 pensieri su “Generare report PDF con PHP: sembrava impossibile, ma ce l’abbiamo fatta

  1. Soluzione interessante, io solitamente uso Scribus (che mi permette di salvare in formato fdf) e poi riempio i campi tramite php ottenendo un workflow simile a quello ottenibile tramite cristal report

  2. Interessante! Non ho mai utilizzato Scribus, sto guardando il sito e sembra davvero un bel progetto.
    Mi ero orientato su una soluzione “tutto php”, ma anche questa non sembra affatto male… probabilmente è anche migliore: farò qualche prova il prima possibile.
    Grazie per la segnalazione! :)

Lascia un commento

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