E’ risaputo che la strada più semplice per produrre documenti formattati e stampabili nelle applicazioni web è quella di creare un file PDF al volo, usando una delle diverse librerie disponibili (la mia preferita rimane comunque FPDF).
Nelle applicazioni gestionali capita frequentemente che il cliente richieda la produzione di un documento da trattare con MS-Word e che abbia una formattazione predefinita e allora le soluzioni diventano più complesse: si potrebbe pensare a interfacciare PHP con OpenOffice usando ad esempio, la libreria PHP DocWriter oppure usare le funzioni COM per interfacciarsi direttamente a MS-Word.
Queste due strade sono poco percorribili quando l’applicazione deve girare su uno spazio web su server in hosting condiviso per via dell’impossibilità di installare a proprio piacimento librerie o applicazioni aggiuntive.
Ecco allora che una soluzione più facilmente realizzabile è la produzione di un documento RTF con una libreria che, secondo me, è nel panorama open source la più completa in assoluto, la più documentata in assoluto, la più ben fatta in assoluto: PhpRtf (http://www.phprtf.com).
Nonostante la versione attualmente distribuita è la 0.3, questa libreria risulta molto stabile e presenta le funzioni necessarie per creare i principali elementi di un documento RTF: Intestazioni e piè di pagina, tabelle, immagini, link, bordi, sflondi, sessioni…. che altro vi serve ?
Usando la programmazione a oggetti è stata realizzato un set di classi che possono essere usate con molta semplicità e molta flessibilità, grazie anche alla documentazione delle API realizzata con phpDocumentor.
Per creare un documento è sufficente istanziare la classe principale, aggiungere una sezione e cominciare a scrivere del testo nella sezione.
Una comodità che si può apprezzare usando la classe è quella dell’uso di tag all’interno del testo in stile HTML per la formattazione semplice e l’inserimento di elementi quali data corrente e numero di pagina.
L’integrazione con CakePHP è immediata utilizzando la funzione vendor.
vendor("rtf/rtf/Rtf");
$rtf = new Rtf();
$sect = &$rtf->addSection();
$sect->writeText('Hello World.', new Font(12), new ParFormat('center'));
$rtf->sendRtf('Hello World');
Questo è uno dei vari esempi presenti nel sito dal quale trarre spunto.