LlamaIndex PDF转Document实战:AI Agent编程第三天
摘要
LlamaIndex 中 PDF 文件读取的正确姿势 默认情况下,SimpleDirectoryReader 支持多种文件格式,但处
LlamaIndex 中 PDF 文件读取的正确姿势
默认情况下,SimpleDirectoryReader 支持多种文件格式,但处理 PDF 这类结构化文档时容易连带排版标签一并读入,造成文本混乱。理想状态是仅提取纯正文内容,但目前官方并未提供开箱即用的 Reader 实现这一步。

LlamaIndex 社区维护了一个免费的开源解析器 liteparse,但官方为推广付费的 Reader 产品,未将其直接封装为 Reader 接口。解决方案是自行封装一个自定义 Reader。
准备工作
安装 Python 依赖包:
pip install liteparse
实现自定义 Reader
编写一个继承自 LlamaIndex 的 BaseReader 类,借助 liteparse 解析 PDF 文件并转换为 Document 对象。核心在于重写 lazy_load_data 方法,在其中实例化 LiteParse,遍历文件路径调用 parser.parse(),提取文本与元数据。
from datetime import datetime
from typing import Any, Iterable
from liteparse import LiteParse
from llama_index.core import SimpleDirectoryReader, Document
from llama_index.core.readers.base import BaseReader
# 继承BaseReader基类
class PDFReader(BaseReader):
"""借助liteparse解析PDF文件,提取纯文本内容"""
def lazy_load_data(self, *args: Any, **load_kwargs: Any) -> Iterable[Document]:
documents = []
# 创建LiteParse解析器实例
parser = LiteParse()
# args 为传入的路径元组
for path in args:
# 解析PDF并获取文本
result = parser.parse(str(path))
# 构建Document对象
document = Document(
name=path.name,
text=result.text,
metadata={
"author": "Kurt Johnson",
"file_type": "application/pdf",
"file_path": str(path),
"file_name": path.name,
"creation_date": datetime.now().strftime("%Y-%m-%d"),
"last_modified_date": datetime.now().strftime("%Y-%m-%d"),
}
)
documents.append(document)
return documents
测试运行
编写 __main__ 快速验证流程:
if __name__ == '__main__':
# 实例化自定义PDF Reader
parser = PDFReader()
# 将.pdf后缀映射到该Reader
pdf_file_extractor = {
".pdf": parser
}
reader = SimpleDirectoryReader("./data", file_extractor=pdf_file_extractor)
# 加载文档
documents = reader.load_data()
for document in documents:
print(f'{document.metadata['file_name']} - {document.metadata['file_type']}')
print('-' * 80)
print(document.text)
print('-' * 80)
print('n')
运行时可能遇到 OCR 相关的警告日志,不会影响最终结果,但视觉上不够干净。原因在于 liteparse 依赖 Tesseract OCR 引擎,需要下载语言数据文件。解决步骤:
- 下载以下两个文件:
https://github.com/tesseract-ocr/tessdata/raw/main/eng.traineddata
https://github.com/tesseract-ocr/tessdata/raw/main/chi_sim.traineddata
- 将文件放入
~/.tesseract-rs/tessdata目录。
配置完成后再次运行,日志警告即消失。若只需英文 OCR,仅下载 eng.traineddata 即可。
至此,我们获得了一个可精准提取 PDF 文本内容的自定义 Reader。之后使用 SimpleDirectoryReader 处理 PDF 文件时,会按照预期返回干净的 Document 对象。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。