TIKA - Extracción de metadatos

Además del contenido, Tika también extrae los metadatos de un archivo. Los metadatos no son más que la información adicional proporcionada con un archivo. Si consideramos un archivo de audio, el nombre del artista, el nombre del álbum y el título se incluyen en los metadatos.

Estándares XMP

La Plataforma de metadatos extensible (XMP) es un estándar para procesar y almacenar información relacionada con el contenido de un archivo. Fue creado por Adobe Systems Inc . XMP proporciona estándares para definir, crear y procesar metadatos . Puede incrustar este estándar en varios formatos de archivo como PDF , JPEG , JPEG , GIF , jpg , HTML , etc.

Clase de propiedad

Tika usa la clase Property para seguir la definición de propiedad XMP. Proporciona las enumeraciones PropertyType y ValueType para capturar el nombre y el valor de un metadato.

Clase de metadatos

Esta clase implementa varias interfaces como ClimateForcast , CativeCommons, Geographic , TIFF, etc. para proporcionar soporte para varios modelos de metadatos. Además, esta clase proporciona varios métodos para extraer el contenido de un archivo.

Nombres de metadatos

Podemos extraer la lista de todos los nombres de metadatos de un archivo de su objeto de metadatos usando los nombres de método () . Devuelve todos los nombres como una matriz de cadenas. Usando el nombre de los metadatos, podemos obtener el valor usando elget()método. Toma un nombre de metadatos y devuelve un valor asociado a él.

String[] metadaNames = metadata.names();

String value = metadata.get(name);

Extraer metadatos mediante el método Parse

Siempre que analizamos un archivo usando parse (), pasamos un objeto de metadatos vacío como uno de los parámetros. Este método extrae los metadatos del archivo dado (si ese archivo contiene alguno) y los coloca en el objeto de metadatos. Por lo tanto, después de analizar el archivo usando parse (), podemos extraer los metadatos de ese 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 continuación se muestra el programa completo para extraer metadatos de un archivo 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));
      }
   }
}

Guarde el código anterior como GetMetadata.java y ejecútelo desde el símbolo del sistema usando los siguientes comandos:

javac  GetMetadata .java
java  GetMetadata

A continuación se muestra la instantánea de boy.jpg

Si ejecuta el programa anterior, le dará el siguiente resultado:

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

También podemos obtener nuestros valores de metadatos deseados.

Agregar nuevos valores de metadatos

Podemos agregar nuevos valores de metadatos usando el método add () de la clase de metadatos. A continuación se muestra la sintaxis de este método. Aquí estamos agregando el nombre del autor.

metadata.add(“author”,”Tutorials point”);

La clase de metadatos tiene propiedades predefinidas, incluidas las heredadas de clases como ClimateForcast , CativeCommons, Geographic , etc., para admitir varios modelos de datos. A continuación se muestra el uso del tipo de datos SOFTWARE heredado de la interfaz TIFF implementada por Tika para seguir los estándares de metadatos XMP para formatos de imagen TIFF.

metadata.add(Metadata.SOFTWARE,"ms paint");

A continuación se muestra el programa completo que demuestra cómo agregar valores de metadatos a un archivo determinado. Aquí, la lista de los elementos de metadatos se muestra en la salida para que pueda observar el cambio en la lista después de agregar nuevos 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()));
   }
}

Guarde el código anterior como clase AddMetadata.java y ejecútelo desde el símbolo del sistema -

javac  AddMetadata .java 
java  AddMetadata

A continuación se muestra el contenido de Example.txt

Hi students welcome to tutorialspoint

Si ejecuta el programa anterior, le dará el siguiente resultado:

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]

Establecer valores para elementos de metadatos existentes

Puede establecer valores para los elementos de metadatos existentes utilizando el método set (). La sintaxis para establecer la propiedad de la fecha usando el método set () es la siguiente:

metadata.set(Metadata.DATE, new Date());

También puede establecer varios valores para las propiedades utilizando el método set (). La sintaxis para establecer varios valores en la propiedad Author utilizando el método set () es la siguiente:

metadata.set(Metadata.AUTHOR, "ram ,raheem ,robin ");

A continuación se muestra el programa completo que demuestra el 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));
      }
   }
}

Guarde el código anterior como SetMetadata.java y ejecútelo desde el símbolo del sistema -

javac  SetMetadata.java 
java  SetMetadata

A continuación se muestra el contenido de example.txt.

Hi students welcome to tutorialspoint

Si ejecuta el programa anterior, le dará el siguiente resultado. En la salida, puede observar los elementos de metadatos recién agregados.

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