LangChain解析PDF文件工具:UnstructuredPDFLoader
项目说明Loader 名称(LangChain)功能从 PDF 提取文本,支持分页、多元素、OCR,功能强大且灵活推荐模式(按页拆分,清晰易用)输出List[Document],含和metadata适用场景RAG、文档问答、知识库构建、文档分析等依赖langchain,如需 OCR 则🔧。
如果你的 PDF 不是简单的纯文本,而是包含:
-
多级标题
-
段落
-
无序/有序列表
-
表格(如数据统计表、对比表)
-
图片说明 / 图文混排
普通的 PDF 解析工具(如 PyPDF2)会丢失格式、错乱排版,提取效果很差。
就需要使用UnstructuredPDFLoader来解析pdf文档,它解析pdf文档后,会返回非结构化文本。关于非结构化文本的介绍,请看我的这篇文章:
https://blog.csdn.net/m0_53830442/article/details/153398854
🧩 一、LangChain 中的 UnstructuredPDFLoader
在 LangChain 中,UnstructuredPDFLoader是通过 langchain.document_loaders模块提供的,属于 第三方文档加载器(通过 unstructured 实现),用于从 PDF 文件中提取文本内容,支持多种处理模式(如 "single"、"paged"、"elements")。
📦 二、安装依赖
在使用之前,请确保安装以下依赖包:
pip install langchain unstructured
如果你的 PDF 是扫描件(图片格式)或包含图片中的文字,你还需要安装 OCR 支持:
pip install unstructured[ocr]
并且可能需要安装 Poppler(在 macOS/Linux 上)或相应 PDF 工具(Windows 用户可安装 poppler for Windows)。
✅ 三、LangChain 使用 UnstructuredPDFLoader 的代码示例
from langchain.document_loaders import UnstructuredPDFLoader
# 1. 指定你的 PDF 文件路径
pdf_file_path = "example.pdf" # 替换为你的 PDF 文件路径
# 2. 创建 UnstructuredPDFLoader 实例
# mode 可选值: "single", "paged", "elements" (推荐 "paged" 或 "elements")
loader = UnstructuredPDFLoader(
file_path=pdf_file_path,
mode="paged", # 也可以尝试 "single"(全文合并)或 "elements"
)
# 3. 加载文档,返回的是 LangChain 的 Document 对象列表
documents = loader.load()
# 4. 打印提取结果(查看前几页的内容)
for i, doc in enumerate(documents):
print(f"=== 第 {i+1} 页内容 ===")
print(doc.page_content[:1000]) # 打印每页的前 1000 个字符
print("\n---\n")
🧠 参数说明
|
参数 |
说明 |
|---|---|
|
|
PDF 文件的本地路径,也可以是 HTTP URL(部分情况支持) |
|
|
指定如何切分 PDF 内容: |
|
|
(可选)unstructured 的解析策略,如 |
|
|
如果你使用 Unstructured 的云端 API,可以传入 API Key(默认本地解析) |
📌 推荐使用
mode="paged",这样你可以按页处理内容,更利于后续分块、向量化或 RAG 应用。
🔍 四、输出内容说明
返回的 documents是一个 List[Document],其中每个 Document对象包含两个重要字段:
-
page_content: 提取到的该页(或该块)的文本内容 -
metadata: 包括来源、页码、文件名等元信息,例如:{ "source": "example.pdf", "page": 1, "filename": "example.pdf" }
这些 metadata 在后续构建检索系统(如 FAISS + Chroma)时非常有用。
🧪 五、进阶:结合文本分块与嵌入(用于 RAG)
通常你会将加载到的文本进一步分块(chunking),然后嵌入(embedding),存入向量数据库,这里是一个简化的扩展流程示意:
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
# 假设你已经通过 UnstructuredPDFLoader 得到了 documents
# documents = loader.load()
# 1. 文本分块
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
texts = text_splitter.split_documents(documents)
# 2. 嵌入与向量存储(以 OpenAI 为例)
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(texts, embeddings)
# 之后你就可以用 vectorstore 做相似性检索了!
如果你不用 OpenAI,也可以换用别的 Embeddings,比如
HuggingFaceEmbeddings、BAAI/bge-small-zh等国产或轻量模型。
📝 六、其他常见 LangChain PDF Loader(备选)
除了 UnstructuredPDFLoader,LangChain 还提供以下 PDF 相关的 Loader,根据需求可选用:
|
Loader 名称 |
特点 |
|---|---|
|
|
基于 PyPDF2,简单但提取效果一般,适合格式简单的 PDF |
|
|
基于 pdfplumber,对表格和排版支持更好,但速度较慢 |
|
|
✅ 推荐!功能强大,支持复杂布局、多页、OCR,基于 unstructured 库 |
|
|
较底层,使用 pdfminer,适合定制需求 |
你可以根据 PDF 的复杂程度和需求选择合适的 Loader。
✅ 总结
|
项目 |
说明 |
|---|---|
|
Loader 名称(LangChain) |
|
|
功能 |
从 PDF 提取文本,支持分页、多元素、OCR,功能强大且灵活 |
|
推荐模式 |
|
|
输出 |
List[Document],含 |
|
适用场景 |
RAG、文档问答、知识库构建、文档分析等 |
|
依赖 |
|
🔧
更多推荐
所有评论(0)