我一直致力于使用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));
}*/
}
}
答案 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());