Linux 版 (精华区)

发信人: netiscpu (说不如做), 信区: Linux
标  题: [B] Red Hat Linux Unleashed (20)
发信站: 紫 丁 香 (Sat Jul 25 03:11:13 1998), 转信

   Printing
     _________________________________________________________________
                                      
               o Where To Start
               o Printing Plain Text Files
               o Hardware and Drivers
               o Printer Device Names
               o The Infamous lpr, lpd, and lpc Commands
               o The /etc/printcap File
               o How It All Fits
                    # The Staircase Effect
               o PostScript Support
                    # Printing DVI Files
               o Summary
       
     _________________________________________________________________
                                      
   20
   
   
   Printing
   
   
   This chapter introduces you to the topic of using the print facilities
   under Linux. We will cover the following topics:
     * Printing files under Linux
       
     * Getting the correct drivers for your hardware
       
     * An introduction to printer device names
       
     * Using the infamous lpr, lpd, and lpc commands
       
     * Working with the /etc/printcap file
       
     * How printing really works under Linux
       
     * Using a PostScript printer with DVI support
       
   
   Where To Start
   
   
   If you are reading this chapter after being frustrated with the
   efforts of getting even a text file printed from Linux, you are at the
   right chapter.
   
   On the other hand, if you have not even begun to deal with the act of
   printing from Linux to your printer, consider yourself lucky to have
   saved some time. Why, you ask? Well, chances are the default kernel
   you are booting with does not have printing enabled in it. If the
   capability is not there, you have to rebuild the kernel. How to
   rebuild and install the kernel has been dealt with in detail in
   Chapter 5, "Odds and Ends." All you have to remember is that you have
   to answer "y" (for yes) when asked whether you want printing enabled.
   The first time you build your kernel, the default is "n" (for no,
   don't build it). In later versions of the kernel, this option will be
   set to "y," but don't hold your breath just yet.
   
   Once you have rebuilt and installed your kernel, you should be able to
   cat files to the /dev/lp or use the standard UNIX command lpr to print
   out the parallel or serial printer port on your PC.
   
   If you have a serial printer, your printer will be one of the devices
   called /dev/ttyS?, /dev/ttys?, or /dev/cua?. If you have your printer
   hooked to the parallel, the devices would be /dev/lp0, and so on.
   Typing cat file >/dev/???? should force what you type to the printer,
   where the question marks signify the device name. You may have to be
   logged in as root to be able to write to the printing device, because
   these ports usually have a restricted number of processes with write
   permission.
   
   Printing Plain Text Files
   
   
   Most plain text files in the UNIX world are boring. No page numbers,
   line breaks, formatting information, or logical page breaks. If you
   have a dot matrix printer, the output can cross over the perforations.
   The output on the pages can be flushed way to the left, making it look
   lopsided with extra spacing on the right side of the page.
   
   For this reason, it's a good idea to send the text file through a
   program called a formatter. A simple formatter on Linux and UNIX is
   the pr command. The pr command is designed to format plain text for
   printing using a lineprinter. With pr you can add headers, footers,
   page numbers, date, margins, double-spaced lines, and so on. If you
   are a DOS user, you can think of the pr command as the PRINT
   command—in other words, a simple print utility.
   
   Hardware and Drivers
   
   
   We briefly touched the topic of printer drivers not being included in
   the default kernel. This section gives a little bit more detail on how
   to select your driver. There are two ways the kernel driver may be
   used to run the parallel printer ports. The first method, the
   original, is the polling driver. You will see this polling method used
   most often in most UNIX systems. The other method, the kernel driver,
   which may be used to run the parallel printer ports, is the interrupt
   driver. In principle, the interrupt driver only deals with the port
   when it gets an interrupt and should therefore be more efficient. In
   practice, people have found that efficiency depends on the type of
   machine. Selecting one or the other probably doesn't make too much
   difference in most situations.
   
   For the polling driver, you may adjust its polling frequency with the
   program tunelp without kernel twiddling. The actual driver is in the
   kernel source file lp.c. To choose the interrupt driver instead of the
   polled, use the program tunelp to set it. You can get tunelp from the
   CD as part of the installation process or from the sunsite archives at
   /pub/Linux/system/Printing/tunelp-1.3.tar.gz.
   
   Printer Device Names
   
   
   On an XT bus system LPT1: becomes /dev/lp0 (major=6, minor=0); on an
   AT system, LPT1: becomes /dev/lp1 (major=6, minor=1). See Table 20.1
   for device numbers for printers on Linux. See Chapter 53, "Writing
   Device Drivers," for a description of what major and minor mean.
   Basically, major refers to type of device and minor refers to the
   actual device if more than one device type can exist on the same
   machine. So if you have two parallel ports, the first is referred to
   with major=6, the next as minor=0.
   
   Table 20.1. Device numbers for printers on Linux.
   
                                      
                        Name Major Minor I/O address
                               lp0 6 0 0x3bc
                               lp1 6 1 0x378
                               lp2 6 2 0x278
                                      
   For a serial printer, use the /dev/ttyS? or /devttys? device. Don't
   use the /dev/cua? device for serial printing, because these are
   usually reserved for modems. The /dev/ttyS? devices have major=4 and
   the /dev/cua? devices have major=5.
   
   The Infamous lpr, lpd, and lpc Commands
   
   
   The lpr, lpd, and lpc commands are perhaps the programs hated the most
   by novices in the Linux community. If everything falls in place with
   these programs, you are set. If something is wrong, you have to know
   how these commands work together to get printing up and running.
   
   You can always print directly to the printer by using the following
   command:
   
ls > /dev/lp0

   Unfortunately, this command can interfere with other users trying to
   print. Also, this command may not even work if the computer is not
   able to time the sending of characters to the lineprinter correctly.
   On a slow printer, or a printer which is deselected or disconnected,
   this could cause your shell to hang.
   
   What Linux does is spool the data. Spooling means collecting data into
   a file, and then starting up a background process to send the data to
   the printer. There is a spool area for each printer connected to your
   machine. Data designated for the printer is collected in the spool
   area at the rate of one file per print job. A background
   process—called the printer daemon—constantly scans the spool
   areas for new files to print. When one appears, the data is removed
   from the spool area and sent to the appropriate printer. When more
   than one file is waiting to be printed, they will be printed in the
   order they were completed. The spool area is really a queue.
   
   The printer daemon needs the following information to do its job: the
   physical device to use, the spool area to look in, and if printing on
   a remote machine, the name of the remote machine and printer for
   remote printing. All this information is stored in a file called
   /etc/printcap.
   
   There are five programs that use this information. These programs are
   in the /usr/bin and /usr/sbin directories: lpr, lpq, lpc, lprm, and
   lpd. The first four are used to submit, cancel, and inspect print
   jobs. The /usr/sbin/lpd program is the printer daemon. There are man
   pages for all these commands, which you should consult for more
   information.
   
   The thing to remember is that by default lpr, lprm, lpc, and lpq
   operate on a printer called lp. You can define an environment variable
   called PRINTER to specify the printer name. For example, to print to
   the hplj printer, use lp -Phplj to override any setting of the PRINTER
   variable. Here is a quick introduction to some of the key commands
   related to printing under Linux:
     * The lpr command submits a job to the printer.
       
     * The lpq command shows you the contents of the spool directory for
       a given printer. Each file is specified by an ID and its location
       in the queue.
       
     * The lprm command removes a job from the printer queue. You have to
       specify the ID returned for that job specified by lpq.
       
     * The lpc command is the printer control command. This command lets
       you check the status of each printer and set its state. You can
       enable or disable printers and their queues. If no parameters are
       specified, lpc is in interactive mode, and you can type in your
       commands at a prompt. Replies to your commands are printed
       immediately. Type a ? for a list of commands you can use.
       
   All these programs work off one directory, usually the /var/spool/lpd.
   Each printer has its own area under this directory to spool data in.
   For my ps printer, I have a /var/spool/lpd/ps directory.
   
   The printer spool directories should belong to the daemon group and
   are both user and group read/writable, and world -readable. That is,
   the directory has to have permissions of -rwxrwxr-x (0775).
   
   Each spool directory should contain four files: .seq, errs, lock, and
   status. These files should have the permissions -rw-rw-r-. The .seq
   file contains the job number counter for lpr to assign a job. The
   status file contains the message to be reported by lpc stat. The lock
   file is used by lpd to prevent itself trying to print two jobs to the
   same printer at once. The errs file is a log of printer failures and
   is not required. The status file has a text description of what the
   lpd program is doing with that file, for example printing, waiting,
   and so on.
   
   The /etc/printcap File
   
   
   The file /etc/printcap is a text file and is owned by root. The
   contents of /etc/printcap is not the easiest thing to read. Each entry
   in this file contains a description for a printer and how data is to
   be handled for that printer. For example, a printcap entry will define
   what physical device is to be used, what spool directory data for that
   device should be stored in, what preprocessing should be performed on
   the data, where errors on the physical device should be logged, and so
   forth. You can limit the amount of data that may be sent in a single
   job, or limit access to a printer to certain types of users.
   
   You can have multiple printcap entries defining several different ways
   to handle data destined for the same physical printer. For example, a
   physical printer may support both PostScript and HP LaserJet data
   formats, depending on some setup sequence being sent to the physical
   printer before each job. It would make sense to define two printers,
   one of which preprocesses the data by prepending the HP LaserJet
   sequence, while the other prepends the PostScript sequence. Programs
   that generate HP data would send it to the HP printer, while programs
   generating PostScript would print to the PostScript printer.
   
   Programs that change the data before it is sent to the physical
   printer are called filters. It is possible for a filter to send no
   data at all to a physical printer. An example of such a filter entry
   in a printcap file is shown in the following lines:

# Sample printcap entry with two aliases
myprinter|laserwriter:\
# lp is the device to print to - here the first parallel printer.
:lp=/dev/lp0: \
# sd means 'spool directory' - where print data is collected
:sd=/var/spool/lpd/myprinter:

   Here's a brief summary of some of the entries in /etc/printcap. All
   fields in each entry are enclosed between a pair of colons and are
   denoted by a two-letter code. The two-letter code is followed by a
   value that depends on the type of field. There are three types of
   fields—string, boolean, and numeric. See Table 20.2 for a listing
   of some /etc/printcap fields.
   
   Table 20.2. Some fields for /etc/printcap.
   
                                      
                           Code Type Description
        lp string Specifies the device to print to, such as /dev/lp0
    sd string Specifies the name of the spool directory for this printer
   lf string Specifies the file to which errors on this printer are to be
                                   logged
                 if string Specifies the input filter name
           rm string Specifies the name of a remote printing host
              rp string Specifies the name of a remote printer
        sh boolean Specifies this to suppress headers (banner pages)
        sf boolean Specifies this to suppress end-of-job form feeds
   mx numeric Specifies the maximum allowable print job size (in blocks)
                                      
   Input filters are programs that take print data on their standard
   input and generate output on their standard output. A typical use of
   an input filter is to detect plain text and convert it into
   PostScript. That is, raw text is its input, and PostScript is its
   output.
   
   When you specify an input filter, the printer daemon does not send the
   spooled print data to the specified device. Instead, it runs the input
   filter with the spooled data as standard input and the print device as
   standard output.
   
   Sending your print data to a printer attached to another machine is
   done via the remote machine rm field and the remote printer rp field.
   Make sure that the print device field lp is empty. Note that data will
   still be spooled locally before being transferred to the remote
   machine, and any input filters you specify will also be run.
   
   Suppressing form feeds (sf) is most useful if your printer is
   typically used for output from word- processing packages. Most WP
   packages create complete pages of data, so if the printer daemon is
   adding a form feed to the end of each job, you get a blank page after
   each job. If the printer is usually used for program or directory
   listings, however, having that form feed ensures that the final page
   is completely ejected, so each listing starts at the top of a new
   page.
   
   The mx field enables you to limit the size of the print data to be
   spooled. The number you specify is in BUFSIZE blocks (1KB under
   Linux). If you specify zero, the limit is removed, enabling print jobs
   to be limited only by available disk space. Note that the limit is on
   the size of the spooled data, not the amount of data sent to the
   physical printer. If a user tries to exceed this limit, the file is
   truncated. The user will see a message saying lpr: <filename>: copy
   file is too large. This is useful if you have users or programs that
   may deliberately or accidentally create excessively large output. For
   PostScript physical printers, the limit is not useful at all because a
   very small amount of spooled PostScript data can generate a large
   number of output pages.
   
   In order for any other machines to print using your printers, their
   names have to be registered in either the file /etc/hosts.equiv or
   /etc/hosts.lpd. Both files are simple text files with one host name
   per line. For security, add hosts to /etc/hosts.lpd only. Do not use
   /etc/hosts.equiv because that gives more access rights to tasks rather
   than simply sending print jobs out to the printer.
   
   How It All Fits
   
   
   Let's go through the steps of setting up printer support on /dev/lp1.
   Make sure you do this as root.
    1. Create the spool directory for your printer, which we will call
       foobar for now. Make the permission -rwxrwxr-x.
       mkdir /var/spool/lpd /var/spool/lpd/foobar
       chown root.daemon /var/spool/lpd /var/spool/lpd/foobar
       chmod ug=rwx,o=rx /var/spool/lpd /var/spool/lpd/foobar
    2. In the directory /var/spool/lpd/foobar, create the necessary files
       and give them the correct permissions and owner:
       cd /var/spool/lpd/foobar
       touch .seq errs status lock
       chown root.daemon .seq errs status lock
       chmod ug=rw,o=r .seq errs status lock
    3. Create the shell script input_filter in the directory
       /var/spool/lpd/foobar. You can have this as an empty file, too.
       Just be sure that the file is owned by root, group daemon, and is
       executable by anyone.
       cd /var/spool/lpd/foobar
       chmod ug=rwx,o=rx input_filter
    4. Create the file /etc/printcap if it doesn't already exist. Remove
       all entries in it and add the test printcap entry given in Listing
       20.1. Make sure the file is owned by root, and read-only to
       everyone else (-rw-r-r-).
       
       Listing 20.1. A sample /etc/printcap file.

#
# Copyright 1983 Regents of the University of California.
# All rights reserved.
#
# Redistribution and use in source and binary forms are permitted
# provided that this notice is preserved and that due credit is given
# to the University of California at Berkeley. The name of the University
# may not be used to endorse or promote products derived from this
# software without specific prior written permission. This software
# is provided "as is" without express or implied warranty.
#
# @(#)etc.printcap 5.2 (Berkeley) 5/5/88
#
# DecWriter over a tty line.
#lp|ap|arpa|ucbarpa|LA-180 DecWriter III:\
# :br#1200:fs#06320:tr=\f:of=/usr/lib/lpf:lf=/usr/adm/lpd-errs:
#lp:lp=/dev/lp0:sd=/var/spool/lp0:of=/usr/lib/lpf: lf=/usr/adm/lpd-errs
#
# Generic printer:
lp:lp=/dev/lp1:sd=/var/spool/lp1:sh
#
# typical remote printer entry
#ucbvax|vax|vx|ucbvax line printer:\
# :lp=:rm=ucbvax:sd=/var/spool/vaxlpd:lf=/usr/adm/lpd-errs:
#varian|va|Benson Varian:\
# :lp=/dev/va0:sd=/var/spool/vad:mx#2000:pl#58:px#2112:py#1700:tr=\f:\
# :of=/usr/lib/vpf:if=/usr/lib/vpf:tf=/usr/lib/rvcat:cf=/usr/lib/vdmp:\
# :gf=/usr/lib/vplotf:df=/usr/local/dvif:\
# :vf=/usr/lib/vpltdmp:lf=/usr/adm/lpd-errs:
#versatec|vp|Versatec plotter:\
# :lp=/dev/vp0:sd=/var/spool/vpd:sb:sf:mx#0:pw#106:pl#86:px#7040:py#2400:\
# :of=/usr/lib/vpfW:if=/usr/lib/vpsf:tf=/usr/lib/vcat:cf=/usr/lib/vdmp:\
# :gf=/usr/lib/vplotf:vf=/usr/lib/vpltdmp:lf=/usr/adm/lpd-errs:\
# :tr=\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
#\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
#\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n:
#
#lp|panasonic:lp=/dev/lp1:sd=/var/spool/lp/panasonic:lf=/usr/bin/mail:mc#1:\
# ft=$$c$$p$$r$$f:hl#2:fl#3:ht=$$c$$n$$r$$t:sh:
#
# HP Laser jet plus
#lp|hpj:\
# :lp=/dev/lp1:\
# :sd=/var/spool/lp1:\
# :mx#0:\
# :of=/var/spool/lp1/hpjlp:
# :lf=/var/spool/lp1/hp-log:
#
#lp|Generic dot-matrix printer entry:\
# :lp=/dev/lp1:\
# :sd=/var/spool/lp1/lp:sh:\
# :if=/usr/sbin/lpf:\
# :df=/var/spool/lp1/filter.ps:\
# :tf=/var/spool/lp1/filter.ps:\
# :af=/var/spool/lp1/lp-acct:\
# :lf=/var/spool/lp1/lp-err:
    5. Start the lp daemon with the lpd command.
       
    6. Do a test print using the command:
       ls -l | lpr -Pmyprinter
       
   You can restrict remote users by group name by specifying the groups
   permitted, using one or more rg fields; for example, /etc/printcap -
   :rg=admin: restricts access to a printer to those users belonging to
   the group admin. You can also restrict access to those users with
   accounts on your system, by specifying the boolean flag :rs: in your
   /etc/printcap.
   
   The Staircase Effect
   
   
   The staircase effect results in lines printed one after another, with
   each line beginning where that last one ended. Usually, the output
   results in a few lines on the first page followed by many blank pages.
   An example of such an output is as follows:
        one
       
        two
       
        three
       
        four
       
   Linux terminates each line of a file with a linefeed but not a
   carriage return. Therefore, the physical printing device should start
   each line below the end of the previous line. Some printers can be set
   to treat "linefeed" as "carriage return, linefeed," others cannot be
   set this way. If your printer can be set to treat "linefeed" as
   "carriage return, linefeed," then do that. If the printer cannot be
   modified, you should create a shell script filter that reads:

#!/bin/sh
if [ "$1" = -c ]; then
cat
else
sed -e s/$/^M/
fi
# the "echo -ne" assumes that /bin/sh is really bash
echo -ne \\f

   Install this filter as the if filter by putting :if=/usr/lib/lpf: (or
   whatever) in your /etc/printcap entry for the printer.
   
   Magic filters deduce their input files types from "magic numbers,"
   which is a distinctive byte pattern at particular offsets. Magic
   filters are usually Perl scripts, Shell scripts, or C programs that
   simply identify the file type and then call the appropriate non-magic
   filter. A magic filter usage example is the "file" command which tries
   to interpret the type of file by reading the first few bytes.
   
   PostScript Support
   
   
   The Linux and UNIX community is completely PostScript dependent when
   it comes to documentation. If you don't have PostScript printing
   capability in your printer, there are times when you cannot even read
   documentation for software packages.
   
   If you have access to a PostScript printer, no problem. Print all you
   want. On the other hand, if you want to save paper or do not have
   access to a PostScript printer, consider using Ghostscript. See
   Chapter 25, "Ghostscript," for more information about installing and
   using Ghostscript. In a nutshell, Ghostscript, which comes from the
   GNU project, is a PostScript interpreter that accepts PostScript input
   and generates output appropriate for X displays, printers, and some
   specialized display hardware and fax software.
   
   There are a number of utilities that enable text to be printed to a
   PostScript device.
     * a2ps. This utility takes text and turns it into a PostScript
       document with headers and footers and page numbers. You can even
       print two pages on one sheet of paper.
       
     * nenscript. The nenscript program is a clone of the commercial
       enscript program. The functionality is the same as that of a2ps.
       
     * gslp. This is a PostScript program that comes with Ghostscript and
       is used to print a preamble to text files to convert the text
       files into PostScript. Check the man pages for gslp.ps.
       
   
   Printing DVI Files
   
   
   A DVI file is the processed output from a LaTeX or TeX input file. To
   print a DVI file to a PostScript printer, you can use dvips or eps.
   The dvips program converts DVI into PostScript. The output can be
   piped into Ghostscript or sent directly via lpr to a PostScript
   printer. eps is a program which converts DVI files directly into the
   standard Epson printer language. It is a DVI driver for Epson
   printers.
   
   Summary
   
   
   This chapter has given you a quick tour of the printing system under
   Linux. Armed with the information in this chapter, you should be able
   to get printing to work on your Linux machine.
   

--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 修改:.netiscpu 于 Jul 25 03:50:07 修改本文.[FROM: mtlab.hit.edu.cn]
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:422.622毫秒