`
Fly_m
  • 浏览: 259683 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用Tika进行非结构化内容的读写-2

    博客分类:
  • java
阅读更多

    前面说了一个tika的大概处理流程,现在可以通过一个它自带的parserTest来看一下具体的走向。以下这段代码,读取某一个pdf文件的内容:

        File file = getResourceAsFile("/test-documents/testPDF.pdf");
        String s1 = ParseUtils.getStringContent(file, tc);//方法1

    直接使用ParseUtils.getStringContent来获取它里面的内容信息。直接进入到此方法:

        String mime = config.getMimeRepository().getMimeType(documentFile).getName();
        return getStringContent(documentFile, config, mime);//方法2

     第一句话,包含几个信息,首先从config中取得所有的mimeType注册器(1),再将待解析的文件传入以取得相应的 mimeType(2),最后取得mimeType的名称(3)。

    1:config参数是传递过来的,即在parserTest中进行了声明,见原文,是通过TikaConfig.getDefaultConfig()方法读取了默认的mimeConfig信息。在这个方法中,会返回一个默认的TikaConfig对象(即new TikaConfig())。进入构造函数:

            ParseContext context = new ParseContext();
            Iterator<Parser> iterator =
                ServiceRegistry.lookupProviders(Parser.class, loader);
            while (iterator.hasNext()) {
                Parser parser = iterator.next();
                for (MediaType type : parser.getSupportedTypes(context)) {
                    parsers.put(type, parser);
                }
            }
        mimeTypes = MimeTypesFactory.create("tika-mimetypes.xml");

 

此代码主要做两件事情,第一个是读取在services中注册的parse的所有实现类,即读取在WETA-INF/services目录下的org.apache.tika.parser.Parser文件。此文件中以列表的方法列出了parser的实现类,即服务提供者。如下所示:

parser服务提供者

    在上图中,列出了所有已经注册的Parser实现类,tika即加载这些类以用作具体的解析。

 

    第二件事即是读取所有的mimeType信息,通过读取resource下的tika-mimeTypes.xml来解析其中每个mimeType以及对于每个mimeType中它应该拥有的信息格式,即根据一定的规则定义一个mimeType与匹配这个mimeType的规则。具体的实现可参考MimeTypesReader的readMimeType(Element element)类(此处略)。

    2:第二个方法根据文件取得具体的mimeType,在这里的简单实现是根据文件的名称来取得mimeType(在实际中对于某些文件后缀名不正确的文件,应该根据文件中的数据来确定mimeType,此处简单用file.getName来进行判断)。

  

    在做完以上工作之后,进入到下个方法:

        InputStream stream = new BufferedInputStream(new FileInputStream(documentFile));
       return getStringContent(stream, config, mimeType);
 

 

再进入到以下方法:

            Parser parser = config.getParser(MediaType.parse(mimeType));
            ContentHandler handler = new BodyContentHandler();//最初的handler
            parser.parse(stream, handler, new Metadata());
            return handler.toString();

 这里最终会调用到具体处理各个文件的parser,这里处理pdf的类为pdfParser,进入到它的parse方法:

        PDDocument pdfDocument = PDDocument.load(stream);
        metadata.set(Metadata.CONTENT_TYPE, "application/pdf");
        extractMetadata(pdfDocument, metadata);
        PDF2XHTML.process(pdfDocument, handler, metadata);

    这里通过apache的pdfbox类来加载文件流,并设置相应的contentType,接下来将读取相应的元数据并保存在metaData中。最后调用pdf2xhtml的静态方法来处理这个pdf文档。

    在extractMetadata中,tika通过PDDocumentInformation类将以下信息读取到metadata中:title,author,CREATOR,KEYWORDS,producer,SUBJECT,trapped,created,CREATION_DATE,LAST_MODIFIED以及其他通过getDictionary方法中未加入的其他信息。

    PDF2XHTML类通过继承PDFTextStripper类来重写相应的方法以达到读取信息的目的,它通过调用getText(document)方法,并重写相应的扩展方法将处理的信息交由handler来处理,最终实现由handler来处理最终的信息。如下个方法所示:

    protected void writeString(String text) throws IOException {
            handler.characters(text);
    }

      这里的handler即是最开始传入的bodyContentHandler,其默认不带参数的handler即this(new WriteOutContentHandler()[A]),最终将会调用到MatchingContentHandler[B]来处理,handler[B]处理完自己需要处理的信息(即过滤其中的某些信息)之后,将其他处理部分交由handler[A]来处理,如在characters中,writeOutContentHandler中的调用代码为:

                writer.write(ch, start, length);
                writeCount += length;

 

即将其写入输出流中。

最后,调用handler的toString方法,输出相应信息,即调用writer.toString()返回输出的信息。

 

至此,程序主要调用逻辑完成。当然,在具体处理中,还会涉及到其他处理,如startElement,endElement等事件的处理,这里未主要涉及,待下来再研究。

  • 大小: 110.9 KB
分享到:
评论
1 楼 stta04 2011-05-31  
好文章,转载了。

相关推荐

    tika-core-1.22.jar_tika_

    Apache Tika本产品包括在以下位置开发的软件Apache软件基金会。版权所有1993-2010大学大气研究公司/ Unidata该软件包含源自UCAR / Unidata的NetCDF库的代码。Tika服务器组件使用CDDL许可的依赖项

    tika读取文件专用包

    - 引入Tika所需的jar包,包括`tika-core`和特定格式的解析器,如`tika-parsers`,这个压缩包中的`mapper-attachments`可能就是针对附件处理的模块。 - 创建`TikaConfig`实例,加载配置信息。 - 创建`Parser`实例...

    tika-app-1.24.1.jar

    检测并提取来自上千种不同文件类型(如...除了用gui进行操作外,还可以在命令行界面中使用java -jar tika-app-1.15.jar --text .doc命令进行文本格式的转换,text为要转变的格式,.doc为你想要转变的文本的物理位置。

    tika-app-1.19.1.jar

    tika-app.1.19.1.jar,轻松提取文本正文的工具。。。。

    tika jar包

    2. **tika-parsers-1.5.jar**: 这个JAR文件包含了Tika的解析器模块,用于实际解析各种文件格式。它集成了多种开源解析库,如Apache POI(处理Microsoft Office格式)、Apache PDFBox(处理PDF)、Apache Tika XMP...

    tika-app-1.16.jar

    tika-app-1.16,java文档内容提取工具jar包,可提取office文档内容

    apache-tika-1.0-src.zip

    在开发搜索引擎时,Tika的文本抽取能力非常关键,因为它可以从非结构化的文档中提取出文本内容,这对于建立索引和搜索至关重要。此外,如果你想要扩展Tika,添加对新文件格式的支持,源代码包是不可或缺的资源。 总...

    apache-tika-1.2-src.zip_ tika-app-1.2_java poi word_tika-app-1.2

    在"apache-tika-1.2-src.zip"这个压缩包中,你将找到Tika的源代码,这对于理解其工作原理和进行自定义扩展非常有帮助。"tika-app-1.2"是Tika的可执行JAR文件,它集成了所有必需的依赖项,可以直接运行,用于处理和...

    apache tika jar包

    Apache Tika 利用现有的解析类库,从不同格式的文档中(例如HTML, PDF, Doc),侦测和提取出元数据和结构化内容。  功能包括:  侦测文档的类型,字符编码,语言,等其他现有文档的属性。  提取结构化的文字内容。...

    tika提取文本内容

    1. **MIME类型识别**:Tika通过使用Apache Tika-Mime库来识别文件的MIME类型,这是确定如何解析文件的关键步骤。MIME类型是一种标准,用来定义文件在网络上传输时的数据类型和格式。 2. **解析器架构**:Tika的解析...

    tika-python绑定到 Apache Tika REST 服务

    要使用这个库,您需要在系统上安装 Java 7+,因为 tika-python 在后台启动 Tika REST 服务器。- 特征 解析器接口(在 REST 之前向后兼容) 解析器接口使用 /rmeta 接口提取文本和元数据 或者,您可以将 Tika 服务器 ...

    tika-java7-1.5.zip

    标题 "tika-java7-1.5.zip" 暗示了这是一个与Apache Tika相关的软件包,且是针对Java 7版本优化的。Apache Tika是一个内容分析工具,主要用于从各种类型的文件中提取元数据和结构化文本。Tika能够处理大量不同的文件...

    apache-tika-0.1-incubating-src.tar.gz_垂直搜索引擎

    在使用"apache-tika-0.1-incubating"这个源码包时,开发者可以了解到Tika最初的设计思想和实现方式,以及如何逐步发展成为现在这样一个成熟且广泛使用的工具。通过阅读源码,开发者可以学习到如何处理文件解析、内容...

    apache-tika-0.8-src.jar

    这个"apache-tika-0.8-src.jar"文件是Tika项目在0.8版本的源代码,它提供了深入理解Tika内部工作原理的机会,对于开发者来说是一个宝贵的资源。 Tika的主要功能: 1. **文件类型检测(MIME Type Detection)**:...

    tika 1.0最新版本

    tika最新版本,tika-app-1.0.jar,提取office和pdf文档内容

    tika-example:使用Apache Tika进行文件类型检测

    "tika-example-master"这个压缩包可能包含了一个完整的示例项目,演示了如何在实际应用中使用Tika进行文件类型的检测和其他相关操作。解压并研究这个项目源码,将有助于你更深入地理解和应用Apache Tika的功能。 ...

    tika-app-1.7.jar

    tika-app-1.7.jar

    tika-app-1.8

    最新tika1.8,可以帮助lucene的开发,提取文档的内容

    springboot+es实现对word,pdf,txt等文件的非结构化数据全文内容检索

    在非结构化数据检索场景下,Elasticsearch能通过分词器对文本进行分析,建立倒排索引,从而实现快速全文搜索。 Spring Boot是基于Spring框架的轻量级开发工具,它简化了初始化、配置和运行过程。集成Elasticsearch...

Global site tag (gtag.js) - Google Analytics