CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS® and other UNIX®-like operating systems.
- 1 Installation
- 2 Connection Interfaces
- 3 Printer Drivers
- 4 Printer URI
- 5 Usage
- 6 Configuration
- 7 Troubleshooting
- 8 See also
Install the package.
If you intend to "print" into a PDF document, also install the
/var/spool/cups-pdf/$USER. The location can be changed in
As of3.22, in order to print from GTK3 applications you will need to additionally install the package.
Additional steps for printer detection are listed below for various connection interfaces.
To see if your USB printer is detected:
(...) Bus 001 Device 007: ID 03f0:1004 Hewlett-Packard DeskJet 970c/970cse
To use a parallel port printer, the
parport_pc kernel modules are required.
$ dmesg | grep -i parport
parport0: Printer, Hewlett-Packard HP LaserJet 2100 Series lp0: using parport0 (polling)
If the system is connected to a networked printer using the Samba protocol, or if the system is to be a print server for Windows clients, install the package.
The drivers for a printer may come from any of the sources shown below. See CUPS/Printer-specific problems for an incomplete list of drivers that others have managed to get working.
The OpenPrinting Printer List provides driver recommendations for many printers. It also supplies PPD files for each printer, but most are available through foomatic or the recommended driver package.
When a PPD file is provided to CUPS, the CUPS server will regenerate the PPD files and save them in
CUPS provides a few PPDs and filter binaries by default, which should work out of the box.
To use foomatic, install, and at least one of , , or .
The foomatic PPDs may require additional filters, such as, , or another source (for instance AUR). For , may also be required.
Many printer manufacturers supply their own Linux drivers. These are often available in the official Arch repositories or in the AUR.
Some of those drivers are described in more detail in CUPS/Printer-specific problems.
Listed below are additional steps to manually generate the URI if required.
CUPS should be able to automatically generate a URI for USB printers, for example
If it doesn't, see CUPS/Troubleshooting#USB printers for troubleshooting steps.
The URI should be of the form
parallel:device. For instance, if the printer is connected on
If you are using a USB to parallel port adapter, use
parallel:/dev/usb/lp0 as the printer URI.
If you have set up Avahi as in #Network, CUPS should detect the printer URI. You can also use
avahi-discover to find the name of your printer and its address (for instance,
The URI can also be generated manually, without using Avahi. A list of the available URI schemes for networked printers is available in the CUPS documentation . As exact details of the URIs differ between printers, check either the manual of the printer or CUPS/Printer-specific problems.
Remote CUPS print servers can be accessed through a URI of the form
ipp://hostname:631/printers/queue_name. See CUPS/Printer sharing#Between GNU/Linux systems for details on setting up the remote print server.
See CUPS/Troubleshooting#Networking issues for additional issues and solutions.
- The queue name is a short but descriptive name used on the system to identify the queue. This name should not contain spaces or any special characters. For instance, a print queue corresponding to a HP LaserJet 5P could be named "hpljet5p". More than one queue can be associated with each physical printer.
- The location is a description of the printer's physical location (for instance "bedroom", or "kitchen"). This is to aid in maintaining several printers.
- The description is a full description of the print queue. A common use is a full printer name (like "HP LaserJet 5P").
See CUPS local documentation for more tips on the command-line tools.
- List the devices
# lpinfo -v # $ /usr/lib/cups/backend/snmp ip_address # Use SNMP to find a URI
- List the drivers
$ lpinfo -m
- Add a new queue
# lpadmin -p queue_name -E -v uri -m model
The queue_name is up to you. Example:
# lpadmin -p HP_DESKJET_940C -E -v "usb://HP/DESKJET%20940C?serial=CN16E6C364BH" -m drv:///HP/hp-deskjet_940c.ppd.gz # lpadmin -p SHARED_PRINTER -m raw # Raw queue; no PPD or filter
- Set the default printer
$ lpoptions -d queue_name
- Change the options
$ lpoptions -p queue_name -l # List the options $ lpoptions -p queue_name -o option=value # Set an option
$ lpoptions -p HP_DESKJET_940C -o PageSize=A4
- Check the status
$ lpstat -s $ lpstat -p queue_name
- Deactivate a printer
# cupsdisable queue_name
- Activate a printer
# cupsenable queue_name
- Set the printer to accept jobs
# cupsaccept queue_name
- Remove a printer
First set it to reject all incoming entries:
# cupsreject queue_name
Then disable it.
# cupsdisable queue_name
Finally remove it.
# lpadmin -x queue_name
- Print a file
$ lpr file $ lpr -# 17 file # print the file 17 times $ echo "Hello, world!" | lpr -p # print the result of a command. The -p switch adds a header.
- Check the queue
$ lpq $ lpq -a # on all queues
- Clear the queue
# lprm # remove last entry only # lprm - # remove all entries
The CUPS server can be fully administered through the web interface, available on http://localhost:631/.
- Add a queue
Go to the Administration page.
- Modify existing queues
Go to the Printers page, and select a queue to modify.
- Test a queue
Go to the Printers page, and select a queue.
If your user does not have sufficient privileges to administer CUPS, the applications will request the root password when they start. To give users administrative privileges without needing root access, see #Configuration.
- print-manager — A tool for managing print jobs and printers (KDE).
- system-config-printer — A CUPS printer configuration tool and status applet (GNOME and others)
- gtklp — GTK+ interface to CUPS.
The CUPS server configuration is located in
/etc/cups/cups-files.conf. After editing either file, restart
org.cups.cupsd.service to apply any changes. The default configuration is sufficient for most users.
Groups with printer administration privileges are defined in
SystemGroup in the
sys group is used by default.
is built with support and libpaper defaults to the Letter paper size. To avoid having to change the paper size for each print queue you add, edit
/etc/papersize and set your system default paper size. See .
By default, all logs are sent to files in
/var/log/cups/. By changing the values of the
PageLog directives in
syslog, CUPS can be made to log to the systemd journal instead. See the fedora wiki page for information on the original proposed change.
CUPS can use Avahi browsing to discover unknown shared printers in your network. This can be useful in large setups where the server is unknown. To use this feature, set up .local hostname resolution, and start both
cups-browsed.service. Note that jobs are sent directly to the printer without any processing so the created queues may not work.
See CUPS/Printer sharing.
Without a local CUPS server
CUPS can be configured to directly connect to remote printer servers instead of running a local print server. This requires installation of the package. Some applications will still require the package for printing.
To use a remote CUPS server, set the
CUPS_SERVER environment variable to
printerserver.mydomain:port. For instance, if you want to use a different print server for a single Firefox instance (substitute
printserver.mydomain:port with your print server name/port):
$ CUPS_SERVER=printserver.mydomain:port firefox