简介:面对成百上千份PDF,如何按页拆分并按指定区域文字自动命名?本文系统讲解一套可落地的技术方案:先解析拆分,再对图片型PDF做区域文字识别,随后将识别结果映射为新文件名,最后一键导出Excel对照表,包含原文件名、新文件名与各区域字段。读完后你将掌握批量处理的完整链路与工程化要点,显著降低人工成本与出错率。
在财务、法务、档案管理、教育教务等场景中,PDF 往往以“合订本”形式存在:一个文件里包含几十甚至上百份独立单据、合同、试卷或回执。后续要归档、分发、上传系统,就必须先按页或按逻辑单元拆分,再给每份文件起一个有业务含义的名字。
手工做这件事的痛点非常明确:
因此,一个理想的方案应当具备三个能力:批量拆分、区域文字识别、按识别内容自动命名,并且最好能把中间结果结构化留存,便于复核与统计。
把需求拆开来看,整条流水线可以抽象为四个阶段:
用伪代码表示其核心逻辑:
for pdf in source_pdfs:pages = split(pdf) # 阶段一:拆分for page in pages:fields = ocr_regions(page, regions) # 阶段二:区域识别new_name = render(template, fields) # 阶段三:按模板命名save_as(page, new_name)records.append({ # 阶段四:记录"原文件名": pdf.name,"新文件名": new_name,**fields})export_excel(records)
下面逐段展开。
工程上第一步不是急着拆,而是判定 PDF 的类型:
判定方法很简单:尝试提取某页文本,若字符数极少而页面又有明显图像,则大概率是扫描件。这个分支决定了后续走“文本提取”还是“OCR 识别”,直接影响准确率与处理成本。
常见拆分策略包括:
| 策略 | 适用场景 | 说明 |
|---|---|---|
| 按单页拆分 | 每页即一份单据 | 最简单,覆盖多数票据场景 |
| 按固定页数 | 每 N 页一份 | 合同、报告类 |
| 按书签/目录 | 结构清晰的合订本 | 依赖文档自带书签 |
| 按内容特征 | 页面含分隔标识 | 需结合识别结果二次判断 |
对大多数“一页一档”的场景,按单页拆分即可满足需求;若一份文档跨多页,则建议先按页拆,再依据识别到的关键字(如“第 X 页 共 Y 页”)做二次合并。
这是整个方案里最能体现精度的环节。整页 OCR 再靠正则去“猜”字段,鲁棒性差;而指定区域识别把识别范围收敛到固定坐标框内,噪声更少、准确率更高。
区域通常用矩形框表示,坐标为相对页面的比例值,以便适配不同分辨率的扫描件:
{"regions": [{"name": "编号", "x": 0.10, "y": 0.08, "w": 0.35, "h": 0.05},{"name": "姓名", "x": 0.55, "y": 0.08, "w": 0.20, "h": 0.05},{"name": "日期", "x": 0.10, "y": 0.85, "w": 0.30, "h": 0.05}]}
使用比例坐标的好处是:同一套模板可以复用于不同尺寸的扫描件,只要版式一致即可。
识别出来的原始文本往往带空格、换行、全角符号,直接做文件名会出问题。因此需要一层清洗:
def clean(text):text = text.strip()text = re.sub(r"\s+", "", text) # 去空白text = text.replace("/", "-").replace("\\", "-")text = re.sub(r'[<>:"|?*]', "", text) # 去除非法字符return text[:50] # 控制长度
这一步看似琐碎,却是避免“改名失败”“文件无法写入”的关键。
不要硬编码拼接逻辑,而是用模板描述规则,例如:
{日期}_{编号}_{姓名}.pdf
运行时把识别字段填入占位符即可。模板化的价值在于:业务规则变化时只改配置,不改代码。
同一批次里出现重名是常态,必须处理:
编号_001.pdf、编号_002.pdf;识别与改名完成后,把全过程结构化落表,是这个方案从“能用”走向“好用”的分水岭。
导出表格通常包含以下列:
这样做带来几个直接收益:
import pandas as pddf = pd.DataFrame(records, columns=["原文件名", "新文件名", "编号", "姓名", "日期", "状态"])df.to_excel("识别结果对照表.xlsx", index=False)
“PDF 批量拆分 + 指定区域识别 + 按内容命名 + 导出 Excel”本质上是一条文档自动化流水线:拆分解决“粒度”,区域识别解决“信息提取”,模板命名解决“业务语义”,导出表格解决“可核对与可统计”。
它的价值不在于某一项技术有多复杂,而在于把原本需要人工反复操作的环节,收敛成一次配置、批量执行、结果可查的稳定流程。对于每天要处理大量扫描单据的团队来说,这套思路能实实在在把时间从“抄编号、改文件名”里解放出来,转向更有价值的核对与决策工作。