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!
Claudio
Molto interessante ho provato ma mi da questo errore:
il file non comincia con ‘%PDF-‘
In rete non c’è gran che di documentazione su questo errore
Francesco
@Claudio:
temo possa essere un problema con il formato MIME del documento generato. Non tutti i sistemi operativi sono uguali da questo punto di vista, e quindi a volte funzione correttamente e altre no.
Insomma, non ho una soluzione precisa 🙂
Spero di poter avere aggiornamenti in futuro… anche perchè in Joomla 1.7 appoggiarsi a una libreria esterna è l’unica possibilità.
James Peter
You save me! Thank’s…
Eco
Ci sono novità in merito al plugin citato?
Francesco
@Eco:
per il momento continuiamo a inserire manualmente la libreria TCPDF nei nostri componente che ne hanno bisogno…
Salvatore
Ciao, molto interessante come soluzione.
Mi chiedevo, come posso richiamare tale vista (pdf) da una funzione del controller?
Cioè, ho un JToolBarHelper::custom(‘cliente.pdf’) che richiama la funzione pdf().
Ora la funzione pdf() come può richiamare la view (pdf)?
Grazie
Francesco
@Salvatore: di solito nel controller la funzione principale è “display($tpl)”. Per cui “pdf” può essere semplicemente un wrapper che richiama “display(“pdf”). In questo modo viene automaticamente richiamato il file tmpl/default_pdf.php anzichè templ/default.php.