首页 > 其他分享 >文件中文本提取

文件中文本提取

时间:2022-10-15 17:44:08浏览次数:64  
标签:文件 inputStream return String text filename 提取 文本 public

由于最近在写一个全文检索的项目,需要添加对非结构化数据源的数据采集,所以就暂时整理一下对常见文件的文本数据提取。

引入依赖

// 文件数据提取
implementation 'org.apache.poi:poi:5.2.2'
implementation 'org.apache.poi:poi-ooxml:5.2.2'
implementation 'org.apache.poi:poi-scratchpad:5.2.2'
implementation 'org.apache.pdfbox:pdfbox:2.0.26'

创建一个文件数据提取接口

public interface DataCollect {

    String getContent(InputStream inputStream,String filename);

    String getType();
}

PDF文件数据提取实现类

@Slf4j
public class PdfDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream, String filename) {
        return getPDFContent(inputStream, filename);
    }

    @Override
    public String getType() {
        return "pdf";
    }

    private String getPDFContent(InputStream inputStream, String filename) {
        StringBuffer content = new StringBuffer();
        try (PDDocument document = PDDocument.load(inputStream);) {
            // 获取页码
            int pages = document.getNumberOfPages();
            // 读文本内容
            PDFTextStripper stripper = new PDFTextStripper();
            // 设置按顺序输出
            stripper.setSortByPosition(true);
            for (int i = 1; i <= pages; i++) {
                stripper.setStartPage(i);
                stripper.setEndPage(i);
                content.append(stripper.getText(document));
            }

        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }

        return content.toString();
    }

}

doc文件文本提取实现类

@Slf4j
public class DocDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream,String filename) {
        String text = "";
        try (WordExtractor exr = new WordExtractor(inputStream)) {

            text = exr.getText();
        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }
        return text;
    }

    @Override
    public String getType() {
        return "doc";
    }
}

docx文件文本数据提取实现类

@Slf4j
public class DocxDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream, String filename) {
        String text = "";
        try (XWPFDocument doc = new XWPFDocument(inputStream);
             XWPFWordExtractor workbook = new XWPFWordExtractor(doc);) {

            text = workbook.getText();
        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }
        return text;
    }

    @Override
    public String getType() {
        return "docx";
    }
}

ppt文件文本数据提取实现类

@Slf4j
public class PptDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream,String filename) {
        String text = "";
        try (HSLFSlideShow hss = new HSLFSlideShow(inputStream);
             SlideShowExtractor slideShowExtractor = new SlideShowExtractor(hss);) {

            //得到全部文本
            text = slideShowExtractor.getText();
        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }
        return text;
    }

    @Override
    public String getType() {
        return "ppt";
    }

}

pptx文件文本数据提取实现类

@Slf4j
public class PptxDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream, String filename) {
        String text = "";
        try (XMLSlideShow xss = new XMLSlideShow(inputStream);
             SlideShowExtractor slideShowExtractor = new SlideShowExtractor(xss);) {

            //得到全部文本
            text = slideShowExtractor.getText();
        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }

        return text;
    }

    @Override
    public String getType() {
        return "pptx";
    }

}

xls文件文本数据提取实现类

@Slf4j
public class XlsDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream, String filename) {
        String text = "";
        try (HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inputStream));
             ExcelExtractor extractor = new ExcelExtractor(wb);) {

            extractor.setFormulasNotResults(false);
            extractor.setIncludeSheetNames(false);
            text = extractor.getText();
        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }
        return text;
    }

    @Override
    public String getType() {
        return "xls";
    }
}

xlsx文件文本数据提取实现类

@Slf4j
public class XlsxDataCollect implements DataCollect {
    @Override
    public String getContent(InputStream inputStream, String filename) {
        String text = "";
        try (XSSFWorkbook workBook = new XSSFWorkbook(inputStream);
             XSSFExcelExtractor extractor = new XSSFExcelExtractor(workBook);) {

            extractor.setIncludeSheetNames(false);
            text = extractor.getText();
        } catch (Exception e) {
            log.error("文件【" + filename + "】提取文本数据失败", e);
            return "";
        }
        return text;
    }

    @Override
    public String getType() {
        return "xlsx";
    }
}

文件数据提取管理类

@Slf4j
public class DataCollectManager {
    private static final List<DataCollect> dataCollectList = new ArrayList<>();

    public static void add(DataCollect dataCollect) {
        dataCollectList.add(dataCollect);
    }

    public static List<DataCollect> get() {
        return dataCollectList;
    }

    public static DataCollect getDataCollect(String accessType) {
        for (DataCollect dataCollect : dataCollectList) {
            if (dataCollect.getType().contains(accessType)) {
                return dataCollect;
            }
        }
        return null;
    }

    public static String getContent(String filename, InputStream inputStream) {
        final String fileType = FilenameUtils.getExtension(filename);
        final DataCollect dataCollect = getDataCollect(fileType);
        if (Objects.isNull(dataCollect)) {
            log.error("没有适配该文件【" + filename + "】类型的文本数据提取");
            return "";
        }
        return dataCollect.getContent(inputStream, filename);
    }
}

初始化文件提取实现类

配置文本数据提取实现类

在resource文件夹在创建META-INF\services文件夹,在并在里面创建一个 com.tfswx.fulltextsearch.infrastructure.elasticsearch.data.DataCollect文件(就是DataCollect的全类名),在文件中配置该接口所有实现类的全类名

加载文本数据实现类

@PostConstruct
private void loadDataCollect() {
    if (CollUtil.isEmpty(DataCollectManager.get())) {
        final ServiceLoader<DataCollect> serviceLoader = ServiceLoader.load(DataCollect.class);
        for (DataCollect dataCollect : serviceLoader) {
            DataCollectManager.add(dataCollect);
        }
    }
}

标签:文件,inputStream,return,String,text,filename,提取,文本,public
From: https://www.cnblogs.com/purple910/p/16794642.html

相关文章

  • Python-处理Excel文件
    处理Excel文件常见的Excel包:OpenPyXL是个读写Excel2010xlsx/xlsm/xltx/xltm的Python库,简单易用,功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护......
  • python学习:获取指定目录下所有文件名os.walk和os.listdir
    1.os.walk返回指定路径下所有文件和子文件夹中所有文件列表其中文件夹下路径如下:importosdeffile_name_walk(file_dir):forroot,dirs,filesinos.walk(f......
  • C语言文件基本操作
    什么是文件与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等。文件通常具有点+三个字母的文件扩展名,用于指示文件类型(......
  • 03文本数据操作
    1<!doctypehtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<metaname="viewport"6content="width=device-width,user-sca......
  • Linux的/etc/services文件的作用?
    /etc/services文件保存了服务和端口的对应关系。/etc/services作用/etc/services文件保存了服务和端口的对应关系。但是通常服务的配置文件里会自行定义端口。那么两者......
  • SpringBoot之Logback 日志文件配置
    Logback概述Logback是由log4j的创始人设计的另一个开源的日志组件,官方网站是:http://logback.qos.ch。它当前分为下面下个模块:logback-core:其他两个模块的基础模块l......
  • 文件路径中的斜杠和反斜杠有什么区别
    Unix使用斜杆/作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用斜杆/作为分隔符。Windows由于使用斜杆/作为DOS命令提示符的参数标志了,......
  • Linux文件系统与日志分析详解
    一、inode(索引节点/i节点)与block(块)1.inode与block的概念1.1什么是block?文件储存在硬盘上的,硬盘最小的存储单位叫“扇区”,每个扇区存储512个字节一般连续8个扇区会组......
  • 批量创建文件夹
    打开一个空白Excel,编辑需要创建的文件夹名  编辑创建文件夹的命令符,创建文件夹使用MD命令符公式为:="MD"&A2  按键WIN+R,打开CMD命令行窗口、或者按住shift健......
  • wireshark在window7SP1系统启动提示缺少库文件解决办法
    一、系统环境和问题现象:win7SP1Wireshark-win64-3.4.5.exe在启动wireshare时提示丢失dll 二、解决过程:1、根据报错说丢失这个api-ms-win-crt-runtimel1-1-0.dll,看......