I adapted some code from David Boddie into a Python class to write
directly to Linux print queues. I have used it in one project and
it worked just fine. I've attached a copy for your use. You are
free to use it as you wish, with no guarantees or warranties.
Hope it helps.
Larry Bates
Steve said:
Hello,
I'm having problems sending information from a python
script to a printer. I was wondering if someone might send me
in the right direction. I wasn't able to find much by Google
TIA
Steve
#! /usr/bin/python
"""
Name : lpr.py
Author : adapted from code by David Boddie
Created : Tue 08th August 2000
Last modified : Thu 06th September 2001
Purpose : Send a file to a printer queue.
"""
import os, socket, string, sys
class lprClass:
_debug=0
_trace=0
def __init__(self, host, user, server, printer):
#
# Handle empty arguments by assiging default values
#
if host: self.host=host
else: self.host=socket.gethostname()
if user: self.user=user
else:
try:
self.user=os.environ['USER']
except KeyError:
print "lprClass***Error no user passed to class and no USER env variable found"
sys.exit(2)
if server: self.server=server
else: self.server=socket.gethostbyaddr(self.host)[2][0]
if printer: self.printer=printer
else:
try:
self.printer=os.environ['PRINTER']
except KeyError:
print "lprClass***Error no printer passed to class and no PRINTER env variable found"
sys.exit(2)
if self._debug:
print "lprClass*** host=",self.host
print "lprClass*** user=",self.user
print "lprClass*** server=",self.server
print "lprClass*** printer=",self.printer
#
# Create a socket object to communcate with the LPR daemon
#
if self._trace: print "lprClass***Creating a socketobj instance"
self.socketobj=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if self._trace: print "lprClass***Conecting to port 515 on server"
self.socketobj.connect((self.server, 515))
if self._trace: print "lprClass***Initializing LPR daemon for job to printer=", self.printer
self.socketobj.send("\002"+self.printer+"\012")
d=self.socketobj.recv(1024)
#
# Wait for reply and check response string
#
errormsg="lprClass***Error initializing communications with LPR daemon"
if d != "\000": self._abort(d, errormsg)
return
def _initcontrol(self, filename):
#
# Build a control string
#
control='H'+self.host[:31]+"\012"+'N'+filename[:131]+"\012"+ \
'P'+self.user[:31]+"\012"+'o'+filename[:131]+"\012"
#------------------------------------------------------------------------------------
# Send the receive control file subcommand
#
if self._trace: print "lprClass***Sending the receive control file subcommand"
self.socketobj.send("\002"+str(len(control))+" cfA000"+self.host+"\012")
#
# Wait for reply and check response string
#
if self._trace: print "lprClass***Waiting for reply"
d=self.socketobj.recv(1024)
errormsg="lprClass***Error in control string initialization for LPR daemon"
if d != "\000": self._abort(d, errormsg)
#------------------------------------------------------------------------------------
# Send the control file
#
if self._trace: print "lprClass***Sending the control file command"
self.socketobj.send(control)
self.socketobj.send("\000")
#
# Wait for reply and check response string
#
if self._trace: print "lprClass***Waiting for reply"
d=self.socketobj.recv(1024)
errormsg="lprClass***Error in control string for LPR daemon"
if d != "\000": self._abort(d, errormsg)
return
def _abort(self, data, errormsg):
print errormsg
print data.strip()
self.socketobj.send("\001\012")
self.socketobj.close()
sys.exit(0)
def _closelpr(self):
self.socketobj.send("\000")
#
# Wait for reply
# print "Wait for reply"
d=self.socketobj.recv(1024)
errormsg="lprClass***Error in _closelpr"
if d != "\000": self._abort(d, errormsg)
#
# Close the socket connection
#
self.socketobj.close()
return
def _sendheader(self, length):
#------------------------------------------------------------------------------------
# Send the receive data file subcommand
#
if self._trace: print "lprClass***Sending the receive data file subcommand"
self.socketobj.send("\003"+str(length)+" dfA000"+self.host+"\012")
#
# Wait for reply and check response string
#
if self._trace: print "lprClass***Waiting for reply"
d=self.socketobj.recv(1024)
errormsg="lprClass***Error in receive data file subcommand for LPR daemon"
if d != "\000": self._abort(d, errormsg)
return
def queuefile(self, filename):
try:
ifile=open(filename,'r')
except:
print "lprClass***Unable to find filename=%s to print" % filename
return
#
# Call routine to initialize LPR daemon with control information
#
self._initcontrol(filename)
#
# Must determine the length of the file by seeking to the
# end, save for later
#
ifile.seek(0, 2)
length = ifile.tell()
if self._debug: print "lprClass***queuefile-length=",length
#
# Send file header to LPR
#
self._sendheader(length)
#
# Return to the beginning of the file
#
ifile.seek(0, 0)
#
# Send the data file
if self._debug: print "Sending the data file"
while 1:
contents = ifile.readline()
if not contents: break
self.socketobj.send(contents)
ifile.close()
self._closelpr()
return
def queuestring(self, string):
#
# Call routine to initialize LPR daemon with control information
#
self._initcontrol('')
self._sendheader(len(string))
self.socketobj.send(string)
self._closelpr()
return
if __name__=="__main__":
import time
LPR=lprClass('','','','alarm')
LPR.queuestring('22222222222')
time.sleep(3.0)
LPR=lprClass('','','','alarm')
LPR.queuestring('00000000000')
LPR=lprClass('','','','alarm')
LPR.queuefile('testalarm.py')
time.sleep(3.0)
LPR=lprClass('','','','alarm')
LPR.queuestring('00000000000')