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