PRINTING IN LINUX WITH CUPS
By Robert Spotswood
General Printing Tips
Understand your printing needs. If you will print mostly text, a laser will give
much better quality and cost per page. If you need low volume color, you'll want
an inkjet. If you want high volume color, good luck!
Always check the compatibility lists! Don't buy a printer until you know your
OS(s) is(are) supported.
If in doubt, make sure the cable is IEEE 1284. Some old printers don't need this
cable, but most (all?) new printers require this type of cable. Using a non-IEEE
1284 cable could void your warranty.
If using a parallel port on a computer, set your bios correctly. The choices on a
modern bios are SPP, ECP, EPP, ECP+EPP. SPP is the poorest choice. ECP is the
best choice for printers and scanners. EPP works best for things like parallel port
drives. ECP+EPP is a compromise between ECP and EPP. Don't select this unless
you have multiple parallel port devices that would use both ECP and EPP.
Also in the bios, if you have the option, "EPP Mode Select", pick "EPP 1.9". Note
that with an IEEE 1284 cable and this setting, cable lengths as long as 50 meters
have been used successfully.
You get what you pay for. From the printing howto: "The least expensive printers,
for example, have a MTBF [Mean Time Between Failures] of about three
If you buy supplies and equipment online, try to use the affiliate program for the
linuxprinting organization. This helps to support them and other free printing
Printing in Linux Introduction
Setting up printing under Linux isn't fun or easy, especially for newbies.
One LinuxJournal article estimates that printing problems take up about 25% of a
system administrator's time.
Some distros (Redhat for instance) come with semi-automatic printer
Unfortunately, these are unreliable and cover only a limited number of printers.
Printing other than straight text (<sarcasm>Who would want to print graphics
anyway!?</sarcasm>) has always been something of an afterthought. It shows!
Why choose CUPS?
The four main printing programs in Linux today are:
lpr (note this is also called lpd; here I use the terms interchangeably)
Note a few programs have their own printing system, such as StarOffice, and
WordPerfect. They tend to be inferior in that the number of printer drivers available is
often vary limited.
Sometimes referred to as BSD-style print queue or lpd.
Runs as root. The fewer root programs you run, the safer your system is.
Listens on all interfaces (including your internet interface). You cannot turn this
off. Therefore, this is another security risk.
Really only does text or postscript on its own.
It can be coupled with Ghostscript to do graphics and support more printers.
Setting this up can be maddening, but it works ok (sans security) once it is setup.
lpr is the least common denominator of standards-based network printing.
lpr is widely supported.
From the Linux printing howto: "...recommend that people install and use CUPS
or PDQ in most cases instead of (or in addition to) lpd."
Designed to be an improvement on lpr.
LPRng is far easier to administer for large installations than lpr.
It supports authentication via PGP or Kerberos.
LPRng uses more or less the same basic filter model as lpr. This means lpr print
filters will work with lprng too.
The Linux printing howto does not recommend it.
As one user put it:
...LPRng, which is in my view an encoded acronym for "You Don't Need a
printer." The BSD print arrangement could be understood with sufficient study,
but with LPRng you're better off on a North Carolina beach with a metal detector,
looking for treasure. Where configuring the BSD-style stuff would impart
neurosis, LPRng can get you a new garment, one whose arms buckle in the
back...I set about making LPRng work with my LaserJet III-D with PostScript
cartridge. Two hours later, it was time to consider other options.
Wasn't able to get to the home page for this project, so I can't offer much info.
(What I have is all second hand.)
It is one of the two printing systems recommended by the printing howto.
PDQ is perhaps the easiest to understand and use of the four printing systems, but
it is not as powerful as CUPS.
No info on security was available for this presentation.
Samba (at least 2.08) does not seem to support pdq.
Cups is recommended by the printing howto.
It supports a new internet standard: the Internet Printing Protocol (IPP).
IPP has been embraced by dozens of printer and printer server manufacturers and
is supported by Microsoft Windows 2000.
IPP, and hence CUPS, supports access control, authentication, and encryption.
Since IPP runs over http, and CUPS supports IPP, users can check status
information on a printer, manage their printers, and manage their jobs using their
Has several GUI's for configuring, or you can use a web browser.
Samba supports CUPS.
KDE 2.2 includes direct cups support. Of course, you can still use cups with KDE
Can be configured to run on specific interfaces and specific ports.
The cups-drivers package contains drivers for roughly 1220 printers. This doesn't
include printers that are compatible (i.e. There is no hp lj2100 driver, but this
printer can use the hp lj6p drivers which are present.)
Has command line replacements for the lpr commands, but they support more
Cups is supported by: Caldera, Conectiva*, Debian, easyLinux*, HP-UX, IRIX,
Linux Mandrake*, Peanut*, Red Hat, Solaris, SuSE, Tru64, UNIX, TurboLinux,
and AIX. The ones with a * use cups as the primary printing system.
Get the rpms. If they are not included in your distribution, you can get them from
The latest version as of 07/06/01 is 1.1.9. There are two rpms: cups and cups-
devel. The cups-devel is optional. Some rpm versions also include a third and
fourth rpm: libcups1 and libcups1-devel.
The latest version of the cups-drivers can be found at
latest version is 1.0-31. Note this does require ghostscript.
SSL support requires the SSL libraries of course.
Warning: cups will overwrite your old printing system, especially lpr. Backup
anything you want to save!
Remove the old lpr "rpm -e lpr". Install cups: "rpm -Uvh cups-1.1.8-Linux-2.4-
intel.rpm" to install the rpm(s). Note if you have a problems installing cups, trying
downloading a src rpm and compiling your own version (rpm --rebuild --
Whichever way you install CUPS, don't forget to start it. This will vary depending
on your system, but the command "/usr/sbin/cupsd" will usually work. Also, don't
forget to put it in your startup files so when the occasion comes to reboot your
machine, printing will still work.
Get the tarball. If they are not included in your distribution, you can get them
SSL support requires the SSL libraries of course.
cups-drivers tarball can be found at http://sourceforge.net/projects/cups/. The
latest version is 0.3.6. I believe this requires ghostscript.
Installing a New Printer via your web
Go to http://127.0.0.1:631/printers
You can change the port cups listens on but this is not recommended.
If cups is listening there, you can also use a different IP address.
If localhost resolves to 127.0.0.1 (as it should), you can use localhost instead of
Click on the add printer button
Enter root and root's password.
First page of the Add printer "wizard"
Now enter a name, location, and description.
The location and description are optional but recommended.
Here, you can see I entered myprinter, next to the computer, and optra E312.
Enter whatever is appropriate for your printer.
Second page of the Add printer "wizard"
Select the device the printer is attached to. In my case, it is my parallel port #1
(Ignore the Epson part).
The various options are: Appsocket/HP JetDirect; Internet Printing Protocol
(another cups printer, or perhaps a Windows 2000 shared printer); LPD/LPR Host
or printer; parallel ports (there is a listing for each one); serial ports (there is a
listing for each one); or Unknown Network Device (SMB).
Note for all attachments except parallel there is an extra step. This is discussed
Third page of the Add printer "wizard"
Select the manufacturer of your printer (or compatible printer driver). In my case,
the Optra E312 is made by Lexmark.
The printer drivers mentioned above have 40 different manufacturers.
Fourth page of the Add printer "wizard"
Select the model/driver of/for your printer (or compatible printer driver). In my
case, it is the Optra E312
Fifth (and last) page of the Add printer "wizard"
If everything went well, this is what you'll see.
For ports other than parallel, an extra page comes between the second and third
page. An example is below.
To print to an lpd printer server, enter "lpd://hostname/queue" . You must know
the hostname and the queue name. These are the names of the printer server, not
For things like an HP JetDirect (assuming you aren't using it's lpr support), enter
"socket://hostname". Note at least some versions of the HP JetDirect firmware do
not correctly implement IPP.
For print servers than support IPP, you can use either
"http://hostname:631/ipp/printername: or "ipp://hostname/ipp/printername". I
haven't used this method myself yet.
For serial ports, set the settings to the correct value. The command "lpinfo -v"
should at least tell you the baud rate.
To print to a SMB server (such as windows), be sure to read the Samba and cups
section first! There are several ways to specify a SMB server. See the table below.
Username and password Not
Username and password required
is in the
is in a
The page for everything except parallel ports and serial ports:
Here is the page for serial ports:
The cupsd.conf file
Like most servers in Unix, much of cups can be configured/controlled through the
cupsd.conf file. Usually, this will be found in /etc/cups.
There are six different configuration files for cups. cupsd.conf is the only one you
would normally edit by hand.
cupsd.conf has 69 different directives. We will only cover a few of them. See the
official documentation for cups for information on the rest.
By default, cups will listen on every interface. Unless you want to offer your
printer to the world, you must block this. Although you can firewall this (and that
is a good idea anyway), you can also not have cups listen on your internet
connection. This also prevents any possibility of a root exploit from the internet.
Of course, you still have internal crackers to worry about...
In cups.conf, comment out the lines:
Replace them with:
Still leaves a UDP port 631 open to the world though. The simplest way to close
this port is by turning browsing off, but it may cause problems if you have other
cups servers (and maybe clients?). The line for this is:
Another way to limit access to UDP on port 631, but less secure, is to add the
BrowseAllow from 127.0.0.1
BrowseAllow from lan_ip_subnet (i.e. 192.168.1.0/24)
Cups and Samba
Starting with Samba version 2.06, cups is supported.
If you are going to print to SMB servers, or allow clients to send print jobs to your
cups server using the SMB protocol, you must install and configure Samba.
To configure Samba for CUPS (windows users can print to your cups server), edit
the smb.conf file and replace the existing printing commands and options with the
printing = cups
Versions of Samba older than 2.06 and broken versions of Samba (2.06 and 2.07
have been reported) require the following lines in your smb.conf file:
printing = sysv
printcap name = lpstat
print command = lp -d %p -o raw %s; rm -f %s
You will also need to add a [printer] section to your smb.conf file. (Otherwise,
you are sharing any printers!) Here is a sample one I use:
# NOTE: If you have a CUPS print system there is no need to
# specifically define each individual printer.
# You must configure the Samba printers as "Generic PostScript
# on your Windows clients.
# If you wish to configure the printers directly on the Windows
# (i.e. use the windows drivers on the clients) you must swap the
# 'print command' line below with the commented one.
comment = All Printers
path = /var/spool/Samba
browseable = yes
# to allow user 'guest account' to print.
guest ok = yes
writable = no
printable = yes
create mode = 0700
# print command: see above for details.
print command = lpr-cups -P %p -o raw %s # using client side
# print command = lpr-cups -P %p %s # using cups own drivers
#generic PostScript on clients).
# lpr -P %p %s
lpq command = lpstat -o %p
lprm command = cancel %p-%j
To configure CUPS for SAMBA (cups can use printers on windows machines),
run the following command:
ln -s `which smbspool` /usr/lib/cups/backend/smb
Your Samba installation or cups installation *MAY* have already done this, so
check for link first.
Cups command line tricks and tips
Because cups has a command line equivalent to the lp and lpr commands (I prefer
lpr), all the commands that worked with the old LPD print system still work
exactly the same.
Only the lpr version of the commands will be presented here. The equivalent lp
commands do differ in some cases.
Cups, however, adds a bunch of new options you can use that are not present in
Only a few of the options will be presented here. See the docs for the full list.
Basic print commands
To print to your default printer, use the command: "lpr filename".
To print to a specific printer, use the command "lpr -P printername filename".
To see what printers are setup, you can use the web page (see above), or use the
command "lpstat -d -p". The -d tells you the default printer, and the -p lists the
printers available, and their status.
Advanced print commands - Paper orientation and size
With cups, you can easily change the printout paper orientation.
To print portrait, you don't need any special options. It's the default.
To print landscape, "lpr -o landscape filename"
Cups also allows you to specific media size, type and source. Of course, your printer
must support the options you choose. From the cups manual, the most common are:
Letter - US Letter (8.5x11 inches, or 216x279mm)
Legal - US Legal (8.5x14 inches, or 216x356mm)
A4 - ISO A4 (8.27x11.69 inches, or 210x297mm)
COM10 - US #10 Envelope (9.5x4.125 inches, or 241x105mm)
DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)
Transparency - Transparency media type or source
Upper - Upper paper tray
Lower - Lower paper tray
MultiPurpose - Multi-purpose paper tray
LargeCapacity - Large capacity paper tray
To use these options, the command is "lpr -o media=option1,option2,etc filename".
Multiple options are allowed, and they are not case sensitive. Note there are no spaces in
Advanced print commands - Duplexing
If your printer supports its, CUPS can do duplexing from the command line.
To do duplexing, the command is "lpr -o duplexingoption filename" where
duplexingoption is one of the following.
"sides=two-sided-short-edge" is the option suitable for landscape pages.
"sides=two-sided-long-edge" is the option is suitable for portrait pages.
CUPS default is to print on only one side of the paper, so while there is an option
for this ("sides=one-sided"), you don't need it.
If your printer doesn't support duplexing, but you want to fake it, CUPS again has options
Use the "-o page-set=set option" to select printing just the even or just the odd
The set value is either even, for even numbered pages, or odd, for odd numbered
The default is to print all pages. There is really is no option for this.
Advanced print commands - Range of Pages
The default is to print every page.
The "-o page-ranges=pages" option selects a range of pages for printing.
"pages" can be a hyphenated range such as 1-4, or a comma separated (no
spaces!) list of pages, such as 3,5,6 or both, such as 3,4-6,8.
The pages are always printed in ascending order, regardless of the order they are
Advanced print commands - Combining Options
Cups allow multiple options to be combined. Simply add another -o to the
Suppose you wanted to print pages 3-4, and 6 landscape from the file myletter to
the printer myprinter.
The command is "lpr -P myprinter -o landscape -o page-ranges=3-4,6 myletter".