一、poocr库:你的发票识别瑞士军刀
上周刚给poocr库装上"多页PDF识别功能",以为自己在发票识别领域封神了。
poocr这货本质上是个OCR瑞士军刀,能对接腾讯云、百度、阿里等大厂的OCR接口,把各种发票、文档识别得明明白白。安装命令简单粗暴:
pip install poocr
用法更是傻瓜式:
# 一行代码,实现发票的批量识别
poocr.ocr2excel.VatInvoiceOCR2Excel(
intput_path=r'C:\Users\Lenovo\Desktop\temp\增值税发票-test.pdf',
output_excel='./晚枫.xlsx',
configPath='./poocr-config.toml'
)
项目开源地址在这,欢迎来薅羊毛:https://github.com/CoderWanFeng/poocr
结果,昨晚用户@agone的报错消息像一桶冰水浇灭了所有美梦。
那感觉就像刚给服务器喂了份"稳定运行"的保证书,转头它就给你表演火山喷发。
二、第一颗雷:Base64编码的"类型幻觉"
新上的PDF识别功能本该是降维打击——pymupdf切页,opencv校正,pandas结构化输出,三层防护像给数据穿了防弹衣。直到@agone发来的日志显示:pdf.convert_to_pdf()
这行代码正在疯狂抛出TypeError
。
犯罪现场:
# 原罪代码
pdf_bytes = pdf.convert_to_pdf(page_num, page_num + 1)
base64_encoded_pdf = base64.b64encode(pdf_bytes).decode('utf-8')
pymupdf的对象居然不能直接喂给base64编码器!就像试图把3D模型塞进二维打印机,错误代码在深夜的服务器日志里跳起了迪斯科。修复方案是用fitz的select()
方法重新包装PDF,相当于给数据加了个"次元转换器":
import fitz # pymupdf的别名
temp_pdf = fitz.open()
temp_pdf.select([page_num]) # 只选中需要的页面
base64_encoded_pdf = base64.b64encode(temp_pdf.write()).decode('utf-8')
修复后,PDF终于像驯服的小龙,老老实实变成了Base64字符串。
三、第二颗雷:浅拷贝的"数据克隆术"
更离谱的是第二颗雷——列表追加操作炸出了数据重复的核弹坑。用户发来的截图显示:同一页发票数据在结果里出现了三次,像被卡带复读的鬼魂。
犯罪现场:
res_df.append(dict_pandas) # 看似无害的追加操作
追踪到内存地址才发现,浅拷贝让所有字典指向同一个对象!每次更新都在改写所有记录,就像用同一块橡皮泥捏了三个"不同"的玩偶。深拷贝修复像给数据加了分身术:
import copy
res_df.append(copy.deepcopy(dict_pandas))
现在数据流终于像听话的火车按轨道进站,每页发票都有了自己独立的小隔间。
四、感谢@agone:没有你,我们还在跟幽灵数据跳舞
特别感谢@agone的深夜反馈!没有你的报错,我们可能还在跟幽灵数据跳舞。现在poocr v1.0.2版本已经带着加强版的PDF防火墙上线,更新命令如下:
pip install poocr==1.0.2 potx-cloud==0.0.7
新增了对象类型检查和深拷贝监控,连注释都加了警示灯:
# !!!!警告!!!! 必须深拷贝,否则数据会像被施了克隆魔法
五、互动时间:来分享你的踩坑故事!
评论区举手🙋♂️:
你踩过最深的浅拷贝坑长什么样? 有没有被base64编码折磨到怀疑人生的瞬间? 分享你深夜修Bug时的续命神器(我的是冰美式+辣条)
修复Bug就像给程序做外科手术,刀刃永远比创可贴靠谱。
记得给poocr库点个Star⭐,毕竟稳定运行的代码比梦境更美好~ 😴💤