Annotation of wikisrc/guide/print.mdwn, revision 1.2

1.2     ! jdf         1: **Contents**
        !             2: 
        !             3: [[!toc levels=3]]
        !             4: 
1.1       jdf         5: # Printing
                      6: 
                      7: This chapter describes a simple configuration for printing, using an HP Deskjet
                      8: 690C printer connected to the first parallel port and the lpd printing system
                      9: that comes with NetBSD. First, the system will be configured to print text
                     10: documents, and next the configuration will be extended to print PostScript
                     11: documents using the Ghostscript program
                     12: ([`print/ghostscript`](http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/print/ghostscript/README.html)).
                     13: Please note that there are other, alternative printing systems available from
                     14: the [packages collection](http://www.NetBSD.org/docs/software/packages.html),
                     15: like LPRng
                     16: ([`print/LPRng`](http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/print/LPRng/README.html))
                     17: and the Common Unix Printing System (CUPS)
                     18: ([`print/cups`](http://ftp.NetBSD.org/pub/pkgsrc/current/pkgsrc/print/cups/README.html))
                     19: which are not covered here.
                     20: 
                     21: ## Enabling the printer daemon
                     22: 
                     23: After installation it is not yet possible to print, because the
                     24: [lpd(8)](http://netbsd.gw.com/cgi-bin/man-cgi?lpd+8+NetBSD-current) printer
                     25: spooler daemon is not enabled. To enable `lpd`, one line in the `/etc/rc.conf`
                     26: file must be changed from:
                     27: 
                     28:     lpd=NO
                     29: 
                     30: to
                     31: 
                     32:     lpd=YES
                     33: 
                     34: Or rather, insert it, it won't be in your `rc.conf` by default.
                     35: 
                     36: The change will come into effect at the next boot, but the daemon can be started
                     37: manually now:
                     38: 
                     39:     # sh /etc/rc.d/lpd start
                     40: 
                     41: To check if lpd is active, type the following command:
                     42: 
                     43:     # ps ax | grep lpd
                     44:       179 ??  Is     0:00.01 lpd
                     45: 
                     46: If you don't see an entry for lpd in the output of the previous command, the
                     47: daemon is not active.
                     48: 
                     49: The lpd system is configured via `/etc/printcap`. Before configuring
                     50: `/etc/printcap` it is a good idea to make a printer test, to check if the
                     51: physical connection between your computer and the printer is working. The test
                     52: sends out some data directly to the printer device. Assuming you use a printer
                     53: connected to the parallel port, this is `/dev/lpt0`; if you use an USB printer
                     54: try `/dev/ulpt0`. Please check the manpages of these devices
                     55: ([lpt(4)](http://netbsd.gw.com/cgi-bin/man-cgi?lpt+4+NetBSD-5.0.1+i386),
                     56: [ulpt(4)](http://netbsd.gw.com/cgi-bin/man-cgi?ulpt+4+NetBSD-5.0.1+i386))
                     57: for more information!
                     58: 
                     59: In our example we have a printer attached to the parallel port, so we run this:
                     60: 
                     61:     # lptest 70 5 > /dev/lpt0
                     62: 
                     63: To see what the output should look like, try the same command without
                     64: redirecting the output to the printer:
                     65: 
                     66:     # lptest 70 5
                     67:     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef
                     68:     "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg
                     69:     #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
                     70:     $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi
                     71:     %&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
                     72: 
                     73: A frequent problem is that the output on the printer is not correctly aligned in
                     74: columns but has a "staircase" configuration. This usually means that the printer
                     75: is configured to begin a new line at the left margin after receiving both a
                     76: `<CR\>` (carriage return, ASCII 13) character and a `<LF\>` (line feed, ASCII
                     77: 10) character. NetBSD only sends a <LF\> character. You can fix this problem in
                     78: two ways:
                     79: 
                     80:  * by changing the configuration of the printer
                     81:  * by using a simple printer filter (described later)
                     82: 
                     83: *Note*: In the previous example the lpd spooler is not involved because the
                     84: program output is sent directly to the printer device (`/dev/lpt0`) and is not
                     85: spooled.
                     86: 
                     87: ## Configuring `/etc/printcap`
                     88: 
                     89: This section explains how to configure the example printer to print text
                     90: documents.
                     91: 
                     92: The printer must have an entry in the `/etc/printcap` file; the entry contains
                     93: the printer id (the name of the printer) and the printer description. The
                     94: [lp(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lp+1+NetBSD-current)
                     95: id is the default used by many programs. Here is an example entry:
                     96: 
                     97: **Example `/etc/printcap`**
                     98: 
                     99:     lp|local printer|HP DeskJet 690C:\
                    100:             :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
                    101:             :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:
                    102: 
                    103: The file format and options are described in detail in the
                    104: [printcap(5)](http://netbsd.gw.com/cgi-bin/man-cgi?printcap+5+NetBSD-5.0.1+i386)
                    105: manpage. Please note that an *input filter* has been specified (with the `if`
                    106: option) which will take care of eliminating the staircase problem:
                    107: 
                    108:     if=/usr/local/libexec/lpfilter
                    109: 
                    110: ### Printer driver and HP printers
                    111: 
                    112: The example above uses the `lpa0` device (polled driver) for the printer,
                    113: instead of the `lpd0` (interrupt driven driver). Using interrupts there is a
                    114: communication problem with some printers, and the HP Deskjet 690C is one of
                    115: them: printing is very slow and one PostScript page can take hours. The problem
                    116: is solved using the `lpa` driver. It is also possible to compile a custom kernel
                    117: where lpt is polled.
                    118: 
                    119: The printcap entry for the printer also specifies a spool directory, which must
                    120: be created; this directory will be used by the lpd daemon to accumulate the data
                    121: to be printed:
                    122: 
                    123:     # cd /var/spool/lpd
                    124:     # mkdir lp
                    125:     # chown daemon:daemon lp
                    126:     # chmod 770 lp
                    127: 
                    128: The only missing part is the `lpfilter` input filter, which must be written. The
                    129: only task performed by this filter is to configure the printer for the
                    130: elimination of the staircase problem before sending the text to be printed. The
                    131: printer used in this example requires the following initialization string:
                    132: `<ESC>&k2G`.
                    133: 
                    134: **Example `/usr/local/libexec/lpfilter`**
                    135: 
                    136:     #!/bin/sh
                    137:     # Treat LF as CR+LF
                    138:     printf "\033&k2G" && cat && exit 0
                    139:     exit 2
                    140: 
                    141: After saving this script into the name you used in `/etc/printcap`, you need to
                    142: make sure it's executable:
                    143: 
                    144:     # chmod 755 /usr/local/libexec/lpfilter*
                    145: 
                    146: *Note*: There is another filter that can be used:
                    147: 
                    148:     if=/usr/libexec/lpr/lpf:
                    149: 
                    150: This filter is much more complex than the one presented before. It is written to
                    151: process the output of
                    152: [nroff(1)](http://netbsd.gw.com/cgi-bin/man-cgi?nroff+1+NetBSD-current)
                    153: and handles underline and overprinting, expands tab characters and converts `LF`
                    154: to `CR + LF`. The source to this filter program can be found in
                    155: `/usr/src/usr.sbin/lpr/filters/lpf.c`.
                    156: 
                    157: After everything is in place now, the
                    158: [lptest(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lptest+1+NetBSD-current)
                    159: command can be run again now, this time using the
                    160: [lpr(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lpr+1+NetBSD-current) command,
                    161: which will first send the data to the lpd spooler, then runs the filter and
                    162: sends the data off to the printer:
                    163: 
                    164:     # lptest 70 5 | lpr -h
                    165: 
                    166: The `lpr` program prints text using the spooler to send data to the printer; the
                    167: `-h` option turns off the printing of a banner page (not really necessary,
                    168: because of the `sh` option in `/etc/printcap`). Users more familiar with the
                    169: System V printing system can also use the
                    170: [lp(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lp+1+NetBSD-5.0.1+i386) command
                    171: that comes as an alternative to
                    172: [lpr(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lpr+1+NetBSD-5.0.1+i386).
                    173: 
                    174: ## Configuring Ghostscript
                    175: 
                    176: Now that basic printing works, the functionality for printing PostScript files
                    177: can be added. The simple printer used in this example does not support native
                    178: printing of PostScript files; a program must be used which is capable of
                    179: converting a PostScript document in a sequence of commands that the printer
                    180: understands. The Ghostscript program, which can be found in packages collection,
                    181: can be used to this purpose. This section explains how to configure lpd to use
                    182: Ghostscript to print PostScript files on the HP Deskjet 690C.
                    183: 
                    184: A second id for the printer will be created in `/etc/printcap`: this new id will
                    185: use a different input filter, which will call Ghostscript to perform the actual
                    186: print of the PostScript document. Therefore, text documents will be printed on
                    187: the *lp* printer and PostScript documents on the *ps* printer: both entries use
                    188: the same physical printer but have different printing filters.
                    189: 
                    190: The same result can be achieved using different configurations. For example, a
                    191: single entry with only one filter could be used. For this, the filter should be
                    192: able to automatically determine the format of the document being printed, and
                    193: use the appropriate printing program. This approach is simpler but leads to a
                    194: more complex filter; if you like it you should consider installing the
                    195: magicfilter program from the packages collection: it does this and many other
                    196: things automatically.
                    197: 
                    198: For our approach, the new `/etc/printcap` file looks like this:
                    199: 
                    200: **Example `/etc/printcap`**
                    201: 
                    202:     lp|local printer|HP DeskJet 690C:\
                    203:             :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
                    204:             :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:
                    205:     
                    206:     ps|Ghostscript driver:\
                    207:             :lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
                    208:             :mx#0:sh:if=/usr/local/libexec/lpfilter-ps:
                    209: 
                    210: Option `mx#0` is very important for printing PostScript files because it
                    211: eliminates size restrictions on the input file; PostScript documents tend to be
                    212: very big. The `if` option points to the new filter. There is also a new spool
                    213: directory.
                    214: 
                    215: The next steps are the creation of the new spool directory and of the filter
                    216: program. The procedure for the spool directory is the same as above:
                    217: 
                    218:     # cd /var/spool/lpd
                    219:     # mkdir ps
                    220:     # chown daemon:daemon ps
                    221:     # chmod 770 ps
                    222: 
                    223: The filter program for PostScript output is more complex than the text base one:
                    224: the file to be printed is fed to the interpreter which converts it into a
                    225: sequence of commands in the printer's control language, and then sends that off
                    226: to the printer. We have achieved to transform a cheap color printer in a device
                    227: suitable for PostScript output, by virtue of the NetBSD operating system and
                    228: some powerful freeware packages. The options used to configure Ghostscript are
                    229: described in the Ghostscript documentation: `cdj550` is the device used to drive
                    230: the HP printer.
                    231: 
                    232: **Example `/usr/local/libexec/lpfilter-ps`**
                    233: 
                    234:     #!/bin/sh
                    235:     # Treat LF as CR+LF
                    236:     printf "\033&k2G" || exit 2
                    237:     # Print the postscript file
                    238:     /usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \
                    239:     -sOutputFile=- -sPAPERSIZE=a4 - && exit 0
                    240:     exit 2
                    241: 
                    242: To summarize: two different printer names have been created on the system, which
                    243: point to the same physical printer but use different options, different filters
                    244: and different spool directories. Text files and PostScript files can be printed.
                    245: To print PostScript files the Ghostscript package must be installed on the
                    246: system.
                    247: 
                    248: ## Printer management commands
                    249: 
                    250: This section lists some useful BSD commands for printer and print jobs
                    251: administration. Besides the already mentioned `lpr` and `lpd` commands, we
                    252: have:
                    253: 
                    254:  * [lpq(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lpq+1+NetBSD-current)
                    255:    -- examine the printer job queue.
                    256:  * [lprm(1)](http://netbsd.gw.com/cgi-bin/man-cgi?lprm+1+NetBSD-current)
                    257:    -- delete jobs from the printer's queue.
                    258:  * [lpc(8)](http://netbsd.gw.com/cgi-bin/man-cgi?lpc+8+NetBSD-current)
                    259:    -- check the printing system, enable/disable printers and printer
                    260:    features.
                    261: 
                    262: ## Remote printing
                    263: 
                    264: It is possible to configure the printing system in order to print on a printer
                    265: connected to a remote host. Let's say that, for example, you work on the *wotan*
                    266: host and you want to print on the printer connected to the *loge* host. The
                    267: `/etc/printcap` file of loge is the one of the last example. From wotan it will
                    268: be possible to print Postscript files using Ghostscript on loge.
                    269: 
                    270: The first step is to accept the print jobs submitted from the wotan host to the
                    271: loge host. To accomplish this, a line with the wotan host name must be added to
                    272: the `/etc/hosts.lpd` file on loge:
                    273: 
                    274:     # hostname
                    275:     loge
                    276:     # cat /etc/hosts.lpd
                    277:     wotan
                    278: 
                    279: The format of this file is very simple: each line contains the name of a host
                    280: which is permitted to print on the local system. By default the lpd daemon only
                    281: listens on UNIX domain sockets for local connections, it won't accept any
                    282: network connects. To ensure the daemon also accepts incoming network traffic,
                    283: the following will need to be added to `/etc/rc.conf`:
                    284: 
                    285:     lpd_flags=""
                    286: 
                    287: Next, the `/etc/printcap` file on wotan must be configured in order to send
                    288: print jobs to loge. For example:
                    289: 
                    290:     lp|line printer on loge:\
                    291:         :lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
                    292:         :rm=loge:rp=lp
                    293:     
                    294:     ps|Ghostscript driver on loge:\
                    295:         :lp=:sd=/var/spool/lpd/ps:lf=/var/log/lp-errs:\
                    296:         :mx#0:\
                    297:         :rm=loge:rp=ps
                    298: 
                    299: There are four main differences between this configuration and the earlier one:
                    300: 
                    301:  1. The definition of `lp` is empty.
                    302:  2. The `rm` (remote machine) entry defines the name of the host to which the printer is connected.
                    303:  3. The `rp` (remote printer) entry defines the name of the printer connected to the remote host.
                    304:  4. It is not necessary to specify input filters because the definitions on the loge host will be used.
                    305:  5. The spool directories must still be created locally on wotan:
                    306: 
                    307:         # cd /var/spool/lpd
                    308:         # mkdir lp
                    309:         # chown daemon:daemon lp
                    310:         # chmod 770 lp
                    311:         # mkdir ps
                    312:         # chown daemon:daemon ps
                    313:         # chmod 770 ps
                    314: 
                    315: Now the print jobs for the `lp` and `ps` queues on wotan will be sent
                    316: automatically to the printer connected to loge.
                    317: 

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb