By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,314 Members | 1,793 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,314 IT Pros & Developers. It's quick & easy.

Printing a file to a printer &/or changing the device that is referred to by stdout

P: n/a
Hi;
I am writing my first python program and would like to know how to
change stdout to refer to my default printer or any other printer on
my network. The other question is, Is there an API set of classes that
allow me to interact with network devices.

In other words, if I have a path and filename inside of a string
variable in python, how do I send the file to the printer??

Thanks in advance

Jody Burgess
jo**********@sewardconsulting.com
Jul 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
Jody,

Here is a class that I wrote some time ago that allows you
to print to Linux queue's (you didn't tell us if you are
on Linux, Mac or Windows). Hope it helps.

#! /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
Larry Bates
Syscon, Inc.
"Jody Burgess" <jo**********@sewardconsulting.com> wrote in message
news:26**************************@posting.google.c om...
Hi;
I am writing my first python program and would like to know how to
change stdout to refer to my default printer or any other printer on
my network. The other question is, Is there an API set of classes that
allow me to interact with network devices.

In other words, if I have a path and filename inside of a string
variable in python, how do I send the file to the printer??

Thanks in advance

Jody Burgess
jo**********@sewardconsulting.com

Jul 18 '05 #2

P: n/a

"Larry Bates" <lb****@swamisoft.com> wrote in message
news:4e********************@comcast.com...
Jody,

Here is a class that I wrote some time ago that allows you
to print to Linux queue's (you didn't tell us if you are
on Linux, Mac or Windows). Hope it helps.

#! /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.
"""


FWIW, a *lot* of modern network printers will respond to LPR out of the box.
So the platform
is (possibly) moot.

Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.