This Emacs package provides a partial implemention of the client component of
the Internet Printing Protocol (IPP). IPP was intended to replace the LPD
protocol for interacting with network printers. It specifies mechanisms for
“driverless printing” (submitting and cancelling jobs), queue monitoring and
querying printer capabilities. More recent versions of the standard are
called “IPP Everywhere”.
You can find out whether a device is IPP-capable by trying to telnet to port 631. If it
accepts the connection it probably understands IPP. You then need to discover the path
component of the URI, for example by reading the documentation, by looking through the
menus via the front panel or its HTTP interface, or by analyzing DNS Service Discovery
(Bonjour) network traffic. Tested or reported to work on the following devices:
* Tektronix Phaser 750, with an URI of the form ipp://host:631/
(empty path component)
* TOSHIBA e-STUDIO3005A, with an URI of the form ipp://host:631/ (empty path
component).
* HP Laserjet 4000, with a path component of /ipp/port1.
* HP Color LaserJet MFP M477fdw
* Lexmark E460dn, with an empty path component
* Lexmark MS312dn with a path component of "/ipp/print" (IPP URL of the form
"ipp://10.0.0.1:631/ipp/print" or "ipps://10.0.0.1:443/ipp/print")
* Brother DCP-1610W, with an empty path component
* Xerox Document Centre 460 ST, with empty path component.
* Epson AL-MX300 and AL-M310DN with a path component of "/Epson_IPP_Printer" (so an
IPP URI of the form "ipp://10.0.0.1/Epson_IPP_Printer" or
"ipps://10.0.0.1:443/Epson_IPP_Printer")
* CUPS printer spooler (see ).
Usage: load this package by putting in your ~/.emacs.el
(require 'ipp)
then try printing a file using 'M-x ipp-print'. This will prompt you for a
file name (which should be in a format understood by the printer, such as
PDF), and the URI of the printer. The URI should be of the form
ipp://10.0.0.1:631/ipp/port1 (unencrypted connection on port 631, path="/ipp/port1")
ipps://10.0.0.1/ (TLS connection on port 631, empty path component)
There are also two functions for querying the capability of the device
`ipp-get-attributes' and examining its queue `ipp-get-jobs'. Until I write
display code for these functions you will have to call them from an IELM
buffer to examine their return value.
ELISP> (ipp-get-attributes "ipps://127.0.0.1:631/")
The IPP network protocol is based on HTTP/1.1 POST requests (or potentially
using HTTP/2 in the most recent versions, though we do not support this),
using a special "application/ipp" MIME Content-Type. The data is encoded
using simple marshalling rules.
The Internet Printing Protocol is described in a number of RFCs:
and the Printer Working Group maintain a page at
See also .
Eventually it would be nice to modify the Emacs printing API to
support this type of direct printing, so that a user could set
`ps-printer-name' to "ipp://modern-printer:631/" or
"lpd://ancient-printer/queue" (it would be easy to write a package
similar to this one implementing the LPD protocol at the network
level; the LDP protocol is very simple).
Thanks to Vinicius Jose Latorre and Marc Grégoire for patches and to Colin
Marquardt and Andrew Cosgriff for help in debugging.