如果你的 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")

🧠 参数说明

参数

说明

file_path

PDF 文件的本地路径,也可以是 HTTP URL(部分情况支持)

mode

指定如何切分 PDF 内容:
"single":将整个 PDF 当作一个文本块返回(适合短文档)
"paged":按页拆分,每一页为一个 Document(推荐)
"elements":按 unstructured 的语义元素拆分(如段落、标题等,更细粒度)

strategy

(可选)unstructured 的解析策略,如 "hi_res"(高精度,慢)、"fast"(快速,适合简单 PDF)

unstructured_api_key

如果你使用 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,比如 HuggingFaceEmbeddingsBAAI/bge-small-zh等国产或轻量模型。


📝 六、其他常见 LangChain PDF Loader(备选)

除了 UnstructuredPDFLoader,LangChain 还提供以下 PDF 相关的 Loader,根据需求可选用:

Loader 名称

特点

PyPDFLoader

基于 PyPDF2,简单但提取效果一般,适合格式简单的 PDF

PDFPlumberLoader

基于 pdfplumber,对表格和排版支持更好,但速度较慢

UnstructuredPDFLoader

✅ 推荐!功能强大,支持复杂布局、多页、OCR,基于 unstructured 库

PDFMinerLoader

较底层,使用 pdfminer,适合定制需求

你可以根据 PDF 的复杂程度和需求选择合适的 Loader。


✅ 总结

项目

说明

Loader 名称(LangChain)​

UnstructuredPDFLoader

功能

从 PDF 提取文本,支持分页、多元素、OCR,功能强大且灵活

推荐模式

mode="paged"(按页拆分,清晰易用)

输出

List[Document],含 page_contentmetadata

适用场景

RAG、文档问答、知识库构建、文档分析等

依赖

langchain, unstructured,如需 OCR 则 unstructured[ocr]


🔧

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐