rtf2txt

Per convertire un file da RTF a PHP bastano poche sostituzioni, visto che l’RTF ha una sintassi di solo testo.
Negli esempi succesivi in $rtf è racchiuso tutto il file RTF.

Iniziamo con il rimuovere le intestazioni del file. Niente di più facile, le intestazioni finiscono quando inizia il primo paragrafo!

$text = substr($rtf, strpos($rtf, '\par '));

Ora dobbiamo solamente sostituire i caratteri speciali (come le lettere accentate) che in rtf hanno una loro sintassi. Creiamo un array per le conversioni:

$special = array('e1'=>'á', 'c0'=>'À', 'e0'=>'à', 'c9'=>'É', 'e9'=>'é', 'c8'=>'È', 'e8'=>'è', 'cd'=>'Í', 'ed'=>'í', 'cc'=>'Ì', 'ec'=>'ì', 'd3'=>'Ó', 'f3'=>'ó', 'd2'=>'Ò', 'f2'=>'ò', 'da'=>'Ú', 'fa'=>'ú', 'd9'=>'Ù', 'f9'=>'ù', '80'=>'€', 'd1'=>'Ñ', 'f1'=>'ñ', 'c7'=>'Ç', 'e7'=>'ç', 'dc'=>'Ü', 'fc'=>'ü', 'bf'=>'¿', 'a1'=>'¡', 'b7'=>'·', 'a9'=>'©', 'ae'=>'®', 'ba'=>'º', 'aa'=>'ª', 'b2'=>'²', 'b3'=>'³');

Bene, ora possiamo convertirli ricercando nel testo ogni entità e sostituendola con il rispettivo carattere. Sapendo che ogni tag di rtf inizia con \ ed ha 2 caratteri l’espressione regolare di ricerca è semplicissima:

   foreach($special as $key => $val){
      $text = str_replace('\\\\'.$key, $val, $text);
   }

Ora dobbiamo rimuovere tutti i tag. Anche questo si fa con una semplice espressione regolare molto simile alla precedente. Inoltre bisogna eliminare anche i tag di apertura e chiusura, ma questi sono sempicemente racchiusi da { e } e quindi basta rimuovere le parentesi grafe

$text = preg_replace('/\\\\\\\\[a-z0-9]+/', '', $text);
$text = str_replace('}{', '', $text);

Ora si effettua la pulizia finale, rimuovendo tutti quei tag sfuggiti ai controlli precedenti

$text = substr($text, strpos($text,'*')-1, -2);
$text = preg_replace('/ {2,}/', ' ', $text);

Bene, ora nella variabile $text abbiamo il nostro file RTF convertito in testo!

Utilizzando tutta la descrizione qui sopra si ricava questa semplice funzioncina:

/**
 *
 * Converte un file RTF in una stringa
 *
 * @author     Giulio "Chalda" Bettega
 * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
 * @link       http://blog.chalda.it/convertire-un-documento-rtf-in-testo-in-php-10.html
 * @param      string  $filename  L'url
 * @return     string  Il file convertito in testo semplice
 *
 */
function rtf2txt($filename){

   // Recupero il file
   $handle = fopen($filename, "r");
   $rtf = fread($handle, filesize($filename));
   fclose($handle);

   // Tolgo le intestazioni
   $text = substr($rtf, strpos($rtf, '\par '));

   // Converto i caratteri speciali
   $special = array('e1'=>'á', 'c0'=>'À', 'e0'=>'à', 'c9'=>'É', 'e9'=>'é', 'c8'=>'È', 'e8'=>'è', 'cd'=>'Í', 'ed'=>'í', 'cc'=>'Ì', 'ec'=>'ì', 'd3'=>'Ó', 'f3'=>'ó', 'd2'=>'Ò', 'f2'=>'ò', 'da'=>'Ú', 'fa'=>'ú', 'd9'=>'Ù', 'f9'=>'ù', '80'=>'€', 'd1'=>'Ñ', 'f1'=>'ñ', 'c7'=>'Ç', 'e7'=>'ç', 'dc'=>'Ü', 'fc'=>'ü', 'bf'=>'¿', 'a1'=>'¡', 'b7'=>'·', 'a9'=>'©', 'ae'=>'®', 'ba'=>'º', 'aa'=>'ª', 'b2'=>'²', 'b3'=>'³');
   foreach($special as $key => $val){
      $text = str_replace('\\\\'.$key, $val, $text);
   }

   // Rimuovo i tag
   $text = preg_replace('/\\\\\\\\[a-z0-9]+/', '', $text);
   $text = str_replace('}{', '', $text);

   // Pulizia finale
   $text = substr($text, strpos($text,'*')-1, -2);
   $text = preg_replace('/ {2,}/', ' ', $text);

   return $text;
}