Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
print image files to thermal printer ESC-POS on stdout
# - print image files given as command line arguments
# to simple ESC-POS image on stdout
# scruss - 2014-07-26 - WTFPL (srsly)
# if you want a proper CUPS driver for a 58mm thermal printer
# that uses this command set, go here:
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 ]'
# print all of the images!
for i in sys.argv[1:]:
im =
# 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 ='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
struct.pack('2B', im.size[0] / 8 % 256,
im.size[0] / 8 / 256),
struct.pack('2B', im.size[1] % 256,
im.size[1] / 256),

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.


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 :-)


This comment has been minimized.

Copy link
Owner Author

@scruss scruss commented Jun 10, 2015

This is the licence: WTFPL.

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.