AirPrint is a cool technology, but what if you have printers that aren’t officially supported? Here’s how to make it work. Note that this was done on FreeBSD 10.1. This may work on other operating systems, but package installation and filesystem paths will be different.
Install cups via ports, I selected both Python and Perl bindings, and Avahi for advertisement (since we’ll be using Avahi to advertise the services anyway):
portmaster -dbH print/cups print/hplip
After going through the various package configurations, grab a cup of coffee because there are many dependencies to install.
Enable cups:
sysrc cupsd_enable=YES
Set up cupsd.conf. Note that this isn’t the most secure configuration, if this system is on the internet, please make adjustments accordingly.
SystemGroup sys root # Allow remote access Port 631 Listen /var/run/cups/cups.sock Browsing On BrowseLocalProtocols dnssd DefaultAuthType Basic WebInterface Yes FileDevice Yes ServerAlias * DefaultShared yes DefaultEncryption Never # Allow remote access... Order allow,deny Allow all AuthType Basic Require user @SYSTEM
Start cups:
service cupsd start
Head over to http://[IP]:631 and set up your printer. This varies by printer, so I’ll leave this up to you. Make sure to print a test page to ensure that cups itself is working.
Next, let’s add the needed AirPrint MIME types:
echo "image/urf urf string(0,UNIRAST<00>)" > /usr/local/share/cups/mime/airprint.types echo "image/urf application/vnd.cups-postscript 66 pdftops" > /usr/local/share/cups/mime/airprint.convs
All that’s left to do now is add the actual services to Avahi. We’re going to run a Python script that does this, but first, I had to add the cups package to Python manually. You may not need to do this:
CPATH=/usr/local/include pip install pycups
Download airprint-generate.py:
fetch https://raw.githubusercontent.com/tjfontaine/airprint-generate/master/airprint-generate.py
I modified airprint-generate.py based on a forum post, I am not sure if this is needed, but it doesn’t appear to hurt: In the section setting ‘DOCUMENT_TYPES’, add a new line just under “‘application/postscript’: True,” that says “‘application/vnd.cups-postscript’: True”.
Next, run it:
python airprint-generate.py
This will create a .service file in the current directory for each of the printers you have set up in CUPS. Put these service files into the Avahi service directory:
mv *.service /usr/local/etc/avahi/services
Finally, restart avahi-daemon:
service avahi-daemon restart
At this point, you should be able to AirPrint from your iOS devices.