Document Parser 使用指南
Spring AI Alibaba 提供了丰富的 Document Parser 扩展实现,支持解析各种文档格式。本文档将详细介绍 Document Parser 的使用方法,并列出所有支持的扩展实现。
目录
概述
Document Parser 是 Spring AI Alibaba 中用于解析不同格式文档的核心接口。与 Document Reader 不同,Parser 专注于从输入流中解析文档内容,通常与 Document Reader 配合使用,将原始文档转换为 Spring AI 的 Document 对象。
Spring AI Alibaba 扩展了该接口,提供了多种格式的解析实现,包括:
- 文档格式(PDF、Markdown、YAML、HTML 等)
- 办公文档(通过 Tika 支持多种 Office 格式)
- 多模态 内容(图像 OCR、语音转文字)
- 特殊格式(BibTeX、PDF 表格等)
- 批量处理(目录解析)
详细使用说明
Tika Document Parser 示例
TikaDocumentParser 使用 Apache Tika 库自动检测并解析各种文档格式。Tika 是一个强大的文档解析工具,支持超过 1000 种文件格式,包括:
- PDF:提取文本、元数据等
- Microsoft Office:Word (
.doc,.docx)、PowerPoint (.ppt,.pptx)、Excel (.xls,.xlsx) - HTML/XML:解析网页和 XML 文件
- 图片:提取图像元数据或通过 OCR 解析图片中的文本
- 文本文件:纯文本、Markdown 等
- 其他格式:邮件格式(EML、MSG)、RTF、OpenDocument 等
有关支持的格式的完整列表,请参阅 Apache Tika 文档。
依赖配置
使用 Maven 添加依赖:
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-document-parser-tika</artifactId>
<version>${version}</version>
</dependency>
基本使用
示例 1:简单解析
import com.alibaba.cloud.ai.parser.tika.TikaDocumentParser;
import com.alibaba.cloud.ai.document.DocumentParser;
import org.springframework.ai.document.Document;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.io.InputStream;
import java.util.List;
@Component
public class DocumentParsingService {
public List<Document> parseDocument(String filePath) {
// 创建 Tika Parser
DocumentParser parser = new TikaDocumentParser();
// 读取文件输入流
Resource resource = new ClassPathResource(filePath);
try (InputStream inputStream = resource.getInputStream()) {
// 解析文档
return parser.parse(inputStream);
}
}
}
示例 2:自定义文本格式化
import com.alibaba.cloud.ai.parser.tika.TikaDocumentParser;
import org.springframework.ai.reader.ExtractedTextFormatter;
public class FormattedDocumentParser {
public List<Document> parseWithFormatting(InputStream inputStream) {
// 创建自定义的文本格式化器
ExtractedTextFormatter formatter = ExtractedTextFormatter.builder()
.withNumberOfTopTextLinesToDelete(0)
.withNumberOfBottomTextLinesToDelete(0)
.build();
// 使用格式化器创建 Parser
TikaDocumentParser parser = new TikaDocumentParser(formatter);
return parser.parse(inputStream);
}
}
示例 3:高级配置
import com.alibaba.cloud.ai.parser.tika.TikaDocumentParser;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.sax.BodyContentHandler;
import java.util.function.Supplier;
public class AdvancedTikaParser {
public List<Document> parseWithCustomConfig(InputStream inputStream) {
// 自定义 Parser 供应商
Supplier<AutoDetectParser> parserSupplier = AutoDetectParser::new;
// 自定义 ContentHandler(可以设置写入限制)
Supplier<BodyContentHandler> handlerSupplier = () ->
new BodyContentHandler(100000); // 限制 100KB
// 自定义 Metadata
Supplier<Metadata> metadataSupplier = Metadata::new;
// 自定义 ParseContext
Supplier<ParseContext> contextSupplier = ParseContext::new;
// 创建配置好的 Parser
TikaDocumentParser parser = new TikaDocumentParser(
parserSupplier,
handlerSupplier,
metadataSupplier,
contextSupplier
);
return parser.parse(inputStream);
}
}
示例 4:解析不同格式的文档
import com.alibaba.cloud.ai.parser.tika.TikaDocumentParser;
import org.springframework.ai.document.Document;
public class MultiFormatParser {
private final TikaDocumentParser parser = new TikaDocumentParser();
public void parseWordDocument(InputStream inputStream) {
List<Document> documents = parser.parse(inputStream);
// 处理 Word 文档内容
documents.forEach(doc -> {
System.out.println("Content: " + doc.getText());
});
}
public void parseExcelFile(InputStream inputStream) {
List<Document> documents = parser.parse(inputStream);
// Excel 文件内容会按工作表组织
documents.forEach(doc -> {
System.out.println("Sheet Content: " + doc.getText());
});
}
public void parsePdfFile(InputStream inputStream) {
List<Document> documents = parser.parse(inputStream);
// PDF 内容会被提取为文本
documents.forEach(doc -> {
System.out.println("PDF Content: " + doc.getText());
});
}
public void parseHtmlFile(InputStream inputStream) {
List<Document> documents = parser.parse(inputStream);
// HTML 内容会被提取为纯文本
documents.forEach(doc -> {
System.out.println("HTML Content: " + doc.getText());
});
}
}
示例 5:与 Document Reader 配合使用
import com.alibaba.cloud.ai.parser.tika.TikaDocumentParser;
import com.alibaba.cloud.ai.reader.yuque.YuQueDocumentReader;
import com.alibaba.cloud.ai.reader.yuque.YuQueResource;
import org.springframework.ai.document.Document;
public class ReaderWithParserExample {
public List<Document> loadFromYuQue() {
// 创建 Tika Parser
TikaDocumentParser parser = new TikaDocumentParser();
// 创建语雀资源
YuQueResource resource = YuQueResource.builder()
.yuQueToken("your-token")
.resourcePath("your-resource-path")
.build();
// 使用 Parser 创建 Reader
YuQueDocumentReader reader = new YuQueDocumentReader(resource, parser);
// 读取文档
return reader.get();
}
}
示例 6:在 Spring Boot 应用中使用
import com.alibaba.cloud.ai.parser.tika.TikaDocumentParser;
import org.springframework.ai.document.Document;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.List;
@Service
public class DocumentProcessingService {
@Autowired
private VectorStore vectorStore;
@Autowired
private TokenTextSplitter textSplitter;
private final TikaDocumentParser parser = new TikaDocumentParser();
public void processUploadedFile(MultipartFile file) {
try (InputStream inputStream = file.getInputStream()) {
// 1. 解析文档
List<Document> documents = parser.parse(inputStream);
// 2. 文本分割
List<Document> splitDocuments = textSplitter.transform(documents);
// 3. 存储到向量数据库
vectorStore.write(splitDocuments);
System.out.println("成功处理并存储 " + splitDocuments.size() + " 个文档块");
} catch (Exception e) {
throw new RuntimeException("处理文件失败", e);
}
}
}
元数据
TikaDocumentParser 解析的文档默认不包含额外的元数据。如果需要元数据,可以使用自定义的 Metadata 供应商来提取文档的元数据信息。