簡體   English   中英

Java Tika 無法從 rar 文件中獲取嵌入文件

[英]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 的完整操作,有必要

  1. 將 class 保存到配置中(在 class ParseContext pc 中)

  2. 將所需的解析器保存到配置中(在我們的例子中,解析器是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM