如果你手头有一批格式相同的 PDF,比如发票、对账单、货运单或月度报表,每次都要从固定位置复制日期、金额、单号,再粘贴进 Excel,那么这类工作很适合交给一款基于 Python 的开源小工具完成。它把 PDF 预览、区域框选、OCR 识别、区域截图和 Excel 导出放在同一个 tkinter 界面里,底层用 PyMuPDF 渲染页面和裁剪区域,用 easyocr 处理中英文识别,用 openpyxl 写入表格。你只需要在第一份文件上把区域框一次,之后就能选择逐个审核或全自动批处理,最终得到一份按文件顺序排列的结果表。相比通用 OCR 软件对整页做识别、再靠正则去猜字段位置,框选区域的方式更贴近“我知道我要哪一块”的实际需求。

先搞清楚这类工具解决的是什么问题
整页 OCR 的流程是“识别全部文字,再从结果里找字段”,问题在于 PDF 的版式并不稳定:同一个金额栏,在不同文件里可能因为扫描偏移、页眉页脚变化或者表格换行而落到不同位置。一旦你用正则表达式或“第几行第几个词”来定位,换一批文件就很容易错位。
按区域提取的思路正好相反:位置由你人工确定,工具只负责把这一块图像交给 OCR。这样做的代价是它默认所有 PDF 的版式一致,收益是识别范围被压到最小,干扰文字少,准确率和稳定性通常更好。搜索资料中的这款工具还额外做了两件事:框选区域时可以拖动和缩放,方便微调;识别前用 OpenCV 做灰度化、自适应阈值和形态学处理,让扫描件里偏淡的字更容易被识别出来。
需要提醒的是,区域坐标依赖页面渲染尺寸。如果你中途更换了 PDF 的页面尺寸、缩放比例或扫描分辨率,之前框好的位置就可能偏移,这一点在后面的排错部分会展开。
安装准备:Python 环境和四个依赖
1. 准备 Python
建议使用 Python 3.9 以上的版本,并且养成在虚拟环境里安装依赖的习惯,避免和系统里其它项目冲突:
mkdir pdf-region-ocr
cd pdf-region-ocr
python -m venv venv
激活虚拟环境,Windows 下执行 venvScriptsactivate,macOS 和 Linux 下执行 source venv/bin/activate。命令行前面出现 (venv) 就表示生效了。
2. 安装依赖库
根据这款工具的说明,它依赖以下库:
pip install pymupdf easyocr openpyxl opencv-python
pymupdf负责打开 PDF、渲染页面为图像、按矩形区域裁剪;easyocr负责文字识别,支持中文和英文;openpyxl负责把结果写入.xlsx;opencv-python用于识别前的图像预处理。
easyocr 首次运行时会下载识别模型,体积不小,建议在网络稳定的环境下先跑一次,把模型缓存下来,之后再批量处理就不需要联网了。
3. 确认 tkinter 可用
界面是用 tkinter 写的,Windows 和 macOS 的官方 Python 安装包通常自带。如果启动时报 ModuleNotFoundError: No module named 'tkinter',Linux 下一般需要单独安装,例如 Ubuntu 系可以执行:
sudo apt install python3-tk
安装完成后,把开源项目下载到本地,进入项目目录运行主程序入口(以项目实际文件名和启动说明为准)即可看到界面。
框选区域:一次框好,后面复用
打开界面后,通常是先选择 PDF 文件或包含 PDF 的文件夹,工具会把第一页渲染到预览区。接下来是核心动作:
- 在预览页上按住鼠标拖出一个矩形,覆盖你要提取的那块内容,比如发票右上角的开票日期。
- 如果位置不准,用边线上的控制点拖动调整,或者直接拖动整个框平移。
- 一个页面可以添加多个区域,每个区域对应结果表里的一列。日期、金额、发票号这类字段分别框一次即可。
- 注意区分区域类型。工具用不同颜色标示用途,比如蓝色代表 OCR 文字识别、绿色代表区域截图,选中的区域显示为红色。如果你要的是图片而不是文字,就把该区域设成截图类型。
- 框选完成后检查一下区域是否覆盖到了文字边缘,尤其是字迹贴近边框的扫描件,留出一点余量通常更稳。
这一步的细致程度直接决定后面返工的量。建议拿一份“最差”的样本做基准:字最淡的、扫描最歪的、版式最复杂的那一份。用它调好的框,对其它文件一般也够用。
配置输出:Excel 路径与日期格式
进入输出设置时,重点看两项。
第一项是结果文件位置和字段顺序。结果会写进一个 .xlsx 文件,每个区域占一列,每份 PDF 占一行,一般还会带上来源文件名,方便你回溯是哪份文件出的问题。
第二项是日期格式化。扫描件里的日期常常是 20251209 这种连写形式,直接进表格不便排序和统计。工具提供了自定义格式化规则,可以把识别出的文本按你的规则转换成 2025年12月09日 之类的样式,并且支持实时预览。设置时建议用几份不同写法的样本试一下,确认规则不会把 2025-12-09 和 2025.12.09 这类变体弄错。
截图类区域的处理略有不同,工具会自动生成唯一文件名来避免重名覆盖,也会规避特殊字符导致的保存失败。你只需要指定截图存放的目录。
批量运行:先手动审核,再全自动
工具提供了两种模式,这个设计值得按顺序用一遍,而不是直接上全自动。
模式一:手动审核(逐个确认)
每处理完一份 PDF,界面会停下来展示识别结果,你可以核对这一份的文字是否对、截图是否对,确认无误再进入下一份。适合两种情况:第一次跑一批新类型文件;或者这批文件数量不多但错一个就麻烦,比如涉及金额的报销和结算。
模式二:全自动(批量跑完)
确认前几份的框选位置和格式规则都稳定之后,切换到全自动模式,选择文件夹,工具会按顺序处理完全部 PDF,直接汇总到 Excel,中途不需要人工干预。这才是真正省时间的环节:几十上百份文件的重复复制粘贴,变成点一次按钮。

结果校验与常见坑
跑完不要直接交付,至少抽检一部分。以下是几个容易出问题的地方。
识别准确率不是恒定的。 easyocr 对清晰印刷体表现较好,但遇到低分辨率扫描、倾斜页面、表格线穿过文字、印章遮盖等情况,错字漏字仍会出现。手写体、艺术字和小字号数字的风险更高。如果某个字段对准确性要求高,建议保留手动审核模式,或者在 Excel 里加一列人工复核标记。
页面尺寸和渲染比例变了,框就废了。 同一批文件应当来自同一个模板、同一套扫描参数。如果混进了不同尺寸的页面,或者你在预览时改过缩放,区域坐标就可能偏移,表现为识别结果整体错位。处理前先确认这批文件的页面尺寸一致。
首次运行会下载模型。 网络不通或代理设置有问题时,easyocr 会在初始化阶段卡住或报错。先单独跑一次让它把模型缓存好,再进入批量流程。
路径里有中文和空格。 输出目录和源文件夹尽量用简短路径,避免深层嵌套。截图文件名由工具自动生成唯一标识,但目录本身如果有权限问题,写文件会静默失败,跑完发现少了截图就是这类原因。
别把整个流程当成零维护。 这批文件处理完,规则和区域配置通常只对当前模板有效。下一批换了版式,重新框一次区域比硬调参数更省事。
适合谁用,不适合谁用
如果你的场景是“固定版式的 PDF、固定位置的几个字段、数量多、重复度高”,比如发票信息登记、报表指标汇总、运单信息录入,这套框选加 OCR 加 Excel 导出的组合能明显减少手工劳动,而且全程本地运行,文件不上传到第三方服务。
如果你要做的是整页全文检索、复杂表格结构还原、或者每份文件版式都不一样,那按区域提取就不是合适的工具,应该考虑表格结构识别类的库或者更强的文档解析方案。先判断自己的任务属于哪一类,再决定要不要投入时间装环境,会比盲目上手更划算。

评论列表 (1条):
加载更多评论 Loading...