I'm trying to create a python script to print an image on my network connected thermal printer, through a socket connection.
I tried this script but instead of printing the image it prints an infinite string of characters:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("192.168.1.56", 9100))
with open("immagine.jpg", "rb") as f:
sock.sendall(f.read())
sock.close()
Are there any other methods to do this?
Maybe some escape command that I need to send with the image or something like that.
I also found this script (https://gist.github.com/Carko/1507260d13eaa3e7cea6cecb713caca0) but it should be adapted for sending via socket, does it make sense to try to adapt it or not?
CodePudding user response:
If someone were to happen here, the solution was this Github here: https://gist.github.com/Carko/1507260d13eaa3e7cea6cecb713caca0
Adapted like this:
import socket
import serial
from PIL import Image
import PIL.ImageOps
import struct
im = Image.open("YOUR/IMAGE/PATH")
# if image is not 1-bit, convert it
if im.mode != '1':
im = im.convert('1')
# if image width is not a multiple of 8 pixels, fix that
if im.size[0] % 8:
im2 = Image.new('1', (im.size[0] 8 - im.size[0] % 8,
im.size[1]), 'white')
im2.paste(im, (0, 0))
im = im2
# Invert image, via greyscale for compatibility
# (no, I don't know why I need to do this)
im = PIL.ImageOps.invert(im.convert('L'))
# ... and now convert back to single bit
im = im.convert('1')
job = [b'\x1b\r\n',
(b''.join((bytearray(b'\x1d\x76\x30\x00'),
struct.pack('2B', int(im.size[0] / 8 % 256),
int(im.size[0] / 8 / 256)),
struct.pack('2B', int(im.size[1] % 256),
int(im.size[1] / 256)),
im.tobytes()))),
b'\x1b\r\n',
b'\x1b\r\n',
b'\x1b\r\n',
b'\x1b\r\n',
b'\x1b\x69'
]
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.connect(("YOUR IP","YOUR PORT"))
for b in job:
soc.sendall(b)
soc.close()