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

Discussion in 'Python' started by Jody Burgess, Jul 16, 2004.

  1. Jody Burgess

    Jody Burgess Guest

    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
     
    Jody Burgess, Jul 16, 2004
    #1
    1. Advertising

  2. Jody Burgess

    Larry Bates Guest

    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" <> wrote in message
    news:...
    > 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
    >
     
    Larry Bates, Jul 16, 2004
    #2
    1. Advertising

  3. "Larry Bates" <> wrote in message
    news:...
    > 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.
     
    George Kinney, Jul 17, 2004
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Michael Tholkes
    Replies:
    2
    Views:
    423
    Yan-Hong Huang[MSFT]
    Jun 30, 2003
  2. Samuel Lee
    Replies:
    0
    Views:
    528
    Samuel Lee
    Nov 11, 2003
  3. Replies:
    1
    Views:
    289
    Sion Arrowsmith
    Sep 28, 2006
  4. jeniffer
    Replies:
    12
    Views:
    790
    Jordan Abel
    Mar 29, 2006
  5. Harpreet Singh via .NET 247

    Changing printer for printing pages

    Harpreet Singh via .NET 247, Jun 11, 2004, in forum: ASP .Net Datagrid Control
    Replies:
    0
    Views:
    134
    Harpreet Singh via .NET 247
    Jun 11, 2004
Loading...

Share This Page