上周刚给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
结果,昨晚11点47分,用户@agone的报错消息像一桶冰水浇灭了所有美梦。那感觉就像刚给服务器喂了份"稳定运行"的保证书,转头它就给你表演火山喷发。
新上的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的深夜反馈!没有你的报错,我们可能还在跟幽灵数据跳舞。现在poocr v1.0.2版本已经带着加强版的PDF防火墙上线,更新命令如下:
pip install poocr==1.0.2 potx-cloud==0.0.7
新增了对象类型检查和深拷贝监控,连注释都加了警示灯:
# !!!!警告!!!! 必须深拷贝,否则数据会像被施了克隆魔法
评论区举手🙋♂️:
修复Bug就像给程序做外科手术,刀刃永远比创可贴靠谱。
记得给poocr库点个Star⭐,毕竟稳定运行的代码比梦境更美好~ 😴💤
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有