Apache Tika: un toolkit Java per l’analisi del contenuto dei documenti digitali

Apache Tika: un toolkit Java per l’analisi del contenuto dei documenti digitali

Apache Tika è un progetto Open Source che ha come obiettivo l'estrazione del contenuto testuale e dei metadati da vari tipi di formati di dati (quali ad esempio documenti word, pdf, excel ma anche da immagini e file audio), il tutto utilizzando delle librerie di parsing esterne (cioè già sviluppate e pronte all'uso).Tra le altre funzionalità del toolkit vi è quella di poter riconoscere il tipo di formato di file che si sta analizzando e la lingua utilizzata.

Apache PDFBox: una libreria Java per lavorare con i documenti PDF
Java Decompiler: un decompilatore per Java
iReport: creare report in Java utilizzando un Editor Visuale

Apache Tika è un progetto Open Source che ha come obiettivo l’estrazione del contenuto testuale e dei metadati da vari tipi di formati di dati (quali ad esempio documenti word, pdf, excel ma anche da immagini e file audio), il tutto utilizzando delle librerie di parsing esterne (cioè già sviluppate e pronte all’uso).

Tra le altre funzionalità del toolkit vi è quella di poter riconoscere il tipo di formato di file che si sta analizzando e la lingua utilizzata.

Inizialmente era un sotto-progetto di Apache Lucene ma col tempo è diventato un progetto a sé stante, possiamo trovare i riferimenti e la pagina di download a questo indirizzo:

http://tika.apache.org/

la versione che utilizzeremo in questo articolo è la 0.9 .

A differenza di molti progetti Apache non viene fornita una versione binaria (un jar per inderderci) che possa essere subito utilizzato nelle nostre applicazione, ma il progetto va sottoposto a processo di build utilizzando il toolkit Maven.

Ottenuto Maven e dopo esserci posizionati nella cartella principale di Tika (i sorgenti li possiamo scaricare qui: http://www.apache.org/dyn/closer.cgi/tika/apache-tika-0.9-src.zip) non resta che dare il comando:

mvn install

Prima di dare il comando, per evitare errori di superamento della memoria disponibile (Error – Java Heap Size error), incrementiamo lo heap size:

set MAVEN_OPTS=-Xmx256m

completato il processo di building, otteniamo una directory in cui abbiamo diversi jar:

  • tika-core/target/tika-core-0.9.jar: contiene le classi e le interfacce core di Tika ma nessuna implementazione dei Parser, l’unica dipendenza è una JVM 1.5;
  • tika-parsers/target/tika-parsers-0.9.jar: una collezione di classi che implementano la interfaccia Parser e si basano su una serie di librerie di parsing esterne (quali Apache POI);
  • tika-app/target/tika-app-0.9.jar: combina i due jar di sopra in un singolo jar eseguibile da riga di comando e di cui ne esiste anche una versione con GUI;
  • tika-bundle/target/tika-bundle-0.9.jar: un bundle OSGI utilizzabile all’interno di un ambiente OSGI.

I parser disponibili sono elencati in questa tabella [1]:

FormatoDescrizione
Microsoft® Excel® (application/vnd.ms-excel)Il supporto ai fogli Excel è disponibile in tutte le versioni di Tika ed è basato sulla libreria HSSF di Apache POI.
Microsoft Word® (application/msword)Il supporto ai documenti Word è disponibile in tutte le versioni di Tika ed è basato sulla libreria HWPF di Apache POI.
Microsoft PowerPoint® (application/vnd.ms-powerpoint)Il supporto alle presentazioni PowerPoint è disponibile in tutte le versioni di Tika ed è basato sulla libreria HSLF di Apache POI.
Microsoft Visio® (application/vnd.visio)Il supporto ai diagrammi Visio è stato aggiunto in Tika V0.2 ed è basato sulla libreria HDGF di Apache POI.
Microsoft Outlook® (application/vnd.ms-outlook)Il supporto ai messaggi Outlook è stato aggiunto in Tika V0.2 ed è basato sulla libreria HSMF di Apache POI.
GZIP compression (application/x-gzip)Il supporto a GZIP è stato aggiunto in Tika ed è basato sulla classe GZIPInputStream che si trova nella libreria standard di  Java 5.
bzip2 compression (application/x-bzip)Il supporto a bzip2 è stato aggiunto in Tika ed è basato sul codice di parsing bzip2 di Apache Ant, which originariamente basata su di un lavoro di Keiron Liddle di Aftex Software.
MP3 audio (audio/mpeg)Il parsing dei tag ID3v1 da file MP3 è stato aggiunto  in Tika V0.2. Se trovati, i seguenti metadata sono estratti:

  • TITLE Titolo
  • SUBJECT Soggetto
MIDI audio (audio/midi)Tika usa il supporto ai MIDI in javax.audio.midi per il parsing di sequenze MIDI. Molti file utilizzati dai karaokesono basati sui MIDI e contengono i testi come testo embedded che Tika sà come estrarre.
Wave audio (audio/basic)Tika supporta file di tipo wave audio (.wav files, etc.) utilizzando il package javax.audio.sampled .
Extensible Markup Language (XML) (application/xml)Tika usa la classe javax.xml per il parsing di file XML.
HyperText Markup Language (HTML) (text/html)Tika usa la libreria CyberNekoper il parsing di file HTML.
Images (image/*)Tika usa la classe javax.image.io per estrarre i metadata dai file immagine.
Java class filesIl parsing dei file .class Java è basato sulla libreria ASM e grazie al lavoro di Dave Brosius nella JCR-1522.
Java Archive FilesIl parsing dei file JAR è ottenuto utilizzando una combinazione delle classi di parsing dei file ZIP e dei file Java.
OpenDocument (application/vnd.oasis.opendocument.*)Tika usa le feature built-in ZIP e XML fdel linguaggio Java per il parsing dei documenti in formato OpenDocument usati da OpenOffice V2.0 e successiva. I formati precedente usati da OpenOffice V1.0 sono anch’essi supportati, sebbene essi non sono riconosciuti bene automaticamente come i formati più recenti.
Plain text (text/plain)Tika usa la libreria International Components for Unicode Java library (ICU4J) per il parsing del testo non formattato (plain text).
Portable Document Format (PDF) (application/pdf)Tika usa la libreria PDFBox per il parsing di documenti PDF.
Rich Text Format (RTF) (application/rtf)Tika usa la libreria Java Swing per il parsing di documenti RTF.
TAR (application/x-tar)Tika usa una versione adattata del codice di parsing TAR di Apache Ant per il parsing di file TAR. Il codice TAR è basato su di un lavoro di Timothy Gerard Endres.
ZIP (application/zip)Tika usa le classi  Java’s built-in ZIP per il parsing di file ZIP.

E’ possibile utilizzare il toolkit anche come tool stand alone utilizzando il jar tika-app-0.9.jar; posizioniamoci nella directory base e diamo il comando:

java -jar tika-app/target/tika-app-0.9.jar --help

otterremo una breve guida sull’utilizzo del toolkit:

Output del comando help

Possiamo provarne l’utilizzo dando come parametro il nome del file da analizzare, ad esempio utilizziamo il file README.txt che si trova nella stessa directory principale:

java -jar tika-app/target/tika-app-0.9.jar README.txt

di default viene assunta l’opzione -x  (preposta al nome del file) quindi viene fornito l’output come formato XHTML, se lo vogliamo in testo pure diamo l’opzione -t, se vogliamo invece conoscere i metadati del file diamo l’opzione -m:

I metadati estrapolati dal file README

Utilizziamo ora le librerie jar all’interno di un progetto Java che realizzeremo utilizzando Eclipse.

Creiamo un nuovo Progetto Java in Eclipse (File -> New -> Java Project), creiamo una cartella lib e vi copiamo le libreria tika-core-0.9.jar, tika-parsers-0.9.jar e tika-app-0.9.jar, per cui avremo le seguenti librerie nella cartella lib (non dimentichiamoci di includerle nel Build Path del nostro progetto: click col tasto destro -> Build Path -> Configure Build Path):

  • tika-core-0.9.jar;
  • tika-parsers-0.9.jar;
  • tika-app-0.9.jar.

Creiamo unaclasse Java TikaExample e scriviamo il codice seguente:


package it.appuntisoftware;

import java.io.File;
import java.net.URL;
import org.apache.tika.Tika;
import org.apache.tika.language.LanguageIdentifier;
import org.apache.tika.metadata.Metadata;

public class TikaExample {
  public static void main (String args[]){
    File file;
    try {
         file = new File("C:/nomedirectory/nomefile.doc");
         URL url = file.toURI().toURL();
         Tika tika = new Tika();
         String content = tika.parseToString(file);
         LanguageIdentifier ld = new LanguageIdentifier(content);
         System.out.println("Lingua        :t"+ld.getLanguage());
         Metadata met = new Metadata();
         tika.parse(url.openStream(), met);
         System.out.println("Tipo File     :t"+met.get(Metadata.CONTENT_TYPE));
         System.out.println("Titolo        :t"+met.get(Metadata.TITLE));
         System.out.println("Autore        :t"+met.get(Metadata.AUTHOR));
         System.out.println("Numero pagine :t"+met.get(Metadata.PAGE_COUNT));
         System.out.println("Data Creazione:t"+met.get(Metadata.CREATION_DATE));
         } catch (Exception e) {
         System.out.println( e.getLocalizedMessage() + " " + e.getCause());
         }
    }
}

Non ci resta che provare a lanciare il nostro programma tramite tasto destro sul progetto e poi Run as-> Java Application e vederne l’output, nel mio caso ottengo:

Lingua        :	it
Tipo File     :	application/msword
Titolo        :	Test per Tika
Autore        :	AppuntiSoftware.it
Numero pagine :	3
Data Creazione:	Fri Apr 30 11:22:00 CEST 2010

Basta cambiare il nome ed il percorso del file con il proprio esempio.

E’ inoltre possibile estrarre il contenuto di pagine web andando ad eliminare la conversione da File a URL, ed utilizzando un oggetto di tipo URL direttamente:

URL url= new URL("http://tika.apache.org/");

Per poter estrarre il contenuto di un qualsivoglia documento basta utilizzare la riga di codice:

String content = tika.parseToString(file);

nella variabile content avremo il contenuto del file in esame.

Riferimenti

[1]Understanding information content with Apache Tika: http://www.ibm.com/developerworks/opensource/tutorials/os-apache-tika/

COMMENTS

WORDPRESS: 0