TIKA後設資料提取


除了內容,Tika還可以從一個檔案中提取後設資料。後設資料是什麼,但用檔案所提供的附加資訊。如果我們考慮一個音訊檔案,藝術家名,專輯名,標題下自帶的後設資料。

XMP標準

可延伸後設資料平台(XMP)是用於處理和涉及到的檔案的內容儲存資訊的標準。它是由Adobe系統公司的XMP建立提供了用於定義,建立和後設資料的處理標準。可以嵌入該標準為多種檔案格式,如PDF,JPEG,JPEG,GIF,JPG,HTML等。

Property 類

Tika使用屬性類遵循XMP屬性定義。它提供了PropertyType和值型別列舉捕獲的後設資料的名稱和值。

Metadata 類

這個類實現了各種介面,如ClimateForcast, CativeCommons,Geographic, TIFF 等提供各種後設資料模型的支援。此外,此類提供各種方法來提取一個檔案的內容。

Metadata 名稱

我們可以從它的後設資料物件用的方法()提取一個檔案的所有後設資料的名稱的列表。它返回所有的名字作為一個字串陣列。使用後設資料的名稱,就可以得到使用get()方法的值。它需要一個後設資料的名稱,並返回與它相關聯的值。

String[] metadaNames = metadata.names();

String value = metadata.get(name);

使用解析法提取後設資料

當我們分析一個使用檔案parse(),傳遞一個空的後設資料物件作為一個引數。這種方法提取指定的檔案的後設資料(如果該檔案中包含有),並將它們放置在後設資料物件。因此,在使用parse()解析檔案後,就可以提取該物件的後設資料。

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();

下面給出的是一個完整的程式,從文字檔案中提取後設資料。


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));
      }
   }
}

將以上程式碼儲存為GetMetadata.java並在命令提示字元處使用以下命令執行它:

javac  GetMetadata .java
java  GetMetadata

注意:假設下面的圖片是boy.jpg

jpg

它提供了以下的輸出:

Resolution Units: inch
Compression Type: Baseline
Data Precision: 8 bits
Number of Components: 3
tiff:ImageLength: 1000
Component 2: Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Component 1: Y component: Quantization table 0, Sampling factors 1 horiz/1 vert
Image Height: 1000 pixels
X Resolution: 300 dots
Original Transmission Reference: 53616c7465645f5fd22a84941585d89cc735d889c9d5ac58a01faf2c92ee3c6f9bcb38359bbe1eef
Image Width: 714 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: 714
Content-Type: image/jpeg
Y Resolution: 300 dots

還可以得到想要的後設資料值。

新增新的後設資料值

可以新增使用後設資料類的add()方法新的後設資料值。下面給出的是該方法的語法。在這裡要新增的作者名字。

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

後設資料Metadata類預定義的屬性包括類,如ClimateForcast,CativeCommons,Geographic繼承等,以支援各種資料模型的屬性。下面示出的是從由提卡實施遵循XMP後設資料標準的TIFF影象格式的TIFF介面繼承了軟體資料型別的使用。

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

下面給出的是演示如何將後設資料值新增到一個給定檔案的完整程式。這裡的後設資料元素的列錶被顯示在輸出,這樣就可以增加新的值之後,觀察在列表中的變化。

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()));
   }
}

將以上程式碼儲存為AddMetadata.java類,然後從命令提示字元下執行它:

javac  AddMetadata .java 
java  AddMetadata

假設 example.txt 有下列內容:

Hi students welcome to yiibai

它提供了以下的輸出:

metadata elements of the given file :[Content-Encoding, Content-Type]

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]

設定值,用現有的後設資料元素

可以設定值,使用set()方法在現有的後設資料元素。使用set()方法設定的時間屬性的語法如下:

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

還可以設定多個值,以使用set()方法的屬性。使用set()方法多個值設定為作者屬性的語法如下:

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

下面給出的是一個完整的程式演示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));
      }
   }
}		    		

將以上程式碼儲存為SetMetadata.java並在命令提示字元下執行:

javac  SetMetadata.java 
java  SetMetadata

注意:假設sample.txt 有下列內容:

Hi students welcome to yiibai

在輸出中,可以看到新新增的後設資料元素。

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