TIKA - Extração de Metadados
Além do conteúdo, Tika também extrai os metadados de um arquivo. Metadados nada mais são do que informações adicionais fornecidas com um arquivo. Se considerarmos um arquivo de áudio, o nome do artista, o nome do álbum, o título vêm sob os metadados.
Padrões XMP
A Extensible Metadata Platform (XMP) é um padrão para processar e armazenar informações relacionadas ao conteúdo de um arquivo. Foi criado pela Adobe Systems Inc . O XMP fornece padrões para definir, criar e processar metadados . Você pode incorporar este padrão em vários formatos de arquivo, como PDF , JPEG , JPEG , GIF , jpg , HTML etc.
Classe de propriedade
Tika usa a classe Property para seguir a definição da propriedade XMP. Ele fornece os enums PropertyType e ValueType para capturar o nome e o valor de um metadado.
Classe de Metadados
Esta classe implementa várias interfaces como ClimateForcast , CativeCommons, Geographic , TIFF etc. para fornecer suporte para vários modelos de metadados. Além disso, essa classe fornece vários métodos para extrair o conteúdo de um arquivo.
Nomes de Metadados
Podemos extrair a lista de todos os nomes de metadados de um arquivo de seu objeto de metadados usando os nomes de método () . Ele retorna todos os nomes como uma matriz de string. Usando o nome dos metadados, podemos obter o valor usando oget()método. Recebe um nome de metadados e retorna um valor associado a ele.
String[] metadaNames = metadata.names();
String value = metadata.get(name);
Extração de metadados usando o método de análise
Sempre que analisamos um arquivo usando parse (), passamos um objeto de metadados vazio como um dos parâmetros. Este método extrai os metadados do arquivo fornecido (se esse arquivo contiver algum) e os coloca no objeto de metadados. Portanto, depois de analisar o arquivo usando parse (), podemos extrair os metadados desse objeto.
Parser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata(); //empty metadata object
FileInputStream inputstream = new FileInputStream(file);
ParseContext context = new ParseContext();
parser.parse(inputstream, handler, metadata, context);
// now this metadata object contains the extracted metadata of the given file.
metadata.metadata.names();
A seguir está o programa completo para extrair metadados de um arquivo de texto.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;
public class GetMetadata {
public static void main(final String[] args) throws IOException, TikaException {
//Assume that boy.jpg is in your current directory
File file = new File("boy.jpg");
//Parser method parameters
Parser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(file);
ParseContext context = new ParseContext();
parser.parse(inputstream, handler, metadata, context);
System.out.println(handler.toString());
//getting the list of all meta data elements
String[] metadataNames = metadata.names();
for(String name : metadataNames) {
System.out.println(name + ": " + metadata.get(name));
}
}
}
Salve o código acima como GetMetadata.java e execute-o no prompt de comando usando os seguintes comandos -
javac GetMetadata .java
java GetMetadata
Abaixo está o instantâneo de boy.jpg
Se você executar o programa acima, ele fornecerá a seguinte saída -
X-Parsed-By: org.apache.tika.parser.DefaultParser
Resolution Units: inch
Compression Type: Baseline
Data Precision: 8 bits
Number of Components: 3
tiff:ImageLength: 3000
Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Component 1: Y component: Quantization table 0, Sampling factors 2 horiz/2 vert
Image Height: 3000 pixels
X Resolution: 300 dots
Original Transmission Reference:
53616c7465645f5f2368da84ca932841b336ac1a49edb1a93fae938b8db2cb3ec9cc4dc28d7383f1
Image Width: 4000 pixels
IPTC-NAA record: 92 bytes binary data
Component 3: Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
tiff:BitsPerSample: 8
Application Record Version: 4
tiff:ImageWidth: 4000
Content-Type: image/jpeg
Y Resolution: 300 dots
Também podemos obter nossos valores de metadados desejados.
Adicionando Novos Valores de Metadados
Podemos adicionar novos valores de metadados usando o método add () da classe de metadados. A seguir está a sintaxe desse método. Aqui estamos adicionando o nome do autor.
metadata.add(“author”,”Tutorials point”);
A classe Metadata possui propriedades predefinidas, incluindo as propriedades herdadas de classes como ClimateForcast , CativeCommons, Geographic , etc., para oferecer suporte a vários modelos de dados. Abaixo é mostrado o uso do tipo de dados SOFTWARE herdado da interface TIFF implementada pela Tika para seguir os padrões de metadados XMP para formatos de imagem TIFF.
metadata.add(Metadata.SOFTWARE,"ms paint");
A seguir está o programa completo que demonstra como adicionar valores de metadados a um determinado arquivo. Aqui, a lista dos elementos de metadados é exibida na saída para que você possa observar a mudança na lista após adicionar novos valores.
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;
public class AddMetadata {
public static void main(final String[] args) throws IOException, SAXException, TikaException {
//create a file object and assume sample.txt is in your current directory
File file = new File("Example.txt");
//Parser method parameters
Parser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(file);
ParseContext context = new ParseContext();
//parsing the document
parser.parse(inputstream, handler, metadata, context);
//list of meta data elements before adding new elements
System.out.println( " metadata elements :" +Arrays.toString(metadata.names()));
//adding new meta data name value pair
metadata.add("Author","Tutorials Point");
System.out.println(" metadata name value pair is successfully added");
//printing all the meta data elements after adding new elements
System.out.println("Here is the list of all the metadata
elements after adding new elements");
System.out.println( Arrays.toString(metadata.names()));
}
}
Salve o código acima como classe AddMetadata.java e execute-o no prompt de comando -
javac AddMetadata .java
java AddMetadata
A seguir está o conteúdo de Example.txt
Hi students welcome to tutorialspoint
Se você executar o programa acima, ele fornecerá a seguinte saída -
metadata elements of the given file :
[Content-Encoding, Content-Type]
enter the number of metadata name value pairs to be added 1
enter metadata1name:
Author enter metadata1value:
Tutorials point metadata name value pair is successfully added
Here is the list of all the metadata elements after adding new elements
[Content-Encoding, Author, Content-Type]
Definindo Valores para Elementos de Metadados Existentes
Você pode definir valores para os elementos de metadados existentes usando o método set (). A sintaxe para definir a propriedade de data usando o método set () é a seguinte -
metadata.set(Metadata.DATE, new Date());
Você também pode definir vários valores para as propriedades usando o método set (). A sintaxe para definir vários valores para a propriedade Author usando o método set () é a seguinte -
metadata.set(Metadata.AUTHOR, "ram ,raheem ,robin ");
Abaixo está o programa completo que demonstra o método set ().
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.SAXException;
public class SetMetadata {
public static void main(final String[] args) throws IOException,SAXException, TikaException {
//Create a file object and assume example.txt is in your current directory
File file = new File("example.txt");
//parameters of parse() method
Parser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
FileInputStream inputstream = new FileInputStream(file);
ParseContext context = new ParseContext();
//Parsing the given file
parser.parse(inputstream, handler, metadata, context);
//list of meta data elements elements
System.out.println( " metadata elements and values of the given file :");
String[] metadataNamesb4 = metadata.names();
for(String name : metadataNamesb4) {
System.out.println(name + ": " + metadata.get(name));
}
//setting date meta data
metadata.set(Metadata.DATE, new Date());
//setting multiple values to author property
metadata.set(Metadata.AUTHOR, "ram ,raheem ,robin ");
//printing all the meta data elements with new elements
System.out.println("List of all the metadata elements after adding new elements ");
String[] metadataNamesafter = metadata.names();
for(String name : metadataNamesafter) {
System.out.println(name + ": " + metadata.get(name));
}
}
}
Salve o código acima como SetMetadata.java e execute-o no prompt de comando -
javac SetMetadata.java
java SetMetadata
Abaixo está o conteúdo de example.txt.
Hi students welcome to tutorialspoint
Se você executar o programa acima, terá a seguinte saída. Na saída, você pode observar os elementos de metadados recém-adicionados.
metadata elements and values of the given file :
Content-Encoding: ISO-8859-1
Content-Type: text/plain; charset = ISO-8859-1
Here is the list of all the metadata elements after adding new elements
date: 2014-09-24T07:01:32Z
Content-Encoding: ISO-8859-1
Author: ram, raheem, robin
Content-Type: text/plain; charset = ISO-8859-1