74 lines
1.7 KiB
Python
Executable file
74 lines
1.7 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import pdf2tspl
|
|
import socket
|
|
import logging
|
|
import tempfile
|
|
import sys
|
|
|
|
if len(sys.argv) != 2:
|
|
print("Usage: %s /dev/path/to/printer" % sys.argv[0])
|
|
sys.exit(1)
|
|
|
|
printer = sys.argv[1]
|
|
open(printer, 'wb').close()
|
|
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
|
|
UEL = b'\x1b%-12345X'
|
|
ENTER_PDF = b'@PJL ENTER LANGUAGE = PDF'
|
|
|
|
def accept_one_job(sock):
|
|
def read_more_data(data):
|
|
new_data = sock.recv(1048576)
|
|
if not len(new_data):
|
|
logging.error('Received unexpected EOF from client')
|
|
return
|
|
data.extend(new_data)
|
|
|
|
def consume_up_to(data, marker):
|
|
while not marker in data:
|
|
read_more_data(data)
|
|
|
|
pos = data.index(marker)
|
|
before_marker = data[:pos]
|
|
after_marker = data[pos+len(marker):]
|
|
return before_marker, after_marker
|
|
|
|
data = bytearray()
|
|
|
|
_, data = consume_up_to(data, UEL)
|
|
_, data = consume_up_to(data, ENTER_PDF)
|
|
pdf_data, _ = consume_up_to(data, UEL)
|
|
pdf_data = pdf_data.lstrip()
|
|
|
|
with tempfile.NamedTemporaryFile(suffix=".pdf") as pdffile:
|
|
pdffile.write(pdf_data)
|
|
pdffile.flush()
|
|
tspl = pdf2tspl.pdf2tspl(pdffile.name)
|
|
|
|
with open(printer, 'wb') as fp:
|
|
fp.write(tspl)
|
|
|
|
logging.info('Job complete')
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
sock.bind(('0.0.0.0', 9100))
|
|
sock.listen()
|
|
|
|
class ConnectionClosed(Exception):
|
|
pass
|
|
|
|
while True:
|
|
conn, peer = sock.accept()
|
|
logging.info('New connection from %s' % peer[0])
|
|
|
|
try:
|
|
accept_one_job(conn)
|
|
except ConnectionClosed:
|
|
pass
|
|
except Exception as e:
|
|
logging.exception(e)
|
|
finally:
|
|
conn.close()
|