Skip to main content

PDF con Joomla: Si! Può! Fare!

Creare dei documenti PDF direttamente via codice da un componente Joomla non è poi così immediato come sembra. Esistono diverse soluzioni: nel resto dell’articolo vediamo quella scelta da GiBiLogic.

Nota: l’articolo è rivolto a sviluppatori PHP che abbiamo già un minimo di conoscenza della struttura MVC tipica dei componenti Joomla.

JDocumentPDF

Come molti di voi sapranno, l’opzione di creare un file PDF a partire da un articolo di Joomla è già disponibile, basta attivare la relativa icona nelle preferenze.

Questa funzionalità è realizzata tramite la class JDocumentPDF ed è facilmente replicabile, creando una vista dedicata in un file chiamato view.pdf.php e specificando “format=pdf” come parametro nell’URL.

Tuttavia, non abbiamo nessun controllo sull’aspetto finale del documento: la conversione dal formato HTML a quello PDF è piuttosto grezza e porta con sè alcune “trasformazioni” indesiderate.

Nel nostro caso, dovendo produrre dei modelli piuttosto precisi e corrispondenti a quelli visibili nel browser, tale opzione è stata scartata.

TCPDF

La seconda opzione valutata è stata quella di accedere direttamente alla classe TCPDF.

Questa è la vera e propria classe di generazione del PDF, utilizzata anche da JDocumentPDF. Saltando il passaggio intermedio e interrogando direttamente la classe sottostante, possiamo lavorare su un oggetto PDF molto più flessibile.

Tuttavia, il modo preferito di creare un PDF tramite TCPDF è utilizzare una lunga serie di metodi di tale classe che posizionano gli elementi nella pagina, con coordinate e tutto quanto; mentre nel nostro caso volevamo sfruttare semplicemente il motore di conversione da HTML a PDF (metodo writeHTML), in modo da riutilizzare lo stesso layout per generare il documento.

Il problema è che la versione di TCPDF inclusa in Joomla 1.5 non è recentissima, pertanto la conversione non è proprio precisa (alcuni “pezzi” di HTML o CSS vengono persi per strada. E dunque?

Nuovo TCPDF incluso!

Abbiamo deciso di scaricare e di includere direttamente nel nostro componente l’ultima versione di TCPDF, inserendola nell’apposita cartella “classes” e richiamandola nella vista. Grazie ai miglioramenti inseriti nel frattempo, in questo modo la conversione funziona perfettamente!

A quel punto si è trattato solo di creare una serie di controlli che potessero permetterci di riutilizzare al massimo il codice esistente. Vediamoli:

1. nella vista principale (view.html.php) inseriamo il riconoscimento di un parametro “pdf”; se è attivo imposto il mime type del documento risultante e il layout “contenitore” da utilizzare.

if ( JRequest::getInt('pdf') == 1 ) {
 $document =& JFactory::getDocument();
 $document->setMimeEncoding('application/pdf');
 $tpl = 'pdf';
}

2. nel layout default_pdf.php, anzichè mostrare il risultato a video, lo carico in una variabile HTML:

$html = $this->loadTemplate( $this->layout );

N.B. in questo modo default.php e default_pdf.php risultano essere solo dei wrapper attorno ai layout veri e propri; posso creare un layout diverso per ciascun documento da creare, che verrà utilizzato indistintamente per la versione stampabile a video e per la versione PDF.

3. a questo punto, effettuo le operazioni minime necessarie per caricare e creare il PDF:

JLoader::import( 'classes.tcpdf.tcpdf', JPATH_COMPONENT );
$pdf = new TCPDF();
$pdf->SetAuthor('GiBiLogic snc');
$pdf->SetTitle('Documento PDF');
$pdf->AddPage();
$pdf->writeHTML( $html );
$pdf->Output( "file.pdf', 'I');

4. infine, e questo è importante, esco dall’applicazione con

exit;

per evitare che l’output PDF si mischi con quello HTML.

Conclusioni

La scelta di includere la classe TCPDF non è così malvagia come sembra; il supporto per la generazione dei PDF è stato rimosso da Joomla 1.6, pertanto abbiamo solo anticipato una operazione che avremmo dovuto compiere più avanti.

Ovviamente la possibilità di rendere disponibile come plugin questa libreria aggiuntiva suona molto più interessante che inserirla in ogni singolo componente… vedremo di inventarci qualcosa!

Commenti (7)

I commenti sono chiusi.