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
它提供了以下的輸出:
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