Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
print image files to thermal printer ESC-POS on stdout
#!/usr/bin/env python3
# esc-pos-image.py - print image files given as command line arguments
# to simple ESC-POS image on stdout
# scruss - 2014-07-26 - WTFPL (srsly)
# - 2021-01-09 (made python3 compatible - tvm Carko!)
# if you want a proper CUPS driver for a 58mm thermal printer
# that uses this command set, go here:
# https://github.com/klirichek/zj-58
import sys
from PIL import Image
import PIL.ImageOps
import struct
# give usage and exit if no arguments
if (len(sys.argv) == 1):
print('Usage:', sys.argv[0],
'image1 image2 ... [ > printer_device ]')
exit(1)
# print all of the images!
for i in sys.argv[1:]:
im = Image.open(i)
# 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')
# output header (GS v 0 \000), width, height, image data
sys.stdout.buffer.write(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', im.size[1] % 256,
int(im.size[1] / 256)),
im.tobytes())))
@scruss

This comment has been minimized.

Copy link
Owner Author

@scruss scruss commented Nov 5, 2014

explanation here: Notes on mini-printers and Linux … but these days, you probably want to use the klirichek/zj-58 driver.

@sloev

This comment has been minimized.

Copy link

@sloev sloev commented Jan 22, 2015

what license is this?
thanx for wonderfull software. saved me a headache on a home photobooth :-)

@scruss

This comment has been minimized.

Copy link
Owner Author

@scruss scruss commented Jun 10, 2015

This is the licence: WTFPL.

@Hritik14

This comment has been minimized.

Copy link

@Hritik14 Hritik14 commented Dec 2, 2020

Very lovely! Worked like nothing has ever have before in blueooth.

@scruss

This comment has been minimized.

Copy link
Owner Author

@scruss scruss commented Dec 5, 2020

Very lovely! Worked like nothing has ever have before in bluetooth.

Glad you like it! One day I'll update it to Python 3, but the bytes vs utf8 bit seems like work

@Carko

This comment has been minimized.

Copy link

@Carko Carko commented Jan 9, 2021

I made some changes to make it work with Pyton 3: https://gist.github.com/Carko/1507260d13eaa3e7cea6cecb713caca0

@scruss

This comment has been minimized.

Copy link
Owner Author

@scruss scruss commented Jan 10, 2021

Much appreciated, Carko!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.