2013-11-24 87 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

查找建議的擴展。非常感謝。你是最好的 ;) –