Home > Blockchain >  Print image on socket Termal printer (Python)
Print image on socket Termal printer (Python)

Time:01-11

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()
  • Related