diff --git a/addons/hw_escpos/controllers/main.py b/addons/hw_escpos/controllers/main.py index b4312fb94a8..cf449fd5434 100644 --- a/addons/hw_escpos/controllers/main.py +++ b/addons/hw_escpos/controllers/main.py @@ -8,6 +8,7 @@ import openerp import time import random import math +import md5 import openerp.addons.hw_proxy.controllers.main as hw_proxy import subprocess from threading import Thread @@ -150,25 +151,9 @@ class EscposDriver(Thread): for tax in taxes: eprint.text(printline(tax['tax']['name'],price(tax['amount']), width=40,ratio=0.6)) - logo = None - - if receipt['company']['logo']: - img = receipt['company']['logo'] - img = img[img.find(',')+1:] - f = io.BytesIO('img') - f.write(base64.decodestring(img)) - f.seek(0) - logo_rgba = Image.open(f) - logo = Image.new('RGB', logo_rgba.size, (255,255,255)) - logo.paste(logo_rgba, mask=logo_rgba.split()[3]) - width = 300 - wfac = width/float(logo_rgba.size[0]) - height = int(logo_rgba.size[1]*wfac) - logo = logo.resize((width,height), Image.ANTIALIAS) - # Receipt Header - if logo: - eprint._convert_image(logo) + if receipt['company']['logo']: + eprint.print_base64_image(receipt['company']['logo']) eprint.text('\n') else: eprint.set(align='center',type='b',height=2,width=2) diff --git a/addons/hw_escpos/escpos/escpos.py b/addons/hw_escpos/escpos/escpos.py index df96646c9d7..a4942019f8c 100644 --- a/addons/hw_escpos/escpos/escpos.py +++ b/addons/hw_escpos/escpos/escpos.py @@ -13,6 +13,10 @@ except ImportError: import time import copy +import io +import base64 +import math +import md5 from PIL import Image @@ -30,6 +34,7 @@ class Escpos: """ ESC/POS Printer object """ device = None encoding = None + img_cache = {} def _check_image_size(self, size): @@ -49,6 +54,7 @@ class Escpos: i = 0 cont = 0 buffer = "" + self._raw(S_RASTER_N) buffer = "%02X%02X%02X%02X" % (((size[0]/size[1])/8), 0, size[1], 0) @@ -65,6 +71,36 @@ class Escpos: buffer = "" cont = 0 + def _raw_print_image(self, line, size, output=None ): + """ Print formatted image """ + i = 0 + cont = 0 + buffer = "" + raw = "" + + def __raw(string): + if output: + output(string) + else: + self._raw(string) + + raw += S_RASTER_N + buffer = "%02X%02X%02X%02X" % (((size[0]/size[1])/8), 0, size[1], 0) + raw += buffer.decode('hex') + buffer = "" + + while i < len(line): + hex_string = int(line[i:i+8],2) + buffer += "%02X" % hex_string + i += 8 + cont += 1 + if cont % 4 == 0: + raw += buffer.decode("hex") + buffer = "" + cont = 0 + + return raw + def _convert_image(self, im): """ Parse image and prepare it to a printable format """ @@ -111,16 +147,45 @@ class Escpos: pix_line += im_right img_size[0] += im_border[1] - self._print_image(pix_line, img_size) - + return (pix_line, img_size) def image(self,path_img): """ Open image file """ im_open = Image.open(path_img) im = im_open.convert("RGB") # Convert the RGB image in printable image - self._convert_image(im) + pix_line, img_size = self._convert_image(im) + self._print_image(pix_line, img_size) + def print_base64_image(self,img): + + print 'print_b64_img' + + id = md5.new(img).digest() + + if id not in self.img_cache: + print 'not in cache' + + img = img[img.find(',')+1:] + f = io.BytesIO('img') + f.write(base64.decodestring(img)) + f.seek(0) + img_rgba = Image.open(f) + img = Image.new('RGB', img_rgba.size, (255,255,255)) + img.paste(img_rgba, mask=img_rgba.split()[3]) + + print 'convert image' + + pix_line, img_size = self._convert_image(img) + + print 'print image' + + buffer = self._raw_print_image(pix_line, img_size) + self.img_cache[id] = buffer + + print 'raw image' + + self._raw(self.img_cache[id]) def qr(self,text): """ Print QR Code for the provided string """ diff --git a/addons/point_of_sale/static/src/js/devices.js b/addons/point_of_sale/static/src/js/devices.js index 2de500a8552..8eb32d63873 100644 --- a/addons/point_of_sale/static/src/js/devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -190,7 +190,7 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal if(!this.keptalive){ this.keptalive = true; function status(){ - self.connection.rpc('/hw_proxy/status_json',{},{timeout:500}) + self.connection.rpc('/hw_proxy/status_json',{},{timeout:2500}) .then(function(driver_status){ self.set_connection_status('connected',driver_status); },function(){ diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index d2631358946..56fd2e4ea87 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -263,12 +263,26 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal self.company_logo.crossOrigin = 'anonymous'; var logo_loaded = new $.Deferred(); self.company_logo.onload = function(){ + var img = self.company_logo; + var ratio = 1; + var targetwidth = 200; + var maxheight = 100; + if( img.width !== targetwidth ){ + ratio = targetwidth / img.width; + } + if( img.height * ratio > maxheight ){ + ratio = maxheight / img.height; + } + var width = Math.floor(img.width * ratio); + var height = Math.floor(img.height * ratio); var c = document.createElement('canvas'); - c.width = self.company_logo.width; - c.height = self.company_logo.height; + c.width = width; + c.height = height var ctx = c.getContext('2d'); - ctx.drawImage(self.company_logo,0,0); + ctx.drawImage(self.company_logo,0,0, width, height); + self.company_logo_base64 = c.toDataURL(); + window.logo64 = self.company_logo_base64; logo_loaded.resolve(); }; self.company_logo.onerror = function(){