用Apache Tika解析文档
作者:程序员马丁
note
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
读文件没那么简单
假设你正在做一个毕业设计:构建一个基于大模型的智能问答系统,用户可以上传公司内部文档,然后针对这些文档进行提问。
听起来很清晰,技术路线大概是:
用户上传文档 → 解析文档内容 → 存入向量数据库 → 用户提问 → 检索相关内容 → 喂给大模型 → 返回答案
你可能觉得"解析文档内容"这一步很简单——不就是读文件吗?
// 你以为的代码
String content = Files.readString(Path.of("report.pdf"));
然后你会发现:这行代码根本跑不通。
1. 你以为的文档解析 vs 真实世界的文档
1.1 PDF:同一个后缀,完全不同的内心
你收到三份 PDF 文件:
| 文件 | 来源 | 你尝试复制粘贴 | 结果 |
|---|---|---|---|
report1.pdf | Word 导出的 | 能复制 | 正常 |
report2.pdf | 扫描仪扫的 | 选不中任何文字 | 空白 |
report3.pdf | 某老系统生成 | 复制出来全是乱码 | ¿½Ð |
同样是 .pdf 后缀,内部结构可能完全不同:
- 文字型 PDF:内部存储的是文字编码,可以直接提取。
- 扫描型 PDF:内部存储的是图片,文字只是“画”上去的。
- 混合型 PDF:部分页是文字,部分页是扫描图。
你写的 readString() 根本不知道怎么处理这些差异。
1.2 Word 文档:远比你想象的复杂
一份 .docx 文件,打开看起来就是几段文字。但你用代码读出来可能是这样:
公司简介
成立时间 2015年
员工人数 500人
第 1 页,共 3 页
本文档为内部资料,请勿外传
问题在哪?
- 表格被拆成了莫名其妙的换行。
- 页眉页脚混进了正文。
- 多余的空行和空格。
- 文档属性(作者、创建时间)你根本没拿到。