我已经能够通过tika-app可执行jar使用以下行提取元数据:
java -jar tika-app-1.13.jar --metadata example_received_regular.msg
打印出所有元数据。但是当我尝试在Java程序中执行相同文件的简单提取时,我没有得到任何文件。
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("org.apache.tika.parser.ocr.TesseractOCRParser");
FileInputStream des = new FileInputStream("/Users/jason/docstore/example_received_regular.msg");
Tika tika = new Tika();
AutoDetectParser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler(-1);
String detected = tika.detect(des);
Metadata tikaMetadata = new Metadata();
parser.parse(des, handler, tikaMetadata, new ParseContext());
String[] names = tikaMetadata.names();
for (String name : names) {
System.out.println(name + ": " + tikaMetadata.get(name));
}
System.out.println(detected);
}
我的第一个想法是tika-parser库在运行时以某种方式不可用,因此我尝试在第一行加载TesseractOCRParser,但该类加载得很好。执行此程序会产生以下输出:
X-Parsed-By: org.apache.tika.parser.EmptyParser
Content-Type: application/octet-stream
application/x-tika-msoffice
这似乎是我可以在任何地方找到的Tika元数据提取的最基本的例子。提取物与罐子一起运行良好,但在本例中没有。我错过了什么吗?
答案 0 :(得分:3)
TikaCLI
程序使用一个特殊的TikaInputStream
对象来填充元数据(与上例中的FileInputStream
不同)。
您可以进行以下更改,以便打印元数据值:
public static void main(String[] args) throws Exception {
File file = new File("/Users/jason/docstore/example_received_regular.msg");
AutoDetectParser parser = new AutoDetectParser();
BodyContentHandler handler = new BodyContentHandler(-1);
Metadata tikaMetadata = new Metadata();
InputStream input = TikaInputStream.get(file, tikaMetadata);
parser.parse(input, handler, tikaMetadata, new ParseContext());
String[] names = tikaMetadata.names();
Arrays.sort(names);
for (String name : names) {
System.out.println(name + ": " + tikaMetadata.get(name));
}
}