企业 活动 IoT

Odoo 企业版 Event + IoT 为什么不是“现场打印胸牌”而已:ESC/Label 图像裁切、文本转义与 badge 输出链路讲透

基于 event_iot 报表源码,讲清活动胸牌打印为什么要在报表层处理图片 contain/cover、180 度翻转与 ESC/Label 特殊字符转义,而不是把模板直接丢给打印机。

企业 其他
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 6 阅读

活动现场打印胸牌,看起来像硬件问题:连上打印机、点打印、吐出标签。但 /home/ubuntu/odoo-temp/enterprise/event_iot 说明,真正难的部分其实在输出前的数据整形。打印机不是浏览器,模板稍微不规整,现场就会出错。

参考入口:

  • enterprise/event_iot/models/event_registration.py
  • enterprise/event_iot/report/event_registration_badge_printer_report.py
  • enterprise/event_iot/report/event_iot_templates.xml

一、为什么 badge 打印逻辑做在报表模型里

event_registration_badge_printer_report 不是简单地把注册信息塞进 QWeb。它在 _get_report_values() 里把 docsescape()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

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。