扫描pdf无法直接提取文字,需先ocr:pdfplumber对纯扫描件返回空文本因pdf仅含图像;验证用page.chars是否为空;ocr须用pdf2image转图+pytesseract识别,并注意dpi≥300、正确安装tesseract与poppler、预处理图像。

不能直接用 Python 把扫描版 PDF 变成可编辑文本——必须先 OCR,再提取文字。PDF 本身不存文字,只存图像,PyPDF2 或 pdfplumber 对纯扫描件完全无效。
为什么 pdfplumber 读不出扫描 PDF 的文字?
因为扫描 PDF 是「一张张图片叠在 PDF 容器里」,没有字符坐标、字体或文本流。调用 pdfplumber.Page.extract_text() 返回空字符串或 None 是正常现象,不是代码写错了。
验证方法:用 pdfplumber 打开后检查 page.chars 是否为空,或直接看 page.width 和 page.height 是否合理(避免误判为加密/损坏 PDF)。
- 如果
page.chars为空,且page.images非空 → 确认为扫描件 - 如果
page.chars有内容 → 原生文字 PDF,直接用pdfplumber或PyMuPDF提取即可 - 别浪费时间给扫描件加
password=...或重试不同解码参数——没用
用 pytesseract + pdf2image 做 OCR 的最小可行路径
核心链路:PDF → 每页转为 PNG/JPEG → 逐图送入 tesseract 识别 → 合并结果。关键不是“写得多”,而是避开三类典型失败点:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
-
tesseract命令行未安装或不在PATH:Windows 上必须手动下载安装包并勾选「Add to PATH」;macOS 用brew install tesseract;Linux 确保tesseract-ocr包已装(Ubuntu/Debian 还要装语言包如tesseract-ocr-chi-sim) -
pdf2image依赖poppler:Windows 需单独下载 poppler bin 并把poppler\Library\bin加进系统 PATH;macOS 用brew install poppler;Linux 安装poppler-utils - 图像分辨率太低:
pdf2image.convert_from_path(..., dpi=300)必须显式设为 300 或更高,dpi=72(默认)会导致 OCR 错字率飙升
简单示例(中文需加 lang='chi_sim'):
from pdf2image import convert_from_path
import pytesseract
images = convert_from_path("scan.pdf", dpi=300)
text = "\n\n".join(pytesseract.image_to_string(img, lang="chi_sim") for img in images)
with open("output.txt", "w", encoding="utf-8") as f:
f.write(text)
OCR 质量差?先检查图像预处理是否被跳过
原图模糊、有阴影、倾斜、背景噪点多——tesseract 会直接放弃识别或输出乱码。不要一上来就调 --oem 或换模型,先用 OpenCV 或 PIL 做基础清理:
- 灰度化 + 高斯模糊去噪:
cv2.GaussianBlur(gray, (1, 1), 0) - 二值化用自适应阈值:
cv2.adaptiveThreshold(..., cv2.ADAPTIVE_THRESH_GAUSSIAN_C, ...),比固定threshold更稳 - 倾斜校正:用
cv2.minAreaRect找文字区域角度,再仿射变换纠偏(对发票、表格类文档特别有效) - 跳过整页 OCR:若某页
image_to_string(..., config="--psm 0")返回空或长度
真正难的不是调通流程,而是判断哪一页该重扫、哪一页该人工补字、哪一段 OCR 结果可信——这些没法自动化,得留日志记录每页置信度(pytesseract.image_to_data 可返回各词 confidence 值),否则后期纠错成本远高于前期多花两分钟看图。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










