Tika parsing error: You are calling the part of POI that deals with OOXML. You need to call a different part of POI to process this data

Tika parsing error: You are calling the part of POI that deals with OOXML. You need to call a different part of POI to process this data

我想用 Tika 解析一个 .doc 文件,但它不起作用。

我得到的错误是:

原因:org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException:提供的数据似乎是 OLE2 格式。您正在调用处理 OOXML (Office Open XML) 文档的 POI 部分。您需要调用 POI 的不同部分来处理此数据(例如 HSSF 而不是 XSSF)

我到底需要改变什么?

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.ParseContext;
import org.apache.tika.parser.microsoft.ooxml.OOXMLParser;
import org.apache.tika.sax.BodyContentHandler;

import org.xml.sax.SAXException;

public class TikaDocx {

    public static void main(final String[] args) throws IOException, TikaException, SAXException {

        //detecting the file type
        BodyContentHandler handler = new BodyContentHandler();
        Metadata metadata = new Metadata();
        FileInputStream inputstream = new FileInputStream(new File("C:\test.doc"));
        ParseContext pcontext = new ParseContext();

        //OOXml parser
        OOXMLParser  msofficeparser = new OOXMLParser ();
        msofficeparser.parse(inputstream, handler, metadata,pcontext);
        System.out.println("Contents of the document:" + handler.toString());
        System.out.println("Metadata of the document:");
        String[] metadataNames = metadata.names();

        for(String name : metadataNames) {
            System.out.println(name + ": " + metadata.get(name));
        }
    }
}

您应该只调用显式 Apache Tika 解析器,例如 OOXMLParser,前提是您已经知道该文件是什么以及该文件类型的最佳解析器是什么。

您得到的错误告诉您您正在将基于 OLE2 的 .doc 解析器传递给 Apache Tika 解析器以处理 OOXML 文件,例如 .docx

如果你不知道你的文件类型到底是什么,就像你看起来那样,你应该让 Apache Tika 识别类型 + 为你选择最好的解析器

为此,请更改您当前的显式行

    OOXMLParser  msofficeparser = new OOXMLParser ();
    msofficeparser.parse(inputstream, handler, metadata,pcontext);

自动检测

    AutoDetectParser parser = new AutoDetectParser();
    parser.parse(inputstream, handler, metadata, pcontext);

那就让 Tika 为您做这些辛苦的工作吧!