“把这些 PDF 转成 Excel”不是一个单一需求。电子 PDF 有可复制文本,扫描件只有图片;表格可能跨页,页眉也可能被误当成数据。报价前先识别文件类型,比一开始堆 OCR 参数更重要。
一、先做轻量分类,不急着提取
下面的标准库脚本通过文件特征做第一轮分流。它不是完整 PDF 解析器,但能快速发现加密文件、疑似图片型文件和异常小文件。
frompathlibimportPathdefclassify(path):data=path.read_bytes()ifnotdata.startswith(b"%PDF-"):return"not_pdf"ifb"/Encrypt"indata:return"encrypted"image_count=data.count(b"/Subtype /Image")text_ops=data.count(b" BT")+data.count(b"\nBT")return"scanned_like"ifimage_count>2andtext_ops==0else"text_like"forpathinsorted(Path("input").glob("*.pdf")):print(path.name,classify(path))输出示例:
invoice-01.pdf text_like invoice-02.pdf scanned_like contract.pdf encrypted分类结果决定后续工具:文本型文件使用 PDF 文本库,扫描件进入 OCR,小部分加密或破损文件进入人工确认。
二、先定义字段证据,再处理版式
发票提取不能只输出金额,还要保留文件名、页码、原始片段和置信状态。金额正则命中多个位置时不要擅自选择最大值,应输出候选并标记needs_review。
importredefamount_candidates(text):pattern=r"(?:合计|总额)[::\s]*[¥¥]?(\d+(?:\.\d{1,2})?)"returnre.findall(pattern,text)sample="小计:80.00\n合计:96.00"print(amount_candidates(sample))输出:
['96.00']三、验收按文件类型分层
从每种版式抽样,记录字段正确率与需要人工复核的比例。扫描件还要覆盖旋转、阴影、低分辨率和印章遮挡。若客户不能提供可核对的期望结果,就先交付分类报告和小样本,不承诺整批准确率。
📌 本文用文件分类、字段证据和分层验收拆开了 PDF 提取问题,避免把所有失败都归因于 OCR。
💬 你的 PDF 资料更常见的是扫描件、跨页表格、加密文件还是版式频繁变化?
👉 关注《Python 自动化接单实战》,下一篇继续拆解第三方 API 对接中的分页、限流与幂等。
参考来源
- Dev.to|You Can Build It. Should You?
- Hacker News|How Unix spell ran in 64 kB of RAM