OpenPrinting News - September 2020

13 minute read

OpenPrinting Microconference on Linux Plumbers Conference 2020

We successfully did our second OpenPrinting microconference!

There is a complete recording on YouTube (same links as for the live broadcast during the conference). But note that this one is created automatically by the video conference system, and edited version will get posted later.

We talked about the following topics (links to the slides in PDF format):

The video conferencing system and the live broadcast worked very well, having around 40 listeners in our virtual room and up to 17 listeners on YouTube. Thanks again to the great work of the organizers!

But I hope we will be able to meet in person again in 2021.

Google Summer of Code 2020

Coding ended and the final evaluations are completed, the completed projects officially announced by Google.

For the Linux Foundation we got 15 student slots in the beginning and after 1 student dropping out after the first month we had 14 students reaching the final evaluations. 1 of them failed and the other 13 passed.

For OpenPrinting there started with 7 students, 1 being the one who quit after one month and 1 failed in the final evaluations, having 5 who completed the program successfully.

Here are the projects with their submitted work product links:

1. Extract raster data from PDFs for direct printing

Student: Vikrant Malik
Mentors: Sahil Arora, Till Kamppeter
Work Product

PASSED

2. General Printer Application SDK

Student: Jai Luthra
Mentors: Michael Sweet, Till Kamppeter
Work Product

PASSED

Jai has principally worked on PAPPL but also done an HP PCL sample Printer Application. In gthe end he has also worked on converting filters of cups-filters into filter functions.

3. Linux GUI application to admin MF devices using IPP System Service

Student: Lakshay Bandlish
Mentor: Michael Sweet
Work Product

PASSED

4. Make Printer Applications Configurable

Student: Sambhav Dusad
Mentor: Michael Sweet
Work Product

PASSED

Sambhav has also started to create a Gutenprint Printer Application.

5. Speed/Scaling Optimisation of cups-browsed

Student: Mohit Mohan
Mentors: Deepak Patankar, Till Kamppeter
Work Product

PASSED

6. Common Print Dialog Backends (CPDB) Qt Implementation

Student: Priydarshi Singh
Mentor: Dongxu Li
Work Product

FAILED (final evaluation)

We are looking into finishing up CPDB after GSoC.

7. IPP Scan (or virtual MF device) server (Scanner Application)

Student: Aakash Lahoti
Mentors: Michael Sweet, Alexander Pevzner

WITHDRAWN (shortly after first evaluation)

We have replaced this project by a 2-student LFMP project (see below).

Google Season of Docs 2020

Our OpenPrinting project

Tutorial and Design Guidelines for Printer/Scanner drivers in Printer Applications

got accepted!

Piyush Goyal will write for us in the next three months (September 14 - December 5).

In total we got 5 projects accepted for the Linux Foundation.

Linux Foundation Mentorship Program

In our first LFMP project Dipanshu Verma, working on retro-fitting proprietary classic printer drivers into Printer Applications had to withdraw, as his college suddenly re-established the classes after the pandemic interruption. In the first months he has done several tests of installing closed-source drivers into a chroot, see his work on GitHub.

Nidhi Jain has successfully expanded the driverless tool of cups-filters (which allowed setting up driverless printers with classic printer setup tools) to also work for IPP Fax Out queues, allowing to use the Fax send facility of most modern multi-function printers easily, as devices supporting AirPrint usually support also IPP Fax Out. The functionality is fully working in cups-filters from version 1.28.2 on and will also be included in Ubuntu 20.10 (Groovy Gorilla).

In the printer setup tool you find your printer under the discovered network printers (also if it is connected via USB, as IPP-over-USB is used then). Select this entry and when it comes to select the driver, select the entry with “Fax, driverless”. If you want to fax print the document to this queue and in the print dialog (GTK/GNOME or LibreOffice) select “Custom” in the “Phone Number” option and enter the destination fax number. Parameters like sender info on the fax, default prefixes, repetition of failure, … you configure with the devices web admin interface.

Nidhi was supposed to add fax support to the Common Print Dialog Backends (CPDB) now, but as development did not make it far enough to do so and due to the withdrawal of Dipanshu we have asked her to carry on on retro-fitting classic printer drivers into Printer Applications. Update: Nidhi agreed and will now work on retro-fitting classic printer drivers.

As a replacement for our incomplete GSoC project on IPP Scan we are running our second LFMP project. Here we have selected our students now and they have started working in the beginning of this month:

Expand PAPPL for scan support, Scanner Applications (IPP Scan as a server)
Student: Abhik Chakraborty

Expand sane-airscan to support IPP Scan (IPP Scan as a client)
Student: Rishabh Arya

Abhik will get primarily mentored by Michael Sweet and Rishabh by Alexander Pevzner.

CUPS Snap

The CUPS Snap project is currently waiting for the snapd project to add the needed API extensions.

The Pull Request for the implementation of the new “cups” and “cups-control” interfaces got merged into snapd.

The pull request for adding the API functionality so that a Snap can check whether a client Snap plugs the needed interfaces is still in the works.

Printer Applications

On the Printer Apllications side Sambhav Dusad, GSoC 2020 student, has started to work on creating a Gutenprint Printer Application. As Gutenprint provides all printer capability through its library (PPD files are auto-generated) this will be the first larger-scope native Printer Application.

We also have already the following filter functions in cups-filters: pstops, pdftops, pdftopdf, ghostscript (replaces gstoraster, gstopdf, gstopxl), pclmtoraster, rastertopdf (replaces rastertopdf amd rastertopcl), rastertops, and filterChain

Special thanks go to Vikrant Malik and Jai Luthra for thei work on the filter functions.

On the printing-architecture mailing list at OpenPrinting we had a discussion about whether CUPS is still needed with Printer Applications and IPP devices in place:

Note that for participating in these discussions you have to subscribe to the printing-architecture mailing list.

Driverless Scanning and IPP-over-USB

The Main Inclusion Requests (MIR) to get ipp-usb and sane-airscan into Ubuntu Main have passed the general checks of the Ubuntu MIR team and are waiting for the reviews of the Ubuntu security team.

Alexander Pevzner is continuing to take user eports and make the packages working with as many devices as possible.

IPP Scan support is currently added to sane-airscan as a LFMP project.

CUPS

Currently released is 2.3.3.

Due to dormant upstream development we have discussed to create a (temporary) fork on OpenPrinting for bug fixes and distribution patches and Michael Sweet has done it now.

cups-filters

Currently released is 1.28.2.

On the way towards 2.0.0 we have converted many filters to filter functions, having now pstops, pdftops, pdftopdf, ghostscript (replaces gstoraster, gstopdf, gstopxl), pclmtoraster, rastertopdf (replaces rastertopdf amd rastertopcl), rastertops, and filterChain

filterChain() is a special filter function which takes an array of filter functions as parameter and passes the input data to all these filter functions subsequently, allowing for conversions for which there is no single filter function available.

Special thanks go to Vikrant Malik and Jai Luthra for thei work on the filter functions.

To allow further releases of cups-filters during the transition from 1.x to 2.x I have created a 1.x branch into which I cherry-pick all the bug fixes and some smaller feature additions. This branch is especially the source for the current cups-filters packages in Debian and Ubuntu.

Here I have especially added the driverless fax support and the IPP/IPPS support in the driverless utility, from Nidhi Jain’s LFMP project (see above). Also many bug fixes, especially crashes and memory leaks of cups-browsed, are included here.

1.28.2:

Bug fix release to mainly fix cups-browsed not shutting down and the driverless utility being slow when listing available printers/faxes

1.28.1:

Bug fix release to fix several bugs in the new IPP Fax Out support by the “driverless” utility and also to fix some minor issues

1.28.0:

Feature release (probably the last one before 2.0.0) which adds IPP Fax Out support, IPPS support, and a command line option to reveal satndard IPP URIs to the “driverless” utility, added log file size limitation and command line options to control what happens to generated queues on shutdown to cups-browsed, fixed several bugs when printing PostScript input files, several bugs and memory leaks in cups-browsed, crashes on the presence of certain fonts, and many more fixes.

CHANGES IN V2.0.0

	- libcupsfilters, gstoraster, gstopdf, gstopxl: Moved core
	  functionality of gstoraster into the ghostscript() filter
	  function.
	- braille: Support new liblouis tables not containing a
          display name (Pull request #303)
	- libcupsfilters: Added filterChain() filter function to run
	  several filter functions in a chain.
	- libcupsfilters, pdftopdf: Moved core functionality of
	  pdftopdf into the pdftopdf() filter function (Pull request
	  #301).
	- Build system: Let ./configure not error out when there is
	  more than one DejaVuSans.ttf test font candidate (Issue
	  #300).
	- cups-browsed: Crash when a remote printer set as default
	  gets removed, due to missing variable in printf() call
	  (Issue #299).
	- COPYING: Fixed several typos
	- libcupsfilters: Fixed typo in log message of
	  get_printer_attributes functions.
	- cups-browsed: Fixed typos in configuration file and man page
	- libcupsfilters: Let the PPD generator not suffix page size
	  names with ".Borderless" if all page sizes would get this
	  suffix, for example for printers which generally print
	  borderless.
	- driverless, driverless-fax, libcupsfilters: Added IPP Fax
	  Out support. Now printer setup tools list an additional fax
	  "driver".  A fax queue is created by selecting this
	  driver. Jobs have to be sent with "-o phone=12345" to supply
	  the destination phone number (Pull request #280, #293,
	  #296, #302, #304, #305, #306, Issue #298).
	- libfontembed: Silenced warning with gcc 10.x (Pull request
	  #287).
	- libcupsfilters, rastertopdf, rastertopclm: Moved core
	  functionality of rastertopdf into the rastertopdf() filter
	  function (Pull request #288, #289).
	- cups-browsed: Added ./configure options
	  --enable-saving-created-queues and
	  --with-remote-cups-local-queue-naming (Pull request: #253,
	  #285).
	- libcupsfilters, pclmtoraster: Moved core functionality of
	  pclmtoraster into the pclmtoraster() filter function (Pull
	  request #275).
	- libcupsfilters, rastertops: Moved core functionality of
	  rastertops into the rastertops() filter function (Pull
	  request #282, #290).
	- cups-browsed: Fixed several memory leaks, mainly from the
	  code to merge printer IPP attributes for clusters (Pull
	  request #281, #283).
	- libcupsfilters: Started adding functions to read out IPP
	  attributes from the job and check them against the IPP
	  attributes (capabilities) of the printer:
	  ippAttrEnumValForPrinter(), ippAttrIntValForPrinter()
CHANGES IN V1.28.2

	- driverless: Free allocated memory, use MAX_OUTPUT_LEN (Pull
	  request #304).
	- driverless: driverless: Make the two ippfind tasks(for IPP
	  and IPPS) run in parallel (Pull request #302, #305, #306).
	- braille: Support new liblouis tables not containing a
	  display name (Pull request #303)
	- Build system: Let ./configure not error out when there is
	  more than one DejaVuSans.ttf test font candidate (Issue
	  #300).
	- cups-browsed: Crash when a remote printer set as default
	  gets removed, due to missing variable in printf() call
	  (Issue #299).
	- libcupsfilters: Removed all signal handling and global
	  variables from get_printer_attributes() and
	  ippfind_based_uri_converter().  This is overkill for these
	  quick operations and causes problems when shutting down
	  cups-browsed (Issue #298).

CHANGES IN V1.28.1

	- COPYING: Fixed several typos
	- libcupsfilters: Fixed typo in log message of
	  get_printer_attributes functions.
	- cups-browsed: Fixed typos in configuration file and man page
	- libcupsfilters: Let the PPD generator not suffix page size
	  names with ".Borderless" if all page sizes would get this
	  suffix, for example for printers which generally print
	  borderless.
	- libcupsfilters: Added "faxPrefix" option for generated IPP
	  Fax Out PPDs, so that this option also appears in print
	  dialogs.
	- driverless: List addresses for local services correctly when
	  using "--std-ipp-uris" (with "localhost" hostname).
	- driverless: Make calls of the ippfind utility somewhat faster,
	  setting the timeout of ippfind to automatic.
	- libcupsfilters: Resolve DNS-SD-based URIs for local services
	  correctly (using hostname "localhost").
	- libcupsfilters: In get_printer_attributes() functions do not
	  try to convert URIs which are not DNS-SD-based (Issue #294).
	- libcupsfilters: In get_printer_attributes() functions also
	  support URIs with "dnssd://..." scheme.
	- libcupsfilters: Moved signal handling back into main
	  function of the get_printer_attributes() variants, it got
	  moved out accidentally.
	- driverless: For generating a PPD, independent whether via
	  "driverless URI" or "driverless cat URI", always allow CUPS
	  driver URIs (prefixed with "driverless: " or
	  "driverless-fax:") and pure IPP URIs.
	- driverless: Accept clean IPP URIs also for 'driverless cat
	  ...' (Issue #295, Pull request #296).
	- driverless-fax: Do not use fixed path for call of driverless
	  itself (Pull request #293).

CHANGES IN V1.28.0

	- driverless, driverless-fax, libcupsfilters: Added IPP Fax
	  Out support. Now printer setup tools list an additional fax
	  "driver".  A fax queue is created by selecting this
	  driver. Jobs have to be sent with "-o phone=12345" to supply
	  the destination phone number (Pull request #280).
	- libfontembed: Silenced warning with gcc 10.x (Pull request
	  #287).
	- cups-browsed: Added ./configure options
	  --enable-saving-created-queues and
	  --with-remote-cups-local-queue-naming (Pull request: #253,
	  #285).
	- cups-browsed: Fixed several memory leaks, mainly from the
	  code to merge printer IPP attributes for clusters (Pull
	  request #281, #283).
	- driverless: Added "--std-ipp-uris" command line option to
	  show listed URIs in standard hostname-based form (not the
	  CUPS DNS-SD-service-name-based form. Only for manual call of
	  the utility, for debugging purposes (Pull request #277).
	- libfontembed: Removed assert() calls which cause crashes
	  when unsupported emoji fonts are installed (Issue #254, Pull
	  request #276).
	- driverless: Added support for IPPS (use "ipps://..." URIs if
	  possible, Issue #251, Pull request #270, #273).
	- gstoraster, gstopdf: When converting PostScript to PDF use
	  the "pdfwrite" output device with "-dPDFSETTINGS=/default"
	  instead of with "-dPDFSETTINGS=/printer". This reproduces
	  bitmaps in the PostScript file with their original image
	  quality (Issue #272).
	- cups-browsed: Limit log file size and add backup file for
	  previous log entries. Introduced the configuration option
	  DebugLogFileSize in cups-browsed.conf to set the actual
	  limit in kilobytes or 0 to get the old behavior of an
	  unlimited size for the log file (Issue #260, Pull request
	  #267).
	- gstoraster, gstopdf: Do not apply margins when output format
	  is PDF, as then we convert an incoming PostScript file to
	  PDF (pre-pdftopdf) and do not prepare the pages for the
	  printer (post-pdftopdf, Issue #250).
	- cups-browsed: Do not write any log messages directly to
	  stderr, there were some concerning timeouts on queue
	  creation (Issue #260).
	- Build system: Fix cross-compilation without DejaVu test font
	  in configure.ac (Issue #262, Pull request #263).
	- libcupsfilters: Respect the fact that PPD keywords
	  are case-sensitive when adding "*cupsManualCopies: True" in
	  PPD file (Issue #242).
	- libcupsfilters: Older versions of libcups (< 2.3.1)
	  had the enum name for fold-accordion finishings mistyped.
	  Added a workaround.
	- cups-browsed: Remove left-over local queues from the
	  previous session more quickly when CUPS legacy browsing is
	  turned on.
	- cups-browsed: Left-over local queues from the previous
	  session for which the corresponding remote printer did not
	  appear again did not get removed as they were considered
	  externally overwritten.
	- gstoraster, gstopdf: Add option "-dDoNumCopies" to
	  Ghostscript command line if we are outputting PDF (called
	  via gstopdf wrapper) and the number of copies supplied to
	  CUPS is 1 (4th command line argument). In this case we
	  convert incoming PostScript to PDF and need to respect
	  embedded PostScript commands to implement the number of
	  copies (Issue #255, CUPS Issue #5796, OpenSUSE bug
	  #1173345).
	- imagetoraster: Potential null dereference fix (when no valid
	  PPD is supplied, Pull request #256).
	- cups-browsed: Call cupsGetNamedDest() only if
	  "OnlyUnsupportedByCUPS No"
	- Sample PPDs: Corrected ColorModel default for Generic PWG
	  Raster PPD to Color (Pull request #247).
	- cups-browsed: Mark the temp queue as cups-browsed-generated
          during setting printer-is-shared (Pull request #246).
	- cups-browsed: Remove mentions of README and AUTHORS files in
          the man page (Pull request #244).
	- pclmtoraster: Added new filter to extract Raster data from
	  raster-only PDF files, here for the special case of PCLm
	  files (Pull request #243, #257).
	- Sample PPDs: In Generic-PDF_Printer-PDF.ppd add option to
	  switch between color and grayscale printing (Pull request
	  #237).

Updated:

Comments