报错:java.lang.NoSuchMethodError: ‘org.apache.poi.poifs.filesystem.DirectoryNode

最近做全文检索功能,使用Tika做的文件内容抽取,项目的其他位置使用了POI,Tika读取doc文件时报错提示:POI版本冲突

java.lang.NoSuchMethodError: 'org.apache.poi.poifs.filesystem.DirectoryNode

研究了一些资料

Apache Tika是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了POI, Pdfbox
并且为文本抽取工作提供了一个统一的界面。其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。

Tika提供了对如下文件格式的支持:

PDF - 通过Pdfbox、MS-* - 通过POI、HTML -使用nekohtml将不规范的html整理成为xhtml、OpenOffice 格式 - Tika提供、Archive - zip, tar, gzip, bzip等、RTF - Tika提供、Java class - Class解析由ASM完成、Image -只支持图像的元数据抽取。

因为Tika集成了POI,所以在使用的时候导致Tika和POI的版本发生了冲突,出现上面的报错。有些建议说若原工程内使用过POI工具,需要把原POI依赖先清空,避免依赖冲突。
但是我不想改变之前的代码,所以打算曲线救国,使用POI单独对doc格式的文件进行处理(因为Tika处理docx、pdf等文件时没有报错)
导入poi相关的jar包,pom.xml引入如下:

		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.8</version>
        </dependency>

通过poi获取word文本内容如下:

public static String parseContent(File f,String fileType){
        String content =null;
        try{
            InputStream stream = FileUtils.openInputStream(f);
             /* 判断类型是doc就使用poi,否则使用tika*/
            if (fileType.equals("doc")){
                content =parseDoc(stream);
            }
            if (content == null){
                content =parseContent(stream);
            }
        }catch (Exception e){
            System.err.println("error"+e);
        }
        return content;
    }
    
 /* poi读取file*/
public static String parseDoc(InputStream stream) throws IOException {
        try {
            HWPFDocument doc = new HWPFDocument(stream);
            /*String doc1 = doc.getDocumentText();
            System.out.println(doc1);
            StringBuilder doc2 = doc.getText();
            System.out.println(doc2);*/
            Range rang = doc.getRange();
            String doc3 = rang.text();
            System.out.println(doc3);
            return doc3;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

 /* tika读取file*/
public static String parseContent(InputStream stream){
        String content =null;
        try{
            AutoDetectParser parser = new AutoDetectParser();
            BodyContentHandler handler = new BodyContentHandler(Integer.MAX_VALUE);
            Metadata metadata = new Metadata();
            parser.parse(stream, handler, metadata);
            content = handler.toString();
        }catch (Exception e){
            System.err.println("tika parse error"+e);
        }
        return content;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值