2013-11-24 53 views
1

我有包含文本和图像的ms word文档。我想分析他们有他们的xml结构。经过研究,我最终使用Apache tika转换我的文档。我可以将我的文档解析为xml。这里是我的代码:使用Apache tika在doc文件中获得嵌入式资源

AutoDetectParser parser=new AutoDetectParser(); 
InputStream input=new FileInputStream(new File("1.docx")); 
Metadata metadata = new Metadata(); 
StringWriter sw = new StringWriter(); 
SAXTransformerFactory factory = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); 
TransformerHandler handler = factory.newTransformerHandler(); 
handler.getTransformer().setOutputProperty(OutputKeys.METHOD, "xml"); 
handler.getTransformer().setOutputProperty(OutputKeys.INDENT, "no"); 
handler.setResult(new StreamResult(sw)); 

parser.parse(input, handler, metadata, new ParseContext()); 
String xhtml = sw.toString(); 

我想从文档中提取图像并将它们转换为二进制格式。我不知道如何从文档中提取嵌入式资源。

回答

4

您需要定义自己的类,该类实现Parser并将其附加到解析外部文档时提供的ParseContext。然后你的解析器将被调用所有的嵌入式资源,允许你保存它们,如果你想

我能想到的最好的例子是在Tika CLI中,正如-z(提取)标志所使用的。如果你看看source code for TikaCLI,你正在寻找FileEmbeddedDocumentExtractor作为你的例子。

最简单的代码会是这样的:

final AutoDetectParser parser = new AutoDetectParser(); 

public class ExtractParser extends AbstractParser { 
    private int att = 0; 
    public Set<MediaType> getSupportedTypes(ParseContext context) { 
    // Everything AutoDetect parser does 
    return parser.getSupportedTypes(context); 
    } 
    public void parse(
     InputStream stream, ContentHandler handler, 
     Metadata metadata, ParseContext context) 
     throws IOException, SAXException, TikaException { 
     // Stream to a new file 
     File f = new File("out-" + (++att) + ".bin"); 
     FileOutputStream fout = new FileOutputStream(f); 
     IOUtils.copy(strea, fout); 
     fout.closee(); 
    } 
} 

InputStream input = new FileInputStream(new File("1.docx")); 
Metadata metadata = new Metadata(); 
ParseContext context = new ParseContext(); 
context.set(Parser.class, extractParser); 
parser.parse(input, handler, metadata, context); 

您也可以使用EmbeddedDocumentExtractor接口,如果你喜欢的话,取决于你想要做什么,如果它更好地使用分析器直接

+0

和另一个问题。在解析方法中,可以找出支持类型中声明的输出嵌入文件的格式,并将正确的类型替换为.bin? –

+1

您可以从MimeTypesRegistry – Gagravarr

+0

查找建议的扩展。非常感谢。你是最好的 ;) –