SpringBoot整合Tika实现对文件类型校验和元数据读取

一、什么是Tika

Tika是Apache下开源的文档处理工具,支持多种格式文件的内容解析,主要功能包括文档类型检测、内容提取、元数据提取、语言检测。

Tika是一个具有内置解析器用于处理各种文档类型的程序框架。该框架公布了标准的API供应用程序调用并完成从文档中提取文本和元数据,内置解析器会在后台通过外部程序提供的API与之交互。这使得你的应用程序能够针对不同的文档类型使用相同的API。当程序需要从文档中提取文本时,Tika会找到相应的解释器。

二、SpringBoot如何整合Tika

2.1 添加pom依赖

        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-core</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tika</groupId>
            <artifactId>tika-parsers-standard-package</artifactId>
            <version>2.8.0</version>
        </dependency>

2.2 添加tika配置文件

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <encodingDetectors>
        <encodingDetector class="org.apache.tika.parser.html.HtmlEncodingDetector">
            <params>
                <param name="markLimit" type="int">64000</param>
            </params>
        </encodingDetector>
        <encodingDetector class="org.apache.tika.parser.txt.UniversalEncodingDetector">
            <params>
                <param name="markLimit" type="int">64001</param>
            </params>
        </encodingDetector>
        <encodingDetector class="org.apache.tika.parser.txt.Icu4jEncodingDetector">
            <params>
                <param name="markLimit" type="int">64002</param>
            </params>
        </encodingDetector>
    </encodingDetectors>
</properties>

 2.3 增加Tika的配置类

package com.lh.config;

import org.apache.tika.Tika;
import org.apache.tika.config.TikaConfig;
import org.apache.tika.detect.Detector;
import org.apache.tika.exception.TikaException;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStream;


/**
 * @author LH
 */
@Configuration
public class MyTikaConfig {

    @Autowired
    private ResourceLoader resourceLoader;

    @Bean
    public Tika tika() throws TikaException, IOException, SAXException {
        Resource resource = resourceLoader.getResource("classpath:tika-config.xml");
        InputStream inputStream = resource.getInputStream();
        TikaConfig config = new TikaConfig(inputStream);
        // 校验器
        Detector detector = config.getDetector();
        // 解析器
        Parser autoDetectParser = new AutoDetectParser(config);
        return new Tika(detector, autoDetectParser);
    }
}

 2.4 定义校验文件类型的工具类

package com.lh.service;

import com.lh.constant.FileTypeConst;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.tika.Tika;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author LH
 */
@Slf4j
public class FileTypeCheck {

    private static List<String> list = new ArrayList<>(20);

    static {
        list.add(FileTypeConst.FILE_TYPE_XLS);
        list.add(FileTypeConst.FILE_TYPE_XLSX);
        list.add(FileTypeConst.FILE_TYPE_DOC);
        list.add(FileTypeConst.FILE_TYPE_DOCX);
        list.add(FileTypeConst.FILE_TYPE_PDF);
        list.add(FileTypeConst.FILE_TYPE_JSON);
        list.add(FileTypeConst.FILE_TYPE_XML);
        list.add(FileTypeConst.FILE_TYPE_SVG);
        list.add(FileTypeConst.FILE_TYPE_PNG);
    }


    public static void getFileTypeByFileName(final String fileName, MultipartFile mFile) {
        Tika defaultTika = new Tika();
        String fileType;
        final File file = new File(fileName);
        try {
            FileUtils.copyInputStreamToFile(mFile.getInputStream(), file);
            fileType = defaultTika.detect(file);

            if (!list.contains(fileType)) {
                throw new RuntimeException("请上传正确的文件类型!!!");
            }

        } catch (IOException e) {
            log.error("getFileTypeByFileName exception:", e);
        } finally {
            if (file.exists()) {
                file.delete();
            }
        }
    }

}

 2.5 定义支持的文件类型常量

package com.lh.constant;

/**
 * @author LH
 */
public class FileTypeConst {
    public static final String FILE_TYPE_XLS = "application/vnd.ms-excel";
    public static final String FILE_TYPE_XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    public static final String FILE_TYPE_DOC = "application/msword";
    public static final String FILE_TYPE_DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
    public static final String FILE_TYPE_PDF = "application/pdf";
    public static final String FILE_TYPE_JSON = "application/json";
    public static final String FILE_TYPE_XML = "application/xml";
    public static final String FILE_TYPE_PNG = "image/png";
    public static final String FILE_TYPE_SVG = "image/svg";
}

 2.6 写controller层测试

2.6.1 测试文件类型

    /**
     * 文件校验
     *
     * @param file
     * @throws IOException
     */
    @PostMapping("import")
    public void importExcel(MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        FileTypeCheck.getFileTypeByFileName(fileName, file);
    }

调接口测试,判断当前文件类型是否在支持的文件类型常量中

识别出当前的文件类型为“application.json”

2.6.2 读取源文件数据

    /**
     * Apache tika
     * 轻松实现各种文档内容解析和校验
     *
     * @throws Exception
     */
    @GetMapping("getTika")
    public void getTika() throws Exception {
        Path path = Paths.get("F:\\Java_High\\Course\\46 tika轻松实现各种文档内容解析和校验\\tikademo\\src\\main\\resources", "application.yml");
//        Path path = Paths.get("C:\\Users\\LH\\Desktop\\","test.json");
        String back = tika.parseToString(path.toFile());
        System.out.println("校验文件:");
        System.out.println(back);
    }

ApiPost调接口测试

 

 如图,实现了对文件数据的提取。

三、总结

以上,就是SpringBoot整合Tika的完整过程,整合完成后,我们可以根据实际需要进行代码封装,实现对文件类型的校验、对文件元数据的提取。由于Tika可以实现对文件数据的提取,所以它可以实现部分OCR识别的功能。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot是一种快速构建基于Spring框架的Java应用程序的工具。为了实现对word、pdf、txt等文件的非结构化数据全文内容检索,可以使用SpringBoot和Elasticsearch(ES)来实现。Elasticsearch是一种开源搜索引擎,其使用简单、快速高效、支持几乎所有类型的查询操作。 首先,需要将word、pdf、txt等文件的非结构化数据存储到ES中。可以使用Java中的POI、Apache Tika等工具来解析这些文件,将其转换为需要的文本格式,并将其存储到ES中。可以使用Spring Data Elasticsearch来实现与ES的交互,并创建一个Document对象来表示每个文件。 其次,需要编写一个查询方法来搜索这些文件。可以使用ES提供的全文检索功能,使用户可以搜索其内容并找到与搜索关键字相关联的文件。可以使用Spring Data Elasticsearch来创建查询对象并执行查询,将结果返回给用户。 需要注意的是,对于Word和PDF等二进制文件,需要将其转换为文本格式,而对于文本文件,只需将其直接存储到ES中。此外,还需考虑一些优化措施,如数据分片、数据备份和恢复等,以确保数据的完整性和可靠性。 最后,SpringBoot和ES的集成可以大大简化非结构化数据全文内容检索的开发和部署工作。它不仅可以提高检索效率,还可以保证数据的高可靠性和安全性。因此,它是一种非常有用的工具,可以满足企业的数据检索和管理需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值