使用TIKA从.docx文件中嵌入的图像中获取文本

时间:2015-07-23 04:56:44

标签: nlp apache-poi apache-tika text-extraction

我一直致力于使用Tika处理.docx文件的Text Extractor。它是表格和文本框中基本文本和文本的工作文件,但它不适用于图像。

如何从Image获取文本,tesseract和tika可以用来单独从图像中获取文本,但为此我需要从文档中提取图像。我该怎么做?

如果有人做过这样的事情,请帮忙。

这个代码适用于文本,文本框和表格,但不适用于图像:

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

        //detecting the file type 
        BodyContentHandler handler = new BodyContentHandler(); 
        Metadata metadata = new Metadata(); 

        FileInputStream inputstream=new FileInputStream(new File("D:\\Nidhi\\sw\\ws\\Hello.docx")); 
        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)); 
        }*/
}

}

2 个答案:

答案 0 :(得分:0)

由于我从24小时后努力做到这一点,我想出了一个方法,一个非常简单的方法。因为,Tika建立在POI之上,使用POI可以有效地执行此任务。此外,它不是一个直接的解决方案所以alomost没有可用于此目的的教程,我希望将来没有其他人必须面对这个问题。这是从.docx文档中提取所有图像的运行代码:

public static void getImages() throws Exception {

    XWPFDocument doc=new XWPFDocument(new FileInputStream("D:\\Nidhi\\CDAC\\Images\\test1.docx"));

    List images=doc.getAllPictures();
    int i =0;

    while (i<images.size()) {
        XWPFPictureData pic= (XWPFPictureData) images.get(i);
        System.out.println(pic.getFileName() + "   "+ pic.getPictureType() +"  "+ pic.getData());

        FileOutputStream fos=new FileOutputStream("D:\\Nidhi\\CDAC\\Images\\b" + i+".jpg");
        fos.write(pic.getData());
        i++;
    }
}

此外,如果它适用于所有MS Office 2007+文件,则.doc和此类文件以完全相同的方式使用HWPF。

答案 1 :(得分:0)

您需要在Tika中启用递归才能获取嵌入的图像。最简单的方法通常是使用RecursiveParserWrapper为您完成。

如果您使用它,您的代码将粗略地

    BodyContentHandler handler = new BodyContentHandler(); 
    Metadata metadata = new Metadata(); 

    TikaInputStream input = TikaInputStream.get(new File("D:\\Nidhi\\sw\\ws\\Hello.docx")); 

    Parser wrapped = new AutoDetectParser();
    RecursiveParserWrapper wrapper = new RecursiveParserWrapper(wrapped,
            new BasicContentHandlerFactory(BasicContentHandlerFactory.HANDLER_TYPE.TEXT, 60));

    wrapper.parse(stream, handler, metadata, context);

    // Get metadata from children
    List<Metadata> list = wrapper.getMetadata();
    // Get metadata from main document
    System.out.println("Main doc name is " + metadata.get(TikaCoreProperties.TITLE));

    System.out.println("Contents of the document:" +handler.String());