活动现场打印胸牌,看起来像硬件问题:连上打印机、点打印、吐出标签。但 /home/ubuntu/odoo-temp/enterprise/event_iot 说明,真正难的部分其实在输出前的数据整形。打印机不是浏览器,模板稍微不规整,现场就会出错。
参考入口:
enterprise/event_iot/models/event_registration.pyenterprise/event_iot/report/event_registration_badge_printer_report.pyenterprise/event_iot/report/event_iot_templates.xml
一、为什么 badge 打印逻辑做在报表模型里
event_registration_badge_printer_report 不是简单地把注册信息塞进 QWeb。它在 _get_report_values() 里把 docs、escape()、load_image() 一起提供给模板,说明打印模板依赖的是一套专门的打印辅助函数,而不是普通网页渲染。
二、图片处理不是锦上添花,而是打印可用性的前提
load_image() 支持:
- 指定尺寸 resize;
contain模式补透明边;cover模式裁切后适配;flip=True时旋转 180 度;- 最终统一输出 PNG bytes。
这意味着活动 badge 上的 logo、头像、赞助商图不是“原图塞进去就行”。不同打印头、标签纸比例、安装方向都要求系统先做格式收敛。
三、为什么要专门做 escape()
ESC/Label 这类打印格式对控制字符很敏感。源码里把 _、^ 转义成 _5f、_5e,并提醒要在 ^FD 前启用 ^FH。这看似底层,但现场最怕的就是名字里一个特殊字符把整段指令打乱。
所以 badge 打印不是“把名字渲染出来”,而是“把名字安全编码成打印机理解且不会破坏指令流的文本”。
四、这类模块的业务边界
event_iot 不是活动报名主流程本身,而是把报名结果变成现场可执行输出。它接的是 event.registration,但重点不在报名是否成功,而在成功后如何可靠落地到硬件端。
也因此,这类模块常常代码不多,却离真实现场非常近:比例错了、方向反了、字符没转义,工作人员立刻就会遇到问题。
五、实战建议
- 如果胸牌图片被拉伸或裁错,先查 contain/cover 选择,而不是先改模板布局。
- 现场打印出现乱码或指令错位时,优先检查转义链路。
- 需要倒置安装打印头时,不要在素材里手工旋转,优先用
flip这类受控参数。
六、结论
event_iot 的价值,不是让活动系统“支持打印”这么简单,而是把活动报名数据转换成打印机真正能稳定执行的输出格式。图像缩放、方向控制、字符转义,都是现场可靠性的核心。
DISCUSSION
评论区