Some background to AirPrint. Using it with CUPS.
What is AirPrint and How Does it Work?
AirPrint was devised by Apple Inc to enable an iPhone, an iPad, an iPod Touch or a Mac (referred to as iOS clients or clients later on) to print without having to install drivers on the client device. More and more new printers come with firmware to support AirPrint. There are two technologies central to the AirPrint facility on a printer:
The printer must be advertised with Bonjour broadcasting.
The printer must communicate with the client using IPP
The broadcast mDNS packets contain information about the capabilities of the printer, its identity and its location on the network. They also utilise some extensions (not necessarily fully explained in existing literature) to the existing Bonjour specification to allow iOS clients to search specifically for AirPrint capable printers and display them in a print dialogue.
IPP (version 2.0) is needed for print management. The client uses IPP to send the print job with information about what printer language it is in, whether it is to be duplexed, the number of copies, the resolution to be used for printing. the media output location on the printer etc.
Browsing an AirPrint Bonjour Broadcast
avahi-browse -art > discovered
gets all broadcast print queues (and more) on a subnet. This is the reformatted output for an AirPrint enabled HP ENVY 4502:
= eth0 IPv4 HP ENVY 4500 series Internet Printer local hostname = [envy4500.local] address = [192.168.7.235] port =  txt = ["Scan=T" "Duplex=T" "Color=T" "UUID=1c852a4d-b800-1f08-abcd-308d99fafac2" "Fax=F" "note=" "adminurl=http://envy4500.local./#hId-pgAirPrint" "mac=30:8d:99:fa:fa:c2" "priority=20" "usb_MDL=ENVY 4500 series" "usb_MFG=HP" "product=(HP ENVY 4500 series)" "ty=ENVY 4500 series" "URF=CP1,MT1-2-8-9-10-11,OB9,OFU0,PQ3-4-5,RS300-600,SRGB24,W8-16,DEVW8-16,DEVRGB24-48,ADOBERGB24-48,DM3,IS1,V1.3" "kind=document,envelope,photo" "PaperMax=<legal-A4" "rp=ipp/print" "pdl=application/vnd.hp-PCL,image/jpeg,application/PCLm,image/urf" "qtotal=1" "txtvers=1"]
The URF key is one of extensions to the Bonjour Printing Specification mentioned previously. (It can be deduced from US 20110194124 that CP is MAX COPIES, MT is MEDIA TYPES, OB is OUTPUT BINS, OF is FINISHINGS, PQ is PRINT QUALITIES, RS is RESOLUTIONS, SRGB is COLOR SPACES, W is BIT DEPTHS, DM is DUPLEX SUPPORT and IS is INPUT SLOTS).
The pdl (Page Description Language) key is important. It lists the only MIME types the printer will accept for printing. With or without AirPrint enabled the Envy 4502 will not process a PostScript or PDF document sent to it. AirPrint adds nothing to this printer's capability to deal with document types its firmware is not built to cope with.
Note the last entry in the pdl key. image/urf is a fallback MIME type for the client to send to guarantee printing takes place and it is obligatory for it to be accepted by a printer claiming AirPrint compatibility. image/urf is raster data; there are no officially published details about it but it has been reverse engineered.
Actually an iOS client supports sending three MIME types: application/pdf, image/jpeg and image/urf. It also knows what data types the Envy 4502 will accept. Therefore, a JPEG photo would be sent to the printer as image/jpeg and anything else would go as the fallback image/urf.
If the pdl key for the printer had been
a PDF would be sent unaltered and everything else as image/urf. The fallback image/urf isn't needed for the PDF because application/pdf is the first supported MIME type found in the key and the client knows the printer to be capable of printing it.
Printing from an iPhone, an iPad, an iPod Touch or a Mac to an AirPrint enabled printer should just work.
Upstream CUPS and AirPrint
It didn't take long after the introduction of AirPrint for people with iOS clients to want to print to their non-AirPrint printers by having CUPS advertise queues which a client would be happy to deal with. However, upstream's position on including AirPrint support in mainline CUPS is expressed in STR #4341 and STR #4357:
Sorry, but we do not support AirPrint for shared printers served by CUPS. CUPS does not support iOS. The two are not compatible,
This view is expanded on with
CUPS does not support everything that AirPrint needs, and many drivers do strange things (particularly on OS X) when you don't go through the local print dialog. Generally speaking you can get away with it for common office printers using US Letter and A4 paper, but that's about it.
Printing of emails and web pages to Letter/A4 media generally works, but as soon as you go beyond that things fall apart pretty quickly. Here is a short list of what does not work when using CUPS as an AirPrint server: - Ready media (that's how you get to pick media sizes on iOS) - Many printer status keywords ("out of paper", etc.) - Proper media selection and scaling when printing photos - Proper media selection, rotation, and scaling when printing PDFs - Duplex printing with some drivers - Color/grayscale mode - Copies (yes, really!) Some of these deficiencies would require major changes to CUPS and its driver architecture to fix, others require driver and (in some cases) printer firmware updates to correct.
Debian CUPS and AirPrint
There are many users who wish to print from an iOS client to an incompatible printer. With the idea of emulating an AirPrint printer the necessary conditions for success are:
- The printer must be used with a print queue which is advertised using Bonjour broadcasting.
- Communication between print queue and iOS client must be via IPP.
The first condition is met by setting up a print queue for the printer in the usual way. Bonjour broadcasting is automatically done when avahi-daemon is installed. Fulfilling the second condition requires avahi-daemon to broadcast a DNS-SD service type of _ipp._tcp or _ipps._tcp.
In principle there is no great problem in meeting the advertising and communication conditions. The problem arises in deciding what to put in a TXT Record to ensure a client recognises the broadcasts as coming from an AirPrint print queue and successfully prints to it.
In a process which to some extent involved trial and error the Debian printing system has been patched and enhanced as follows:
- Generate a TXT Record for a print queue with a URF key containing DM3.
- Add image/urf to a pdl key.
- Produce a Bonjour record automatically without the need of a .service file in /etc/avahi/services.
- Have CUPS recognise and convert a file of MIME type image/urf.
- Introduce a filter into cups-filters to convert image/urf to PDF (urftopdf).
The urftopdf filter is provided because it is has become unclear whether all applications on present day iOS clients do indeed send application/pdf when the print queue supports it.
Printing from an iPhone, an iPad, an iPod Touch or a Mac to any correctly set up Debian print queue should just work.
The way iOS clients handle AirPrint printing is determined by Apple and is likely to evolve over time. Future changes to iOS might impact on the ability of avahi-daemon and CUPS to service printing requests from a client. It has happened in the past.
Till Kamppeter <email@example.com> for implementing AirPrint support in Debian and Ubuntu and Didier 'OdyX' Raboud <firstname.lastname@example.org> for supporting and overseeing its inclusion into Debian.