You are here

A Simple Request To Print Feature

Support has been merged into the default branch for IPP [printing] operations. This functionality will be available in 0.1.49 provided the "pycups" modules is installed on the host(s).

The first part of IPP support is the addition of a workflow acction printToIPPAction. With the printToIPPAction a workflow message can be queued to a specified queue on an IPP server. An advantage of IPP over LPR [which OIE has supported for some time via the printToLPRAction] is that most IPP servers can deal intelligently with various content types. For exampe PDF, JPEG, and PNG content can usually be spooled as a print job without any client-side processing. The printToIPPAction supports setting the media size (default is "Letter") and specifying the fit-to-page feature supported by most IPP servers. In conjunction with capturing e-mail attachments or generating documents using RML the capability to spool messages to print queues allows the automation of processes which require hard-copy documents.

The second part of IPP support is the "/ippprint" HTTP protocol bundle. Using the "/ippprint" protocol HTTP clients can discover a list of available printers as well as request documents be queued to a specified print queue.

To retrieve a list of available printers a GET request for "/ippprint/.ls" is performed, this returns a JSON encoded dictionary of the print available print queues. Keys are queue names and the referenced dictionary is a standard IPP printer queue definition.

{ "dc": { "printer-is-shared": true,
          "printer-info": "dc",
          "printer-state-message": "Ready to print.",
          "printer-type": 8433756,
          "printer-make-and-model": "Brother MFC-9840CDW BR-Script3", 
          "printer-state-reasons": ["none"],
          "printer-uri-supported": "ipp://ipp.example.com:631/printers/dc",
          "printer-state": 3,
          "printer-location": "",
          "device-uri": "ipp://ip6B43FF.example.com"},
  "hp": { "printer-is-shared": true,
          "printer-info": "HP Laser Printer",
          ....

Text 1: Example JSON report of available printers.

Requesting a document id be printed to a specified queue is performed in a similar manner: "/ippprint/queue/objectid?mediasize=Letter&fittopage" where "queue" is the name of the print queue and "objectid" is the OpenGroupware object id of the document. Read access to a document is required in order for request the document be printed. Output size can be specified via the "mediasize" parameter and the "fitopage" option is also available. If a media size is not specified the default is "Letter" - note that, especially with PDFs, some documents may specify a media size internally which if not overridden can pause a printer if that media size is not physically available [this behavior is determined by the configuration of the IPP server and the printer itself - OpenGrouwpare Coils has no control over that aspect of printer operation].

The printer server used by OpenGroupware is set by the DefaultIPPServer server default; if not provided a value of "127.0.0.1" will be assumed - an IPP service on the same host.

coils-server-config --directive=DefaultIPPServer --value=ipp.example.com

Text 2: Change the server's configuration to use the IPP service provided by ipp.example.com. The specifed IPP server must be reachable by the OpenGrouwpare Coils node which is providing HTTP services; check your firewalls.

Unfortunately most IPP servers can only automatically process common [at least quasi-] Open file types such as PDF and PNG/JPEG images. For this reason the /ippprint protocol applies a filter, based on MIME type, for the types of documents it will allow to be queued. When a document is requested to be queued via /ippprint the type of that document will be compared to the list of MIME types found in the server's IPPPrintableMIMETypes default. If not configured the value of IPPPrintableMIMETypes is [ "application/pdf", "image/jpeg", "image/png" ]. This type list can be overwritten using coils-server-config to match the capabilities of your IPP service. Should an HTTP client request a document be queued whose MIME type is not specified in IPPPrintableMIMETypes a NotSupportedException will be raised (HTTP result code 501). A successful queue request will result in a text/plain HTTP 200 response containing the job name of the queued job [/ippprint will generate a job name and provide it to the IPP service].

With IPP queuing support simple HTTP clients are still oblivious to the document types that can be successfully queued for printing. Making a request and checking the result code is the only reliable way to 'discover' the print-ability of a document. In order to make this more intuitive for users, and easier for the generally very lazy web developer, a new "IPPPRINTABLE" flag is now included in the FLAGS attribute of the Omphalos representation of a document.

{'FLAGS': ['WRITE', 'OWNER', 'IPPPRINTABLE'],
 'creation': ,
 'creatorObjectId': 10000,
 'entityName': 'File',
 'fileSize': 90566,
 'fileType': 'pdf',
 'filename': 'BasicManagementOfEFIBootLoaders',
 'folderObjectId': 10160,
 'lastModified': ,
 'mimetype': 'application/pdf',
 'objectId': 289850,
 'ownerObjectId': 10000,
 'projectObjectId': 10140,
 'status': 'inserted',
 'title': 'BasicManagementOfEFIBootLoaders.pdf',
 'version': 1}

Text 3: Omphalos representation of a File [Document] having the "IPPPRINTABLE" flag due the MIME type of the file's contents.

By simply checking for this flag HTTP clients retrieving document lists via XML-RPC, JSON-RPC, or ".ls" requests to WebDAV can toggle on and off the availability of any request-to-print feature.

Request to print via HTTP can provide an easier path to producing hard-copy over downloading the document to the client, opening it [hopefully] in an appropriate application, and then printing it to a printer that must be configured on the client (and potentially selected by the user).

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer