Last active
April 2, 2025 11:28
-
-
Save scruss/36c31a9b653779b2b7d1 to your computer and use it in GitHub Desktop.
print image files to thermal printer ESC-POS on stdout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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()))) |
python-escpos didn't used to work for me, so I'm glad to see that it's getting some attention
it works for me, but maybe a bit too well... and by that I mean running python-escpos
takes over control of the USB device and never hands it back (even using close()
), so I can't use the simple printf "hi\n\n\n" > /dev/usb/lp0
after using it, and have to restart the printer to do so. Ah well, I guess I will do everything using the python library... >:(
No alternative but to follow after reading the WTFPL license Scruss 😂 love your work. Have been trying to get a thermal printer to print photos for ages so will give yours and @Carko a try. thanks guys.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey, thanks! I'm probably not finishing off the last line properly, so maybe data is getting corrupted. I haven't really done anything with this gist in a long time.
python-escpos didn't used to work for me, so I'm glad to see that it's getting some attention