Translation(s): none

An introduction to IPP Everywhere and driverless printing on Debian 9 (stretch) and later.

The Problem

To print to a networked or USB connected legacy printer a discovery protocol is first required to find the printer. Later on, a print protocol and PDL to send the job to the printer has to be chosen. Every printer manufacturer has gone about implementing these procedures in its own way; sometimes by using or adapting standard protocols, sometimes by devising its own protocols, sometimes by using its own proprietary PDL.

The result is many thousands of driver files in use across Linux, Mac OS X and Windows operating systems and a variety of techniques for printer discovery and processing a print job. A user's experience of setting up a printer and using it can be fraught and having the system in good shape dependent on possibly keeping up-to-date with a vendor's changes to software. Setting up a printer can be seen (justifiably or not) as convoluted, complex, opaque and difficult to debug. Being offered three or more drivers to choose from for each supported printer may be rather confusing. Contrast the printer situation with the behaviour of other peripherals like keyboards, mice, cameras and USB mass storage, where the adherence to a standard usually ensures a good experience.

Further Analysis of the Problem

If the previous section doesn't align with your experience think now of a world in which mobile devices (laptops, tablets, phones) abound. Setting up a queue for printing has been described but when a mobile device moves from network to network there could be a need to re-configure the device in order to print. This isn't what might be called user-friendly and is very likely beyond what most users would want to do or be capable of doing.

Even if setting up a queue time and time again was tolerable you have to consider the limitations of the mobile device. Limited storage capacity alone implies that holding the enormous number of PPDs and drivers for every possible printer it is likely to encounter could be a problem. The printing experience would become a nightmare. The elimination of the burden of proprietary (or even free) solutions exclusive to a particular printer benefits all operating systems.

In a Debian context, upstream CUPS has voiced the opinion that

The Solution

For a number of years the Printer Working Group (PWG) has been working with printer vendors and networking experts to implement IPP Everywhere. The standard for printers is now completed and IPP Everywhere devices are beginning to be marketed.

The idea of IPP Everywhere is to dispense with vendor-specific software on the client (a computer or mobile device) and have driverless printing supported printers. For discovery, the printer must support

A client must support

Regarding document formats: the printer must support

The crucial protocol used for communication between printer and client is IPP. It is the native protocol of CUPS and Debian has the newest version. It has the important ability of being able to query the printer for its capabilities and pass these to the client for display in its applications.

Debian supports printing via IPP using IPP Everywhere with

The printing system's New Architecture is strongly grounded in the principles expressed by the IPP Everywhere standard.

Debian CUPS as an IPP Everywhere Server

Consider a legacy printer shared by a CUPS server. Suppose a PDL suitable for the printer is PostScript or a vendor format. The initial filter must be capable of producing a PDF file to present to the page management filter, pdftopdf. This is done with imagetopdf or rastertopdf and is followed by filters that deliver PostScript or the vendor format to the legacy printer. The CUPS server basically emulates an IPP Everywhere printer and any of the three supported document formats will be processed through the filter chain:

  Input file    Initial filter               Further filters
+------------+  +-------------+            +-------------------+  +-------+
| PDF        |  |    n/a      |            |Convert PDF to     |  |Legacy |
| JPEG       |->| imagetopdf  |->pdftopdf->|something the      |->|printer|
| PWG raster |  | rastertopdf |            |printer understands|  |       |              
+------------+  +-------------+            +-------------------+  +-------+

When the legacy printer is replaced by a modern Everywhere printer, PDF, JPEG and PWG raster file are sent directly to the printer without any filtering.

  Input file         CUPS server
+------------+      +-----------+      +------------+
| PDF        |      |    No     |      |   IPP      |
| JPEG       | ---> | Filtering | ---> | Everywhere |
| PWG raster |      |           |      |  printer   |
+------------+      +-----------+      +------------+

Debian CUPS as an IPP Everywhere Client

In co-operation with avahi-daemon the CUPS daemon on a Debian 10 (or later) client will discover an IPP Everywhere printer with

lpstat -e
lpstat -l -e

For example, this might be seen with the first command:


and detailed information for the printers will be obtained from

avahi-browse -rt _ipp._tcp

A command such as

lp -d RX420 FILE

leads to the formation of a temporary queue that indicates which MIME types are acceptable to the printer. The CUPS client can easily produce PDF and PWG raster to send directly to printer. A JPEG submitted from the client will be sent directly to the printer without any filtering.

client output
+------------+      +------------+
| PDF        |      |   IPP      |
| JPEG       | ---> | Everywhere |
| PWG raster |      |  printer   |
+------------+      +------------+

Experiencing IPP Everywhere Behaviour

It is convenient to use two machines for this. Otherwise a single machine running a virtual machine is necessary. First download and install the cups-ipp-utils package:

apt-get install cups-ipp-utils

and read the manual for ippserver.

On the same machine stop cups

systemctl stop cups

and run ippserver with

ippserver -vvv -p 631 -m everywhere test

On the other machine check for a local print queue being set up with

lpstat -a

and a PPD existing in /etc/cups/ppd.

Print to the queue:

lp -d everywhere <file>

and look at the error_log for a record of the filter chain.

See also