在构建企业级 RAG检索增强生成系统时PDF是最常见、也是最棘手的知识来源。合同、论文、产品手册、财务报表……绝大多数正式文档都以 PDF 格式存在。PDF 的复杂性在于它包含排版信息、多栏布局、图片、表格甚至可能有密码保护。LangChain 提供了多种 PDF 加载器如PyPDFLoader,PDFMinerLoader,PyMuPDFLoader。其中PyPDFLoader是基于pypdf库实现的它是最通用、最稳定的入门选择能够很好地处理标准文本型 PDF 和密码保护文件。 前置准备PyPDFLoader依赖pypdf库。在使用前请确保已安装pipinstallpypdf 核心参数解析初始化PyPDFLoader时有几个关键参数决定了数据的提取方式1.mode: 决定切分粒度这是最重要的参数决定了返回的Document对象结构page(默认):按页切分。PDF 的每一页变成一个独立的Document对象。优点适合后续进行精细化的文本分割Text Splitting避免单个 Document 过大。元数据自动包含page字段页码。single:合并全文。整个 PDF 的所有页面合并成一个巨大的Document对象。适用场景极短的 PDF或者你打算自己手动编写逻辑去切分内容。2.password: 处理加密文件很多企业内部文档是加密的。如果 PDF 有打开密码必须在password参数中提供字符串形式的密码。如果不提供加载时会抛出PdfReadError。3.extract_images(进阶)默认为False。如果设为True可以尝试提取 PDF 中的图片需要额外配置通常用于多模态 RAG。 实战代码加载气候变迁报告我们将加载一份名为Understanding_Climate_Change.pdf的文件演示如何处理分页和潜在密码。完整代码实现fromlangchain_community.document_loadersimportPyPDFLoaderimportos# 文件路径 (使用 r 原始字符串避免 Windows 路径转义问题)file_pathr.\RAG_Techniques\data\Understanding_Climate_Change.pdf# ---------------------------------------------------------# 1. 初始化 PyPDFLoader# ---------------------------------------------------------loaderPyPDFLoader(file_pathfile_path,modepage,# 模式每页一个 Document (推荐)# modesingle, # 备选所有页合并为一个 DocumentpasswordNone,# 如果有密码例如 password123456)print( 开始加载 PDF 文档...\n)# ---------------------------------------------------------# 2. 使用 lazy_load() 流式加载 (推荐用于大文件)# ---------------------------------------------------------# 如果 PDF 有几百页使用 load() 会一次性读入内存可能导致卡顿。# lazy_load() 返回一个生成器每次只读取一页内存占用极低。page_count0fordocinloader.lazy_load():page_count1# doc.page_content: 该页的文本内容# doc.metadata: 包含源文件路径和页码 {source: ..., page: 0}print(f [第{doc.metadata[page]1}页])# 只打印前 100 个字符作为预览避免刷屏content_previewdoc.page_content[:100].replace(\n, )print(f 内容预览:{content_preview}...)print(*20,fPage{page_count},*20)# 演示用仅打印前 3 页实际使用时请注释掉下面这行ifpage_count3:print(... (剩余页面已省略))breakprint(f\n✅ 成功加载前{page_count}页。)️ 运行结果解析运行代码后你会看到类似以下的输出。注意metadata中自动添加了页码信息这对后续的溯源非常重要。 开始加载 PDF 文档... [第 1 页] 内容预览: Understanding Climate Change Executive Summary Climate change is one of the most pressing ... Page 1 [第 2 页] 内容预览: Chapter 1: The Science of Climate Change The greenhouse effect is a natural process that ... Page 2 [第 3 页] 内容预览: Chapter 2: Impact on Ecosystems Rising global temperatures are causing significant shifts ... Page 3 ... (剩余页面已省略) ✅ 成功加载前 3 页。⚠️ 常见问题与解决方案1. 中文乱码问题PyPDFLoader依赖于 PDF 文件内部的字体映射。现象加载中文 PDF 时page_content显示为空白或乱码。原因某些 PDF 生成时未嵌入字体表或者使用了特殊的编码。解决尝试使用PDFMinerLoader(基于pdfminer.six)它对中文支持更好但速度稍慢。尝试使用PyMuPDFLoader(基于fitz)通常是目前对中文和复杂排版支持最好的加载器需安装pymupdf。2. 扫描件/图片型 PDF现象加载后page_content为空。原因该 PDF 是图片扫描件没有内嵌文本层。解决需要引入OCR (光学字符识别)技术。LangChain 支持集成Tesseract或云厂商的 OCR API 来处理此类文件。3.pagevssingle模式的选择推荐流程始终使用modepage。因为加载后的每一页 Document通常还需要经过RecursiveCharacterTextSplitter进行二次切分切成 500-1000 字的块。如果使用single模式整个 PDF 变成一个大字符串再切分时可能会丢失“页码”这个重要的元数据上下文。 为什么这对 RAG 很重要在 RAG 流程中PDF 加载是第一步也是决定上限的一步元数据保留PyPDFLoader自动提取的page页码让用户在提问时AI 能回答“在第 15 页提到了…”极大增强了可信度。流式处理配合lazy_load()我们可以处理几百兆的法律文书或学术论文集而不会撑爆服务器内存。标准化无论 PDF 内部结构多复杂输出都是统一的Document列表无缝对接后续的 Embedding 和向量数据库。 总结本节课我们掌握了处理 PDF 文档的核心技能PyPDFLoader学会了使用最稳定的加载器读取 PDF 文本。模式选择理解了modepage是分页处理的最佳实践便于后续切分。安全与性能掌握了password参数处理加密文件并使用lazy_load()优化大文件内存占用。现在我们已经搞定了 TXT、CSV、JSON 和 PDF 四种主流格式。但在实际办公场景中Word 文档 (.docx)同样占据半壁江山。