前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >熬夜上线!poocr库火速修复PDF发票识别致命BUG

熬夜上线!poocr库火速修复PDF发票识别致命BUG

原创
作者头像
程序员晚枫
发布于 2025-04-09 16:35:50
发布于 2025-04-09 16:35:50
14300
代码可运行
举报
运行总次数:0
代码可运行

一、poocr库:你的发票识别瑞士军刀

上周刚给poocr库装上"多页PDF识别功能",以为自己在发票识别领域封神了。

poocr这货本质上是个OCR瑞士军刀,能对接腾讯云、百度、阿里等大厂的OCR接口,把各种发票、文档识别得明明白白。安装命令简单粗暴:

代码语言:bash
AI代码解释
复制
pip install poocr

用法更是傻瓜式:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 一行代码,实现发票的批量识别
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的报错消息像一桶冰水浇灭了所有美梦。那感觉就像刚给服务器喂了份"稳定运行"的保证书,转头它就给你表演火山喷发。

二、第一颗雷:Base64编码的"类型幻觉"

新上的PDF识别功能本该是降维打击——pymupdf切页,opencv校正,pandas结构化输出,三层防护像给数据穿了防弹衣。直到@agone发来的日志显示:pdf.convert_to_pdf()这行代码正在疯狂抛出TypeError

犯罪现场

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 原罪代码
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,相当于给数据加了个"次元转换器":

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
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字符串。

三、第二颗雷:浅拷贝的"数据克隆术"

更离谱的是第二颗雷——列表追加操作炸出了数据重复的核弹坑。用户发来的截图显示:同一页发票数据在结果里出现了三次,像被卡带复读的鬼魂。

犯罪现场

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
res_df.append(dict_pandas)  # 看似无害的追加操作

追踪到内存地址才发现,浅拷贝让所有字典指向同一个对象!每次更新都在改写所有记录,就像用同一块橡皮泥捏了三个"不同"的玩偶。深拷贝修复像给数据加了分身术:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import copy
res_df.append(copy.deepcopy(dict_pandas))

现在数据流终于像听话的火车按轨道进站,每页发票都有了自己独立的小隔间。

四、感谢@agone:没有你,我们还在跟幽灵数据跳舞

特别感谢@agone的深夜反馈!没有你的报错,我们可能还在跟幽灵数据跳舞。现在poocr v1.0.2版本已经带着加强版的PDF防火墙上线,更新命令如下:

代码语言:bash
AI代码解释
复制
pip install poocr==1.0.2 potx-cloud==0.0.7

新增了对象类型检查和深拷贝监控,连注释都加了警示灯:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# !!!!警告!!!! 必须深拷贝,否则数据会像被施了克隆魔法

五、互动时间:来分享你的踩坑故事!

评论区举手🙋‍♂️:

  1. 你踩过最深的浅拷贝坑长什么样?
  2. 有没有被base64编码折磨到怀疑人生的瞬间?
  3. 分享你深夜修Bug时的续命神器(我的是冰美式+辣条)

修复Bug就像给程序做外科手术,刀刃永远比创可贴靠谱。

记得给poocr库点个Star⭐,毕竟稳定运行的代码比梦境更美好~ 😴💤

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验