6. Spooling software

Until recently, the choice for Linux users was simple - everyone ran the same old lpd lifted mostly verbatim out of BSD's Net-2 code. Even today, most vendors ship this software. But this is beginning to change. SVR4-like systems including Sun's Solaris come with a completely different print spooling package, centered around lpsched.

Today, there are a number of good systems to chose from. I describe them all below; read the descriptions and make your own choice. PDQ is the simplest modern system with a GUI; it is suitable for both basic home users and (in a hybrid pdq/lprng setup) people in many larger environments. For business environments with mainly networked Postscript printers, a front-end program like GPR with LPRng is a good alternative; it handles PPD options directly and has a slightly nicer interface. In other cases CUPS is a good option; it too has excellent Postscript printer support, and offers IPP support, a web interface, and a number of other features.

6.1. LPD

LPD, the original BSD Unix Line Printer Daemon, has been the standard on Unix for years. It is available for every style of Unix, and offers a rather minimal feature set derived from the needs of timesharing-era computing. Despite this somewhat peculiar history, it is still useful today as a basic print spooler. To be really useful with modern printer, a good deal of extra work is needed in the form of companion filter scripts and front-end programs. But these exist, and it does all work.

LPD is also the name given to the network printing protocol by RFC 1179. This network protocol is spoken not only by the LPD daemon itself, but by essentially every networked print server, networked printer, and every other print spooler out there; LPD is the least common denominator of standards-based network printing.

LPRng (see Section 6.3) is a far better implementation of the basic LPD design than the regular one; if you must use LPD, consider using LPRng instead. There is far less voodoo involved in making it do what you want, and what voodoo there is is well documented.

There are a large number of LPD sources floating around in the world. Arguably, some strain of BSD Unix is probably the official owner, but everyone implements changes willy-nilly, and they all cross-pollinate in unknown ways, such that it is difficult to say with certainty exactly which LPD you might have. Of the readily available LPDs, VA Linux offers one with a few minor modifications that make the user interface much more flexible. The SourceForge LPD supports command-line option specification with a -o flag; options are then passed through to filters. This is similar to the features offered by a number of traditional Unix vendors, and similar to (although incompatible with) LPRng's -z option mechanism.

6.1.1. LPD front-ends

If you go with LPD, the best way to use it is via a front-end. There are several to chose from; GPR (see Section 3.3) and XPDQ (see Section 6.2) are perhaps the two best. Others exist; tell me about them.

6.2. PDQ

PDQ is a non-daemon-centric print system which has a built-in, and sensible, driver configuration syntax. This includes the ability to declare printing options, and a GUI or command line tool for users to specify these options with; users get a nice dialog box in which to specify resolution, duplexing, paper type, etc (see Figure 7).

Figure 6. XPDQ Main Window

Running all of the filters as the user has a number of advantages: the security problems possible from Postscript are mostly gone, multi-file LaTeX jobs can be printed effectively as dvi files, and so forth.

This is what I now use; I've written driver spec files for my printers, and there are several included with the distribution, so there are plenty of examples to base yours on. I've also written a few tools to automate driver spec generation to help the rest of you.

PDQ is not without flaws: most notably it processes the entire job before sending it to the printer. This means that, for large jobs, PDQ may simply be impractical—you can end up with hundreds of megs being copied back and forth on your disk. Even worse, for slow drivers like the better quality inkjet drivers, the job will not start printing until Ghostscript and the driver have finished processing. This may be many minutes after submission.

If you have many users, many printers, or anything else complex going on, I recommend using PDQ as a front-end to LPD-protocol based network printing (you can print via the lpd protocol to the local machine). In most such situations, rather than using the traditional BSD lpd as the back-end, I recommend LPRng:

Figure 7. XPDQ Driver Options Window

6.3. LPRng

Some Linux vendors (including Caldera) provide LPRng, a far less ancient LPD print spooling implementation. LPRng is far easier to administer for large installations (read: more than one printer, any serial printers, or any peculiar non-lpd network printers) and has a less frightfully haphazard codebase than does stock lpd. It can even honestly claim to be secure - there are no SUID binaries, and it supports authentication via PGP or Kerberos.

LPRng also includes some example setups for common network printers - HP LaserJets, mainly, that include some accounting abilities. If you'd like more information on LPRng, check out the LPRng Web Page. LPRng uses more or less the same basic filter model as does BSD lpd, so the LPD support offered by my website applies to LPRng as well. This can help you effectively use free software drivers for many printers.

LPRng is distributed under either the GPL or an Artistic license.

6.4. PPR

PPR is a Postscript-centric spooler which includes a rudimentary Postscript parsing ability from which it derives several nice features. It includes good accounting capabilities, good support for Appletalk, SMB, and LPD clients, and much better error handling than lpd. PPR, like every other spooler here, can call Ghostscript to handle non-Postscript printers.

I only recently found out about PPR; I don't know of anyone who has tried it. It was written by, and is in use at, Trinity College. The license is BSD-style; free for all use but credit is due.

According to the documentation, it's somewhat experimental. Malformed Postscript jobs won't print; instead they bounce, and it's up to the user to fix the Postscript. This may make it unsuitable for some environments, although most users generate Postscript with a small handful of well-characterized Postscript generators, so it probably wouldn't be that big an issue.

6.5. CUPS

One interesting newcomer on the scene is CUPS, an implementation of the Internet Printing Protocol (IPP), an HTTP-like RFC standard replacement protocol for the venerable (and klunky) LPD protocol. The implementation of CUPS has been driven by Michael Sweet of Easy Software Products; CUPS is distributed under the GPL.

I've finally done some work with CUPS, and it does work as advertised. There are a number of very good features in it, including sensible option handling; web, gui, and command-line interfaces; and a mime-based filtering system with strong support for Postscript. Since it is so new, however, it does have a number of quirks, and it is hard to recommend for large or secure installations at this time (as of version 1.1). It is a fine solution, however, for smaller installations or especially larger installatons with trusted users.

Like other systems, CUPS can be used with most existing drivers. Unfortunately, it's a bit tricky to configure an arbitrary driver for use with CUPS—at least if you want all the options to work—so it's best to find a preexisting PPD file and filter script to make your driver go. There are at least four sets of drivers which you can use with CUPS:


My web-based CUPS-O-Matic system can generate a suitable PPD for use with any printer driver that has full details entered in the Linux Printing Database. The PPD gets used together with a backend script named cupsomatic. CUPS-O-Matic uses free software drivers. At the moment I am concentrating on correctness rather than completeness, so rather few drivers are in fact supported. This will change over time.

CUPS Drivers and KUPS

The CUPS Drivers project is accumulating PPD files useable with either Postscript printers or the backend filter ps2gs2raw. These PPD files use free software drivers. KUPS is a companion setup program.

Postscript PPDs

CUPS can use vendor-supplied PPD files for Postscript printers directly. Often these come with the Windows drivers for a printer, or can be found on the printer vendor's website. Adobe also distributes PPD files for many Postscript printers.

ESP Print Pro

Easy Software Products, Inc. sells CUPS bundled with a collection of proprietary drivers. Although they are not free software, they do drive many common printers. The bundle is somewhat expensive measured against the price of a single supported printer, but it certainly has a place. These drivers are reputedly not terribly good, but they are somewhat comprehensive, and even mediocre quality is preferable to a paperweight.

The third-party program XPP (see Figure 4) offers a very nice graphical interface to the user functionality of CUPS, including an marvelous interface to print-time options (shown in Figure 5). For information on using XPP, see Section 3.3.2.