Apache Tika и метаданные документа - PullRequest
7 голосов
/ 27 февраля 2011

Я занимаюсь простой обработкой различных документов (ODS, MS office, pdf) с помощью Apache Tika.Я должен получить по крайней мере:

word count, author, title, timestamps, language etc.

, что не так просто.Моя стратегия заключается в использовании шаблона метода Template для 6 типов документов, где я сначала нахожу тип документа и на основании этого обрабатываю его индивидуально.

Я знаю, что Apache Tika должен устранить необходимость в этом, ноформаты документов совершенно разные, верно?

Например,

InputStream input = this.getClass().getClassLoader().getResourceAsStream(doc);
ContentHandler textHandler = new BodyContentHandler();
Metadata metadata = new Metadata();
Parser parser = new OfficeParser();
parser.parse(input, textHandler, metadata, new ParseContext());
input.close();

for(String s : metadata.names()) {
    System.out.println("Metadata name : "  + s);
}

Я пытался сделать это для ODS, MS Office, PDF-документов, и метадада сильно отличается.Существует интерфейс MSOffice, в котором перечислены ключи метаданных для документов MS и некоторые списки метаданных Dublic Core .Но как реализовать такое приложение?

Может ли кто-нибудь, кто имеет опыт работы с ним, поделиться своим опытом?Спасибо

1 Ответ

6 голосов
/ 01 апреля 2011

Обычно синтаксические анализаторы должны возвращать один и тот же ключ метаданных для одного и того же вида вещей во всех форматах документов.Однако существуют некоторые виды метаданных, которые встречаются только в некоторых типах файлов, поэтому вы не получите их от других.

Возможно, вы захотите просто использовать AutoDetectParser, а если вам нужно сделать что-то особенное сдескриптор метаданных, который впоследствии основан на типе mime, например,

Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, filename);
ParseContext context = new ParseContext();

Parser parser = new AutoDetectParser();
parser.parse(input, textHandler, metadata, new ParseContext());

if(metadata.get(CONTENT_TYPE).equals("application/pdf")) {
   // Do something special with the PDF metadata here
}
...