Odoo 17的POS订单打印流程 - xiaohao0576/odoo-doc GitHub Wiki

通过分析Odoo17的源码,发现Odoo POS在打印收据之前,是会吧浏览器中显示的收据转变成图像,才发送给打印机的,这样的好处是可以打印任何字体,不用担心打印机缺少字体。坏处是会降低热敏打印机的打印效率,但是Odoo有对Epson的ePOS打印机进行优化后发送图像数据,所以Odoo在Epson ePOS打印机上的打印速度还不算慢。

BasePrinter基类

源码: https://github.com/odoo/odoo/blob/ca67a41c53f160b0fb7cf22359162a09d3ffdd57/addons/point_of_sale/static/src/app/printer/base_printer.js#L8 Odoo在POS模块定义了一个 BasePrinter的基类,无论是IoT连接的打印机,还是Epson ePOS打印机,都需要继承这个类,并实现里面的 processCanvas,sendPrintingJob,openCashbox函数

HWPrinter子类

源码: https://github.com/odoo/odoo/blob/ca67a41c53f160b0fb7cf22359162a09d3ffdd57/addons/point_of_sale/static/src/app/printer/hw_printer.js#L9

这个类主要是在打印的时候,发送数据给打印机的url接口。主要用于IoT连接的打印机

EpsonPrinter子类

https://github.com/odoo/odoo/blob/ca67a41c53f160b0fb7cf22359162a09d3ffdd57/addons/pos_epson_printer/static/src/app/epson_printer.js#L24

这个子类主要是用于Epson的ePOS打印机,发送处理过的黑白图像给Epson打印机,主要有以下三个步骤

canvasToRaster函数的主要作用是将一个可能包含彩色内容的canvas转换为单色(黑白)的光栅图像。 具体来说,这个函数实现了以下功能: 获取canvas的图像数据。 将彩色图像转换为灰度图像。 使用Floyd-Steinberg抖动算法将灰度图像转换为黑白二值图像。 生成一个光栅数据数组,其中1表示黑色像素,0表示白色像素。 这个函数的主要目的是为热敏打印机准备适合打印的图像数据。热敏打印机通常只能打印黑白内容,因此需要将原始的可能包含彩色或灰度的图像转换为纯黑白的图像。 Floyd-Steinberg抖动算法的使用可以在转换过程中保留一定的图像细节,使得最终打印出来的黑白图像在视觉上更接近原始图像。 这个函数的存在进一步证实了Odoo确实是将收据内容转换为图像后发送给Epson打印机的。这种方法允许Odoo生成复杂的收据布局,包括图形和不同字体,然后将其转换为打印机可以理解的格式。

encoderRaster函数的主要作用是将光栅图像数据编码为Epson打印机可以理解的格式。 具体来说,这个函数执行以下操作: 它接受一个光栅数据数组作为输入,这个数组包含了图像的黑白像素信息。 函数将这些像素数据分组为8位一组,每组代表8个连续的像素。 对于每组8个像素,函数创建一个字节,其中每个位代表一个像素(1表示黑色,0表示白色)。 4. 这些字节被收集到一个数组中,形成编码后的光栅数据。 最后,函数返回这个编码后的数据数组。 这个编码过程是必要的,因为Epson打印机期望接收特定格式的数据。通过将像素数据压缩成字节,可以减少需要传输给打印机的数据量,同时也符合打印机的数据格式要求。 这个函数的存在进一步证实了Odoo使用图像数据与Epson打印机通信。它是将图像数据转换为打印机可以直接处理的格式的关键步骤

最后组装成Epson兼容的xml数据,如下,其中encodedData就是刚才生成的图像字节数据

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <epos-print xmlns="http://www.epson-pos.com/schemas/2011/03/epos-print">
      <image width="[canvas.width]" height="[canvas.height]" align="center">
        [encodedData]
      </image>
      <cut type="feed"/>
    </epos-print>
  </s:Body>
</s:Envelope>
⚠️ **GitHub.com Fallback** ⚠️