pytesseract无法直接读PDF,因它只处理图像;需先用pdf2image将PDF转为高清图像(如dpi=200),再OCR识别,Windows用户须配置poppler路径。

用 pytesseract 读 PDF 发票,为什么全是空或乱码?
PDF 不是图片,pytesseract 直接读会失败——它只处理图像像素。常见错误是直接传入 .pdf 路径给 pytesseract.image_to_string(),结果返回空字符串或报错 TesseractError: No page content。
- 必须先把 PDF 转成图像(如 PNG/JPEG),再喂给 OCR
- 推荐用
pdf2image,它调用 poppler 库做转换,比 Pillow 自带的 PDF 支持更稳 - Windows 用户得手动下载 poppler 并把
poppler\Library\bin加进系统 PATH,否则pdf2image.convert_from_path()会抛IOError: Unable to get page count
pytesseract
- 发票代码、校验码通常为纯数字+字母固定长度,比如
^\d{12}$或^[A-Z]{2}\d{10}$ - 金额字段常带“¥”或“元”,后面紧跟数字+小数点,正则如
r'¥\s(\d+.\d{2})'或r'(\d+.\d{2})\s元' - 避免直接匹配“名称:XXX”,因为冒号可能是全角、半角、空格替代,改用模糊定位:先找“购方名称”附近 2 行内的中文字符段
别依赖单次 OCR 结果。对同一张图跑 2–3 次不同配置(比如换 oem 模式),取最长公共子串或投票结果,能明显降噪。
批量处理 PDF 发票时,openpyxl 写 Excel 卡死或格式错乱?
openpyxl 在循环中反复打开/保存同一个文件,性能极差,且容易因未关闭工作簿导致写入失败或内容覆盖。
- 一次性加载工作簿,循环中只
ws.append(...),最后统一wb.save() - 别用
ws.cell(row=i, column=j).value = ...做逐单元格赋值,append 行列表快 5 倍以上 - 如果字段含换行符(比如地址栏),Excel 默认不换行显示,得提前设
ws.row_dimensions[i].height = 30和cell.alignment = Alignment(wrap_text=True)
注意日期字段:OCR 提出来的“2024年05月10日”是字符串,Excel 可能无法识别为日期类型。入库前用 datetime.strptime(text.strip(), "%Y年%m月%d日") 转成 datetime 对象,openpyxl 才会自动设为日期格式。
为什么本地跑通了,部署到 Linux 服务器就报 TesseractNotFoundError?
pytesseract 是 Python 封装,底层依赖系统级的 tesseract 二进制程序。本地 macOS/Windows 安装了 GUI 版 tesseract,但服务器往往没装,或版本太老(v4.0 以下不支持 LSTM 模型,中文识别率断崖下跌)。
- Ubuntu/Debian:运行
sudo apt update && sudo apt install tesseract-ocr tesseract-ocr-chi-sim - CentOS/RHEL:用
sudo yum install tesseract tesseract-devel,再手动装中文语言包(从 https://www.php.cn/link/aec4c452116ae7afc8e88a2e0533a93d 下载chi_sim.traineddata放到/usr/share/tesseract-ocr/4.00/tessdata/) - 检查路径:
pytesseract.pytesseract.tesseract_cmd = "/usr/bin/tesseract"(Linux 路径通常不是C:\Program Files\Tesseract-OCR\tesseract.exe)
最常被忽略的是:服务器没装中文字体(如 fonts-wqy-zenhei),导致 tesseract 渲染中文时 fallback 到方块,识别结果全是“口口口”。装完字体还得清缓存:fc-cache -fv。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











