一、什么是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识别的功能。