An introduction to IPP Everywhere and driverless printing on Debian 9 (stretch) and later.
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
- PPDs and drivers have been holding us back from offering better user experience (ready media, localization, full range of printer options/values), improved document processing, and improved accounting
- PPDs and drivers are a security and distribution nightmare
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
DNS-SD and WS-Discovery.
A client must support
- DNS-SD and/or WS-Discovery.
Regarding document formats: the printer must support
PWG Raster Format and JPEG File Information Format (JFIF). These are MIME types image/pwg-raster and image/jpeg respectively.
PDF format (application/pdf), depending on the IPP version.
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
- A networked printer
A USB connected printer that provides the IPP-over-USB protocol
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:
ENVY4500 envy_classic RX420
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.
CUPS 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
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.