Tika 简明教程
TIKA - Content Extraction
Tika 使用各种解析器库从给定的解析器中提取内容。它选择合适的解析器来提取给定的文档类型。
对于解析文档,通常使用 Tika facade 类的 parseToString() 方法。下面显示了解析过程中的步骤,这些步骤由 Tika ParsertoString() 方法抽象出来。
抽象解析过程 -
-
最初,当我们将文档传递给 Tika 时,它使用可用的合适类型检测机制并检测文档类型。
-
一旦知道了文档类型,它就会从其解析器存储库中选择合适的解析器。解析器存储库包含使用外部库的类。
-
然后将文档传递给选择解析器的解析器,该解析器将解析内容、提取文本,并针对无法读取的格式抛出异常。
Content Extraction using Tika
下面给出了使用 Tika facade 类从文件中提取文本的程序 -
import java.io.File;
import java.io.IOException;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.xml.sax.SAXException;
public class TikaExtraction {
public static void main(final String[] args) throws IOException, TikaException {
//Assume sample.txt is in your current directory
File file = new File("sample.txt");
//Instantiating Tika facade class
Tika tika = new Tika();
String filecontent = tika.parseToString(file);
System.out.println("Extracted Content: " + filecontent);
}
}
将以上代码另存为 TikaExtraction.java,并从命令提示符处运行它 -
javac TikaExtraction.java
java TikaExtraction
下面给出了 sample.txt 的内容。
Hi students welcome to tutorialspoint
它给你以下输出 -
Extracted Content: Hi students welcome to tutorialspoint
Content Extraction using Parser Interface
Tika 的 parser 包提供了多个接口和类,我们可使用它们来解析文本文档。下面给出了 org.apache.tika.parser 包的框图。
有几个解析器类可用,例如,pdf 解析器、Mp3Passer、OfficeParser 等,可分别解析各自的文档。所有这些类都实现了解析器接口。
CompositeParser
给定的框图显示了 Tika 的通用解析器类: CompositeParser 和 AutoDetectParser 。由于 CompositeParser 类遵循复合设计模式,因此可以将一组解析器实例用作单个解析器。CompositeParser 类还允许访问实现解析器接口的所有类。
parse() method
除了 parseToString(),还可以使用解析器接口的 parse() 方法。此方法的原型如下所示。
parse(InputStream stream, ContentHandler handler, Metadata metadata, ParseContext context)
下表列出了它接受为参数的四个对象。
Sr.No. |
Object & Description |
1 |
InputStream stream 包含文件内容的任何 Inputstream 对象 |
2 |
ContentHandler handler Tika 通过 SAX API 将文档作为 XHTML 内容传给此处理程序,然后使用 SAX API 处理文档。它可以有效地对文档中的内容进行后期处理。 |
3 |
Metadata metadata 元数据对象用作文档元数据的源和目标。 |
4 |
ParseContext context 此对象在客户端应用程序希望自定义解析过程的情况下使用。 |
Example
以下是显示如何使用 parse() 方法的示例。
Step 1 -
要使用此解析器界面的 parse() 方法,请实例化为提供对此界面实现的任何类。
有单独的解析器类,例如 PDFParser、OfficeParser、XMLParser 等。您可以使用其中任何一个文档解析器。或者,您可以使用 CompositeParser 或 AutoDetectParser,它们在内部使用所有解析器类,并使用合适的解析器提取文档的内容。
Parser parser = new AutoDetectParser();
(or)
Parser parser = new CompositeParser();
(or)
object of any individual parsers given in Tika Library
Step 2 -
创建处理程序类对象。以下是三个内容处理程序 -
Sr.No. |
Class & Description |
1 |
BodyContentHandler 此类挑选 XHTML 输出的主体部分,并将该内容写入输出写入器或输出流中。然后,它将 XHTML 内容重定向到另一个内容处理程序实例。 |
2 |
LinkContentHandler 此类检测并挑选 XHTML 文档的所有 H-Ref 标记,并将其转发给像网络爬虫这样的工具使用。 |
3 |
TeeContentHandler 此类有助于同时使用多个工具。 |
由于我们的目标是从文档中提取文本内容,因此,请按如下所示实例化 BodyContentHandler -
BodyContentHandler handler = new BodyContentHandler( );
Step 3 -
按如下所示创建 Metadata 对象 -
Metadata metadata = new Metadata();
Step 4 -
创建任何输入流对象,并将应从中提取的文件传递给它。
FileInputstream
将文件路径作为参数传递以实例化文件对象,并将此对象传递到 FileInputStream 类构造函数中。
Note - 传递到文件对象的路径不应包含空格。
这些输入流类的问题在于不支持随机访问读取,而这是有效处理某些文件格式所必需的。为了解决此问题,Tika 提供了 TikaInputStream。
File file = new File(filepath)
FileInputStream inputstream = new FileInputStream(file);
(or)
InputStream stream = TikaInputStream.get(new File(filename));
Step 5 -
按如下所示创建解析上下文对象 -
ParseContext context =new ParseContext();
Step 6 -
实例化解析器对象,调用解析方法,并传递所有必需的对象,如下面的原型所示 -
parser.parse(inputstream, handler, metadata, context);
以下是使用解析器接口进行内容提取的程序 -
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 ParserExtraction {
public static void main(final String[] args) throws IOException,SAXException, TikaException {
//Assume sample.txt is in your current directory
File file = new File("sample.txt");
//parse 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 file
parser.parse(inputstream, handler, metadata, context);
System.out.println("File content : " + Handler.toString());
}
}
将以上代码保存为 ParserExtraction.java,并从命令提示符中运行它 -
javac ParserExtraction.java
java ParserExtraction
以下是 sample.txt 的内容
Hi students welcome to tutorialspoint
如果您执行上述程序,它将为您提供以下输出 -
File content : Hi students welcome to tutorialspoint