Tika 与 Spring Boot 的完美结合:支持任意文档解析的神器

开发 前端
随着数字化转型的加速,企业和组织越来越依赖自动化工具来处理大量的文档数据。Apache Tika 是一个强大的开源工具,专门用于从各种文件格式中提取文本和元数据。Spring AI也自动集成了Tika作为文档解析器。

环境:SpringBoot3.2.5


一、简介

文档解析在现代企业和开发领域中应用还是非常广泛的,尤其是在需要从多种格式的文档中提取有价值信息的情况下。随着数字化转型的加速,企业和组织越来越依赖自动化工具来处理大量的文档数据。Apache Tika 是一个强大的开源工具,专门用于从各种文件格式中提取文本和元数据。Spring AI也自动集成了Tika作为文档解析器。

通过使用 Tika,企业不仅可以简化文档处理流程,还能提高数据处理的准确性和效率。

Tika有哪些优势呢?

1. 广泛的格式支持

Tika 支持超过 1000 种文档格式,包括常见的 Office 文档(如 DOCX、XLSX、PPTX)、PDF、HTML、音频、视频和图像文件。

2. 易于集成

Tika 提供了一个简单易用的 Java API,可以轻松地集成到任何 Java 应用程序中,包括 Spring Boot 应用。

3. 内容和元数据提取

Tika 不仅能够提取文档的内容,还能提取文档的元数据,如标题、作者、创建日期等。

4. 自然语言处理(NLP)功能

Tika 内置了一些自然语言处理功能,如语言检测、词频统计等。这使得 Tika 成为一个多功能工具,不仅限于文档解析,还可以用于文本分析。

5. 批处理和自动化

Tika 支持批处理模式,可以高效地处理大量文档。这对于需要自动化文档处理流程的应用非常有用,可以节省时间和人力资源。

6. 跨平台兼容性

Tika 是纯 Java 编写的,因此可以在任何支持 Java 的平台上运行,具有很好的跨平台兼容性。

7. 社区支持

作为 Apache 基金会的一个项目,Tika 拥有一个活跃的社区支持。

8. 安全性

Tika 在处理文档时支持安全功能,如防止恶意内容(如 XSS 攻击)和处理加密文档。

9. 扩展性和插件化

Tika 设计为可扩展的,支持通过插件来增加新的解析器和功能。

10. 轻量级

尽管功能强大,Tika 却是一个相对轻量级的工具,不需要安装复杂的依赖环境即可运行。

接下来,我们将通过几个示例详细介绍有关Tika的使用。

2. 实战案例

Tika 提供了多种解析文件的方法。这些方法提供了不同程度的控制、灵活性和复杂性。

环境准备

<properties>
  <tika.version>2.9.2</tika.version>
</properties>
<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-core</artifactId>
  <version>${tika.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-parsers-standard-package</artifactId>
  <version>${tika.version}</version>
</dependency>
<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-parser-scientific-package</artifactId>
  <version>${tika.version}</version>
</dependency>

注意你使用的版本,可能会有些差异。

2.1 使用 Tika 门面进行解析

Tika Facade 提供了许多快速、简便的方法,让 Tika 对内容进行解析,并返回结果纯文本。

public static String parseToString() throws Exception {
  Tika tika = new Tika();
  try (InputStream stream = new FileInputStream(new File("e:\\technology.docx"))) {
    return tika.parseToString(stream);
  }
}

输出结果

图片图片

完整的将word文档中的内容按照格式解析出来。

2.2 解析文本文件

不管你要解析什么文档格式,你都可以通过AutoDetectParser来完成解析动作,不过这里我们使用具体的文本解析器TXTParser。

TXTParser parser = new TXTParser() ;
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata() ;
ParseContext context = new ParseContext() ;
try (InputStream stream = new FileInputStream(new File("C:\\execute script.txt"))) {
  parser.parse(stream, handler, metadata, context) ;
}
System.out.println(handler.toString()) ;
System.out.println(metadata.toString()) ;

输出结果

图片图片

2.3 解析PDF文档

与上面解析文本文档一样,我们只需要切换不同的解析器即可,如下示例:

PDFParser parser = new PDFParser() ;
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata() ;
ParseContext context = new ParseContext() ;
try (InputStream stream = new FileInputStream(new File("D:\\setups\\ReferenceCard.pdf"))) {
  parser.parse(stream, handler, metadata, context) ;
}
System.out.println(handler.toString()) ;
System.out.println(metadata.toString()) ;

这里仅仅是切换了解析器而已,输出结果:

图片图片

2.4 使用自动检测解析器进行解析

为了获得更多控制权,你可以直接调用 Tika 解析器。大多数情况下,你会希望从自动检测解析器开始使用,它会自动找出你的内容类型,然后为你调用相应的解析器。

public static String parseAutoDetect() throws Exception {
  AutoDetectParser parser = new AutoDetectParser() ;
  BodyContentHandler handler = new BodyContentHandler() ;
  Metadata metadata = new Metadata();
  try (InputStream stream = new FileInputStream(new File("e:\\technology.docx"))) {
    parser.parse(stream, handler, metadata);
    return handler.toString();
  }
}

这同样能正确的解析文档内容,在这里我们不需要使用具体文档的解析器,而是由Tika自动的监测。

2.5 将文档解析为HTML

在解析时,我们可以通过使用 ToXMLContentHandler,可以以字符串形式获取整个文档的 XHTML 内容。

public static String parserToXHTML() throws Exception {
  ToXMLContentHandler handler = new ToXMLContentHandler();
  
  AutoDetectParser parser = new AutoDetectParser();
  Metadata metadata = new Metadata();
  try (InputStream stream = new FileInputStream(new File("e:\\technology.docx"))) {
      parser.parse(stream, handler, metadata);
      return handler.toString();
  }
}

输出结果

图片图片

保存为html后,通过浏览器浏览

图片图片

完美的生成HTML文档。

2.6 定制化Tika

通过 Tika 的配置 XML,可以对使用哪些解析器以及它们的优先级顺序等进行高度控制。如下示例配置(tika-config.xml)

<?xml versinotallow="1.0" encoding="UTF-8"?>
<properties>
  <parsers>
    <!-- 配置了默认解析器,同时设置了不解析n哪些类型的文档 -->
    <parser class="org.apache.tika.parser.DefaultParser">
      <!-- 这将不解析PDF文档-->
      <mime-exclude>application/pdf</mime-exclude>
    </parser>
  </parsers>
</properties>

使用方式

TikaConfig config = new TikaConfig(new ClassPathResource("tika-config.xml").getFile());
AutoDetectParser parser = new AutoDetectParser(config) ;
// ...

当你解析PDF文档时将输出如下提示:

X-TIKA:Parsed-By=org.apache.tika.parser.EmptyParser X-TIKA:Parsed-By-Full-Set=org.apache.tika.parser.EmptyParser Content-Type=application/pdf

你也可以为具体的文档类型,自定义解析器,可如下配置:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<properties>
  <parsers>
    <parser class="com.pak.PackPDFParser">
      <mime>application/pdf</mime>
    </parser>
  </parsers>
</properties>

这里定义了pdf文档将会使用PackPDFParser进行解析。

2.7 与Spring Boot结合

我们这里通过文件上传的方式,将上传的文件解析为文本数据,然后输出。

首先,配置自动关联文档的解析器

@Bean
Parser parser() {
  AutoDetectParser parser = new AutoDetectParser() ;
  parser.setFallback(new TXTParser()) ;
  return parser ;
}

接下来,定义Controller接口

@RestController
@RequestMapping("/tika")
public class TikaController {


  private final Parser parser ;
  public TikaController(Parser parser) {
    this.parser = parser ;
  }
  
  @PostMapping("/upload")
  public String upload(MultipartFile file) throws Exception {
    InputStream stream = file.getInputStream() ;
    BodyContentHandler handler = new BodyContentHandler();
    this.parser.parse(stream, handler, new Metadata(), new ParseContext()) ;
    return handler.toString() ;
  }
}

通过postman进行接口调用

图片图片

与Spring Boot结合非常的简单也就是简单的调用相应的API接口。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2022-07-07 08:38:15

Springflowable引擎

2009-06-04 10:44:34

StrutsHibernate配合

2011-03-07 16:10:41

FireFTPFirefoxFTP

2022-05-17 09:19:17

XebianLinuxLinux 发行版

2021-05-25 09:10:54

工具代码开发

2010-04-29 10:32:14

虚拟技术上海世博会

2022-04-19 20:39:03

协程多进程

2009-07-03 13:54:38

Java Servle

2024-05-28 09:30:13

2010-03-04 09:16:05

Opera版本发布

2013-10-31 13:19:06

2010-07-27 09:11:38

FlexBuilder

2024-05-15 08:54:04

C++类型限定符代码

2015-11-04 15:13:56

华为

2021-03-17 11:29:24

物联网环境数据环境风险

2009-08-02 17:26:11

以太网电源以太网供电

2009-01-06 09:19:16

Google Andr华硕Eee PCGoogle 操作系统

2011-12-26 10:17:12

2009-07-06 17:34:20

PEARMail函数php

2023-12-12 13:42:00

微服务生态系统Spring
点赞
收藏

51CTO技术栈公众号