我的知识记录

Python读取PDF指定页文字 单页提取方法

用Python+pdfplumber只读取PDF中某一页或某几页的文字,不用整本加载,速度快、内存省,适合定位关键页。

场景痛点

拿到一份几百页的PDF,只想看第10页的合同条款或者第20页的报价单。整本读完再找,浪费时间;手动翻到那页再复制,又要重复操作。用Python直接按页码读取单页文字,秒级定位,还能批量读取多个指定页。

用到的库

pip install pdfplumber

完整代码

# -*- coding: utf-8 -*-
"""
只读取 PDF 中指定页的文字
"""
import pdfplumber


def read_one_page(pdf_path: str, page_no: int) -> str:
"""
读取单页文字
:param pdf_path: PDF 路径
:param page_no: 页码(从 1 开始)
:return: 该页文字
"""
with pdfplumber.open(pdf_path) as pdf:
# pdfplumber 内部 pages 从 0 开始
index = page_no - 1
if index < 0 or index >= len(pdf.pages):
raise IndexError(f"页码 {page_no} 超出范围(共 {len(pdf.pages)} 页)")
return pdf.pages[index].extract_text() or ""


def read_pages(pdf_path: str, page_numbers: list) -> dict:
"""
批量读取多个指定页,返回 {页码: 文字}
"""
result = {}
with pdfplumber.open(pdf_path) as pdf:
total = len(pdf.pages)
for pno in page_numbers:
idx = pno - 1
if 0 <= idx < total:
result[pno] = pdf.pages[idx].extract_text() or ""
else:
result[pno] = None
print(f"页码 {pno} 越界(共 {total} 页)")
return result


if __name__ == "__main__":
# 单页
text = read_one_page("report.pdf", 10)
print("=== 第10页 ===")
print(text)

# 多页
pages = read_pages("report.pdf", [1, 3, 5, 20])
for pno, content in pages.items():
print(f"\n--- 第{pno}页前100字 ---")
print((content or "")[:100])

代码讲解

  • read_one_page 是最常用的函数:传文件名和1基页码,直接返回该页文字。
  • 关键转换:pdfplumber 内部 pages 列表从 0 开始,所以 page_no - 1 才是正确索引。
  • 越界时主动抛 IndexError,方便外层捕获;extract_text() 可能返回 None(空白页或图片页),用 or "" 兜底。
  • read_pages 一次打开PDF读取多个目标页,比反复 open 文件效率高。
  • 整本PDF只在 with 块内加载,读完自动释放句柄。

运行结果

控制台打印第10页完整文字,以及第1、3、5、20页各前100字预览。如果某页是图片扫描件,对应位置是空字符串。

注意事项

  • 单页读取并不会"只加载那一页"——pdfplumber 仍需打开整个PDF才能解析内部交叉引用,但比 extract_text() 全本快在不需要处理其他页。
  • 超大PDF(几百MB)想真正按需加载,可以结合 PyPDF2 用 PdfReader(pdf_path).pages[idx],但 PyPDF2 的文字提取质量不如 pdfplumber。
  • 扫描件单页提取出来是空,必须走OCR。
  • 想要PDF里指定区域的文字,可以在 page.crop(bbox) 之后再 extract_text()

Python读取PDF指定页文字 单页提取方法

标签:

更新时间:2026-09-14 21:34:45

上一篇:Python读取PDF表格数据转Excel pdfplumber实战

下一篇:Python PDF转图片每页高清:PyMuPDF导出PNG教程