Forum

JiFile per Joomla!

JIFile
JiFile è una componente per Joomla! che permette di indicizzare il contenuto dei file(PDF, DOC, ecc.) per poter effettuare delle ricerche al loro interno.

Scopri di più...  Demo

JoomPhoto Mobile

JPhotoMobile
JoomPhoto Mobile è una componente per Joomla! che ti permette di condividere le foto dal tuo dispositivo Android sul tuo portale Joomla!.

Scopri di più...  Demo

iFile Framework

IFile
IFile è un framework open source scritto interamente in PHP, permette l'indicizzazione dei contenuti testuali di un documento (DOC, PDF, EXCEL, etc) e una rapida ricerca all'interno degli stessi.

Scopri di più...  Demo

Easy Language

EasyLanguage
Easy Language è un plugin per la gestione semplice ed immediata di testi multilingua in ogni parte possibile di joomla, articoli, componenti, moduli, metadata, template, altri componenti(esempio K2) ecc.

Scopri di più...

Article Book Effect

Article Book Effect
Visualizza gli articoli di Joomla con l'effetto volta pagina di un libro. Questo plugin consente di visualizzare il contenuto di un articolo Joomla come un vero e proprio libro o una rivista, utilizzando tutti i vantaggi di HTML5

Scopri di più...  Demo

 

Fototessera

Article Book Effect
La più famosa Android App che ti permette di stampare le foto tessere per i tuoi documenti con il tuo smartphone Android, in modo semplice ed intuitivo.

Scopri di più...

 

Ombra pazza 3D

Ombra pazza 3D
Ombra Pazza è il puzzle game 3D frenetico e divertente per Android! Prova a ruotare le forme portandole nella posizione delle proprie ombre senza mai fallire! Risolvi una dopo l'altra tutte le combinazioni dei livelli di gioco.

Scopri di più...

 

Admin Countdown

Admin Countdown
Modulo per Joomla! 2.5 e 3.x visualizza nella parte di amministrazione del sito, un timer con il conto alla rovescia del tempo rimanente della tua sessione.

Scopri di più...  Demo

 
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: Fatal Error con file RTF contenente immagini.

Fatal Error con file RTF contenente immagini. 30/12/2011 11:02 #37

  • trullox
  • Avatar di trullox
  • OFFLINE
  • Fresh Boarder
  • Messaggi: 9
ciao,
ho lanciato l'indicizzazione di una gran mole di dati per vedere se tutto funziona correttamente e come si comporta iFile.
Spesso, quando l'indicizzazione incontra un file RTF mi viene restituito un Fatal Error e l'esecuzione si blocca.
PHP Fatal error:  Maximum execution time of 360 seconds exceeded in /var/www/html/ifile/ifile/adapter/helpers/class.rtf2txt.php
I file su cui si blocca sono degli RTF molto grandi (dai 15 MB ad anche 50 MB). La grandezza dei file non è data dal numero di pagine (i file da 15 MB sono di sole due pagine!), ma dalla presenza di immagini al loro interno. Le specifiche RTF spiegano bene che i file RTF di tipo testuale, gestiscono i contenuti tramite tag ed in particolare le immagini sono salvate come stringa. Infatti se apro i miei file con un qualunque editor testuale (Notepad++ ad esempio), la maggior parte del file è occupata dalla codifica dell'immagine. Convertendo il file in DOC, ovviamente, le grandezze diminuiscono molto e il file è correttamente indicizzato in tempi brevi.
Il problema non è aggirabile aumentando il Maximum execution time nel file di configurazione di iFile; ho fatto molte prove, ma anche impostando diverse ore di esecuzione l'indicizzazione viene bloccata.
L'idea sarebbe quella di intervenire nel file class.rtf2txt.php per eliminare l'analisi nei tag \pict.
E' corretto? Mi date un aiuto?
grazie

Andrea
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re: Fatal Error con file RTF contenente immagini. 30/12/2011 11:55 #38

  • Giampaolo
  • Avatar di Giampaolo
  • OFFLINE
  • Administrator
  • Messaggi: 465
  • Ringraziamenti ricevuti 43
Ciao Andrea,
come sempre grazie per il supporto che ci stai dando.

IFile per la parserizzazione dei documenti si basa anche su librerie Open Source di terze parti e per questo in alcuni casi si potrebbero verificare errori anche a noi sconosciuti.

Ho verificato ed infatti la libreria (o meglio la classe) utilizzata per la parserizzazione dei contenuti RTF non funziona perfettamente. Di fatto si porta dietro tantissime altre informazioni che non dovrebbero essere indicizzate (oltre al binario delle immagini come tu hai evidenziato).

Verificheremo nei prossimi giorni se sarà necessario intervenire sulla libreria per la parserizzazione dei file RTF o sostituirla (lasciando la stessa interfaccia in modo che sarà necessario solo sovrascrivere il file class.rtf2txt.php).
Di certo così come lavora in questo momento non è, ne performante ne tanto meno utilizzabile al 100%.

Il progetto IFile è un progetto giovane e sopratutto Open Source e quindi ogni suggerimento, aiuto o miglioramento da parte dalla comunity che la utilizza è sempre ben accetto per realizzare un prodotto utile e funzionale.

Grazie
If you like, if it was useful, consider a donation, Thanks
Se vuoi, se ti siamo stati utili, considera una donazione, Grazie
Help us by voting our extensions on Joomla.org:
JiFile
JoomPhoto Mobile
Easy Language
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re: Fatal Error con file RTF contenente immagini. 30/12/2011 12:03 #39

  • trullox
  • Avatar di trullox
  • OFFLINE
  • Fresh Boarder
  • Messaggi: 9
grazie,
se sistemo qualcosa vi faccio avere il codice.

in realtà, leggendo il while della funzione GetPlainText(), dato che il tag pict non è specificato, dovrebbe essere ignorato di default... :huh:

Il problema, infatti, non è di qualche blocco od errore, ma un problema di performance. Lo script lavora correttamente, impiega però troppo tempo per analizzare il grande tag dell'immagine e il Maximum execution time viene superato.
Ultima modifica: 30/12/2011 12:09 da trullox.Motivo: sono stati pubblicati altri post mentre scrivevo
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re: Fatal Error con file RTF contenente immagini. 30/12/2011 13:03 #40

  • trullox
  • Avatar di trullox
  • OFFLINE
  • Fresh Boarder
  • Messaggi: 9
ok, credo di aver trovato una soluzione senza riscrivere o sostituire la classe class.rtf2txt.php

Ho notato che nella classe class.doc2txt.php è possibile parserizzare anche i file RTF.

Ho quindi modificato la funzione parse() nella classe Adapter_Search_Lucene_Document_RTF, andando a modificare verso la riga 67
(dico "verso" perchè magari rispetto al file ufficiale rilasciato ho inserito qualche spazio di troppo...)
$doc = new PHPRtfLib();
con
$doc = new PHPWordLib();
in questo modo la libreria utilizzata per recuperare il file RTF in maniera testuale è un'altra.

E' necessario però intervenire per correggere alcuni (secondo me) errori nel file class.doc2txt.php che impediscono un corretto funzionamento.

Verso la riga 159 all'interno della funzione GetRTFPlainText() vengono richiamate alcune funzioni per rimuovere dei tag RTF
$contents = $this->RemoveRTFBlock('fonttbl');
$contents = $this->RemoveRTFBlock('colortbl');
$info_block = $this->ExtractRTFBlock('info');
$contents = $this->RemoveRTFBlock('info');
$s1 = 1;
while ($s1 > 0) {
   $contents = $this->RemoveRTFBlock('*');
   $s1 = strpos($contents, '\*');
}
le funzioni RemoveRTFBlock() e ExtractRTFBlock() però, non riescono ad accedere alla variabile $content (che all'interno delle stesse è dichiarata globals).
Il problema è risolvibile passando per riferimento la variabile $content.
Il codice all'interno della funzione GetRTFPlainText() diventa:
$contents = $this->RemoveRTFBlock('fonttbl',$contents);
$contents = $this->RemoveRTFBlock('colortbl',$contents);
$info_block = $this->ExtractRTFBlock('info',$contents);
$contents = $this->RemoveRTFBlock('info',$contents);
$s1 = 1;
while ($s1 > 0) {
   $contents = $this->RemoveRTFBlock('*',$contents);
   $s1 = strpos($contents, '\*');
}
e il codice delle funzioni RemoveRTFBlock() e ExtractRTFBlock() diventa:
function ExtractRTFBlock($blockname, &$contents) {
   //global $contents;
   $blockname = '{\\' . $blockname;
   $s1 = strpos($contents, $blockname);
   $s2 = strpos($contents, '}}', $s1);
   return substr($contents, $s1, $s2-$s1+1);
 }
 
 function RemoveRTFBlock($blockname, &$contents) {
   //global $contents;
   $blockname = '{\\' . $blockname;
   $s1 = strpos($contents, $blockname);
   $s2 = strpos($contents, '}}', $s1);
   $part1 = substr($contents, 0, $s1-1);
   $part2 = substr($contents, $s2+1);
   return $part1 . $part2;
 }

Attualmente quindi iFile mi indicizza correttamente i file RTF pesanti con immagini nel giro di pochi secondi. Ovviamente le prestazioni saranno ancora molto migliorabili, però per adesso è possibile evitare l'errore di Maximum execution time. (Un file di 15 MB è stato indicizzato con interfaccia mysqli in 35 secondi)

Andrea
Ultima modifica: 30/12/2011 13:05 da trullox.Motivo: tabulazioni corrette del codice php
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Re: Fatal Error con file RTF contenente immagini. 30/12/2011 16:30 #42

  • Giampaolo
  • Avatar di Giampaolo
  • OFFLINE
  • Administrator
  • Messaggi: 465
  • Ringraziamenti ricevuti 43
Ciao Andrea,
grazie per l'aiuto.
L'idea è ottima e funziona.

Volevo solo farti presente che la classe gestisce ad oggi solo le versioni non superiori alla 1.5 degli RTF (ad oggi sembra si sia arrivati alla versione 1.9.1).
Inoltre potresti avere anche tag di apertura, nei file RTF, senza versione specificata e quindi ricevere un messaggio di "File is not a RTF".

Si potrebbe modificare due righe per ovviare a questo problema:
la prima riga è per il controllo sul file:
 function CheckRTFFormat(&$contents) {
 // This function checks whether the format of the file is RTF 
 // Currently supported version is up to 1.5 
   // OLD
   // if (substr($contents, 0, 6) == '{\rtf1') return TRUE; else return FALSE;
   if (substr($contents, 0, 5) == '{\rtf') return TRUE; else return FALSE;
 }

la seconda è presente nella terza riga della funzione "GetRTFPlainText":
function GetRTFPlainText(&$contents) {
   $s1 = strpos($contents, '{', 1);
   $rtf_header = substr($contents, 0, $s1);
   // OLD 
   //if (substr($rtf_header, 0, 6) == '{\rtf1') $rtf_version = 1; else return FALSE;
   if (substr($contents, 0, 5) == '{\rtf') return TRUE; else return FALSE;
.....

Ho provato su alcuni file scaricati dalla rete che non definiscono la versione, e l'unico problema riscontrato è che, se il file non è realmente stato creato nella versione 1.5, si porta dietro alcune informazioni inutili in più.
Ad esempio in alcuni casi riporta anche il binario delle immagini, probabilmente dovuto alla gestione diversa dei TAG.

Noi pensiamo di lasciare il controllo originario ({\rtf1) e modificheremo la documentazione evidenziando che ad oggi IFile parserizza ed indicizza solo file RTF con versioni non superiore alla 1.5 e che contengono il tag di apertura come definito nella classe ({\rtf1).

Grazie ancora per il tuo immenso aiuto.
If you like, if it was useful, consider a donation, Thanks
Se vuoi, se ti siamo stati utili, considera una donazione, Grazie
Help us by voting our extensions on Joomla.org:
JiFile
JoomPhoto Mobile
Easy Language
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.