![](/img/trans.png)
[英]How to get the embedded pictures from docx file using java open source api like tika?
[英]Java Tika cannot get embedded files from rar file
使用標准實現,我傳遞了一個 doc 文件,其中有一個 image.png 圖像和文本。
使用標准實現,我傳遞了一個 doc 文件,其中有一個 image.png 圖像和文本
為了獲取文件,Tika 使用了內部ParsingEmbeddedDocumentExtractor class,其中使用了parseEmbedded方法。
首先,我實現必要的元素並調用 parse 方法:
//other objects
AutoDetectParser parser = new AutoDetectParser();
ParseContext pc = new ParseContext();
Metadata metadata = new Metadata();
Tika tika = new Tika();
BodyContentHandler ch = new BodyContentHandler(-1);
InputStream is = new FileInputStream(new File("src/main/resources/sample.txt"));
//using
parser.parse(is, ch, metadata, pc);
接下來,如果 Tika 選擇了正確的解析器並在其中調用ParsingEmbeddedDocumentExtractor class,即其parseEmbedded方法。
使用這種方法,如果我的輸入數據是一個文件:1.docx,那么在 output 我可以看到:
1.docx
-image.png
-text
或者如果輸入文件是:222.rar,那么在output我有:
222.rar
-1.docx
-image.png
-text
同時,為了控制提取部分的過程,決定重新定義ParsingEmbeddedDocumentExtractor class ,其關鍵方法parseEmbedded 。
事實證明,我們創建了一個CustomParsingEmbeddedDocumentExtractor並將其保存在 Tika 配置中,以便它替換原始ParsingEmbeddedDocumentExtractor class:
CustomParsingEmbeddedDocumentExtractor customEmbeddedDocExtractor = new CustomParsingEmbeddedDocumentExtractor(pc);
pc.set(EmbeddedDocumentExtractor.class, customEmbeddedDocExtractor);
同時,我沒有在新的 class 內部及其parseEmbedded方法內部進行任何更改。
在相同的輸入數據上測試新的 class 時,我們得到以下 output:
1) input file: 1.doc
output:
1.doc
-image.png
-text
2) inputfile: 222.rar
222.rar
1.doc
比較兩個類的工作,我們得到以下結果:
Result from ParsingEmbeddedDocumentExtractor:
input file: 222.rar
output:
222.rar
-1.docx
-image.png
-text
Result from CustomParsingEmbeddedDocumentExtractor:
input file: 222.rar
output:
222.rar
-1.docx
使用這個新的 class 時,無法從222.rar/1.docx文件中獲取我需要的對象 - 圖像和文本。 同時,如果你使用舊的 ParsingEmbeddedDocumentExtractor class,你可以得到這些元素。
目前尚不清楚是什么導致了結果中的這種差異,這僅僅是因為我只是在創建完全相同的 class 並將其保存以代替新的。 我沒有對我的新 class 進行更改,同時我得到不同的 output 結果。
請告訴我為什么 Tika 無法使用這種方法獲取數據? 可能有人遇到過類似的情況,先謝謝了。
對於 CustomParsingEmbeddedDocumentExtractor class 的完整操作,有必要
將 class 保存到配置中(在 class ParseContext pc 中)
將所需的解析器保存到配置中(在我們的例子中,解析器是 class AutoDetectParser 解析器)
因此,而不是這樣的實現:
CustomParsingEmbeddedDocumentExtractor customEmbeddedDocExtractor = new CustomParsingEmbeddedDocumentExtractor(pc);
pc.set(EmbeddedDocumentExtractor.class, customEmbeddedDocExtractor);
我們需要這樣的實現:
if (pc.get(EmbeddedDocumentExtractor.class) == null) {
Parser p = pc.get(Parser.class);
if (p == null) {
pc.set(Parser.class, parser);
}
CustomParsingEmbeddedDocumentExtractor customEmbeddedDocExtractor = new CustomParsingEmbeddedDocumentExtractor(pc);
pc.set(EmbeddedDocumentExtractor.class, customEmbeddedDocExtractor);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.