Apache Tika 1.7:在zip存档中解析文件

时间:2015-01-23 04:15:52

标签: java scala apache-tika

使用Apache Tika 1.7,如何递归解析zip存档中的文件,直到达到一些递归限制?

递归部分非常重要,因为zip存档可能包含另一个zip存档。

我认为可以使用新的RecursiveParserWrapper完成,但我在网上找不到任何示例 - Jukka的示例here使用的界面与Tika 1.7提供的界面不同

1 个答案:

答案 0 :(得分:1)

理论上,这只是指向Apache Tika Examples page的情况,但现在递归是该页面的only one still to finish。所以,我必须为你抓一个合适的单元测试,然后将其修改为限制

但基本上,您需要的关键类是EmbeddedDocumentExtractor。您需要在ParseContext上提供相应的实现,并将其用于递归。通常情况下,您可以使用ParsingEmbeddedDocumentExtractor,但由于您需要限制,因此需要自定义

尝试类似:

protected class RecurseWithLimits extends ParsingEmbeddedDocumentExtractor {
   protected static final int MAX_DEPTH = 4;
   private int depth;
   private ParseContext context;
   private RecurseWithLimits child;
   protected RecurseWithLimits() {
      this(0, new ParseContext());
   }
   private RecurseWithLimits(int depth, ParseContext context) {
      super(context);
      this.context = context;
      this.depth = depth;
   }
   @Override
   public void parseEmbedded(
        InputStream stream, ContentHandler handler, Metadata metadata, boolean outputHtml)
        throws SAXException, IOException {
       if (child == null) {
          if (depth >= MAX_DEPTH) {
             // Too deep, skip
             return;
          }
          child = new RecurseWithLimits(depth+1);
          context.set(EmbeddedDocumentExtractor,child);
       }
       super.parse(stream,handler,metadata,outputHtml);
   }
}

// In main parsing code
Parser parser = new AutoDetectParser();
InputStream inp = TikaInputStream.get(new File("test.zip"));
ContentHandler text = new BodyContentHandler();
ParseContext context = new ParseContext();
context.set(EmbeddedDocumentExtractor, new RecurseWithLimits());
parser.parse(inp, new Metadata(), text, context);