LlamaIndex 中 PDF 文件读取的最佳实践与正确方法
默认情况下,SimpleDirectoryReader 可以处理多种文件格式,但对于 PDF 这类特殊文档,它往往无法准确筛选内容,会将格式标记一并读取,导致输出杂乱。理想目标是仅提取纯净的正文文本,然而目前尚无内置的 Reader 能完美实现这一功能。

LlamaIndex 其实提供了一个名为 liteparse 的开源免费解析器。不过为了推广其付费 Reader 产品,官方并未将 liteparse 直接封装成 Reader 公开。那么,我们完全可以自行封装一个。
准备工作
首先需要安装 liteparse 库,执行以下命令:
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):
"""using liteparse to parse PDF files"""
def lazy_load_data(self, *args: Any, **load_kwargs: Any) -> Iterable[Document]:
documents = []
# 实例化一个liteparser,用于把pdf文件的内容文本读取出来
parser = LiteParse()
# 其实args是一个path和tuple
for path in args:
# 读取文本内容
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')
运行过程中可能会输出一些警告日志,尽管不影响核心功能,但会影响体验。这是因为 liteparse 底层依赖 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 文件时,它将按照预期正常工作。
