Printing like it's 1995

By Connor Taffe | Published .

I found both of my printers second-hand at Goodwill. At twenty and nearly thirty years old, it's amazing they still operate and through open source software that we can print to them from modern hardware. They are:

With some searching on eBay I was able to equip each with JetDirect network cards, and added a duplexer to the LaserJet. Network cards are not required, you can instead install CUPS on a machine with a serial, parallel, or USB connection to your printer. I choose to network them because it simplifies hosting a print server on a VM and allows me flexibility in where they're located.

The HP DesignJet 650C was almost in working order when I found it at Goodwill. After soaking the ink cartridges in hot water and wiping their ports with alcohol, removing the part of the roller that introduces friction so that it could roll freely, and oiling the print head rail, it was able to produce beautiful 36" wide inkjet prints. Below is a close-up of a print of the Highway Map of Arkansas which I was able to print scaled up while maintaining its resolution. You can see the 300x300 color DPI and the 600x600 DPI blacks:

Close up of Highway Map of Arkansas print
Close up of Highway Map of Arkansas print

Maps are ideal for this printer, which was expected to be used mostly for drafting prints. The paper roll that it had when I found it is very thin paper that won't hold lots of ink well. I was also able to find some appropriate new old stock ink cartridges at the Goodwill Computer Store which I have in case I run out of ink.

Below is an ad for the HP DesignJet 650C which appeared in the July 1995 issue of InfoWorld magazie, with a price tag of $8,595 for the 24" plotter and the add-on PostScript support ROM.

An ad for the HP DesignJet 650C
An ad for the HP DesignJet 650C

Although some still utilize this printer via modern Windows, it was designed to work with Windows NT. The MIO network card even has a web interface that utilizes Java Applets, which only works on Netscape 4.0.3 (not 4.0.4), or IE 4. I was able to spin up a Windows NT VM on VMWare and install Netscape to see it in action:

The HP DesignJet 650C Web UI
The HP DesignJet 650C Web UI

Note the antiquated supported protocols including EtherTalk, a version of AppleTalk using Ethernet as the physical layer instead of LocalTalk. AppleTalk's auto-configuration features were the basis for Bonjour aka mDNS/DNS-SD.

Installing Windows NT in VMWare was a bit challenging, I used Windows NT 4.0 Enterprise Server and was able to get mouse and better video support using VMWare tools for Windows on x86 version 3.5.

Drivers

In AirPrint with CUPS, I discuss setting up CUPS and Avahi to support driverless printing from devices like an iPhone, there I use the GhostScript driver. The OpenPrinting page mentions that the GhostScript driver has issues with color, especiall the B models like mine (C2859B):

Works "almost" - RGB data are sent to the plotter. The CMYK mode of the "B"-Models and the 75x Series is not supported. Images are somewhat "greenish"; gray is composed of CMY. Nice for really LARGE printouts ... (ISO A0).

These are the options I've thought of to print to the printer:

In these expriments, I used the CUPS setup wizard to create a new printer (and upload a PPD), then copied the Avahi service file and pointed it at the new IPP endpoint with a new UUID and name.

For the last two approaches, I need a PPD file (and possibly an ICC color profile) which I can configure in CUPS. HP originally provided these, they mention a v2.0 file which enabled long axis printing for banners, but it's no longer available from their website. I reached out to David Mauldlin based on an old Graphisoft post of his, hoping he might have had the PostScript module and a PPD — sadly this wasn't the case, but he helpfully provided me with a copy of the Service Manual.

The PPD 4.3 format is documented in Adobe Tech Note #5003, with extensions for Foomatic and CUPS documented in the Linux Standard Base Printing Specification 4.0 and in the CUPS Documentation. A PPD for an HP DesignJet should take advantage of embedded page size, e.g. <</PageSize [612 792]>>setpagedevice within the PostScript document1, to avoid:

Without an embedded page size in a PostScript file, PostScript-capable HP DesignJet printers default to a paper size that is the width of the roll multiplied by 1.5. For example, if the printer had a 36-inch roll, the printer would feed and cut the paper at 54 inches (36 x 1.5), regardless of the size of the image on the paper.

I've witnessed this behavior when printing a test PostScript file, so add <</PageSize [612 792]>>setpagedevice (for Letter) to avoid wasting paper. This can be done automatically via PPD file.

I've successfully printed a PDF through CUPS through Windows NT:

I believe Windows NT is simply piping the PostScript file it receives from the network directly to the printer, instead of running the PostScript file it receives through its own driver which would use RTL to speak to the printer. This documentation sheds some light on the situation:

Before Windows 2000, Windows rendered print jobs on the client computer and the rendered data was sent to the print server for printing. Since Windows 2000 and before Windows Vista, print-job rendering took place on the print server. Print-job rendering was moved to print server beginning with Windows 2000 because print servers offered more processing power than the client computers. The more powerful print servers could then complete the processor-intensive task of print-job rendering.

So to take advantage of the official HP driver, I'll need to spin up a Windows 2000 VM.

The CUPS debug log complains:

[Job 178] No resolution information found in the PPD file.
[Job 178] Using image rendering resolution 300 dpi

I'm not yet sure how to add this info, which is 300x300 for color but 600x600 for black and white.

Using this same PPD file, I can print directly to the printer and utilize the PostScript ROM. Both printing through Windows NT and directly via PostScript yield a test page which uses black ink for black, but I ran out of paper before more testing could be done so I'm uncertain whether all colors are constructed in the proper CMYK color space.

A Short History

PostScript was created as a way for an application on a workstation to describe how to print a document in a standard way such than any PostScript printer could render it. It was created by John Warnock and others at the Xerox Palo Alto Research Center (PARC) as InterPress, where laser printing originated. See PostScript and Interpres: A Comparison for an in-depth history of PostScript and Interpress. PostScript also defined a high-end proprietary font format, Type 12. In 2022, The Computer History Museum has published the PostScript v.10 source code, from 1983.

PostScript is not a raster format, it's a stack-based interpreted program (sometimes described as Forth-like), originally the interpreter ran on the printer itself, which produced a raster image at the correct resolution and size for printing on the printer on the chosen media. For Steve Job's unveiling of the Apple LaserWriter in 1984, an expensive workgroup laser printer which used PostScript (and had the most powerful CPU of the Apple line-up at the time, a Motorola 68000 at 12MHz3), he printed a IRS tax form in twenty seconds. To get the form's PostScript program to run that fast, Adobe founder John Warnock applied optimizations like loop unrolling in a program that become Acrobat Distiller4, as described in Warnock on PDF: Its Past, Present and Future. The LaserWriter was so important to Adobe, that my first edition copy of the PostScript Language Reference5 from 1985 advertises "Includes Detailed Programming Information on the Laser Writer" on the cover. These optimizations form part of Project Camelot, which became PDF:

This project's goal is to solve a fundamental problem that confronts today's companies. The problem is concerned with our ability to communicate visual material between different computer applications and systems. The specific problem is that most programs print to a wide range of printers, but there is no universal way to communicate and view this printed information electronically. The popularity of FAX machines has given us a way to send images around to produce remote paper, but the lack of quality, the high communication bandwidth and the device specific nature of FAX has made the solution less than desirable. What industries badly need is a universal way to communicate documents across a wide variety of machine configurations, operating systems and communication networks. These documents should be viewable on any display and should be printable on any modern printers. If this problem can be solved, then the fundamental way people work will change.

In a modern setup, the printer no longer interprets PostScript itself, instead its successor format PDF is received by our print sever CUPS which utilizes filters to transform it into a format the printer can understand. Although CUPS can print to a PostScript printer, using the printer's built-in PostScript interpreter means being limited by its likely small amount of onboard memory and version of PostScript. For instance, the DesignJet can be expanded to 68MB of RAM, but when printing using carefully crafted HP Raster Transfer Language, it only needs to hold a few lines of image at a time as it prints. In my case I use:

The History of Foomatic discusses CUPS' 1999 release, and the pstoraster filter which utilizes GhostScript (an open PostScript interpreter and set of printer drivers) to convert PostScript to a raster format that printers can understand. In the case of the HP DesignJet 650C, the driver is present in the initial 1998 commit. Foomatic provides a database of PPDs, which describe details of the printer including: what GhostScript driver to use, printer dialogue options, paper sizes, etc.


  1. This syntax is fine since the PostScript ROM supports Level 2, which introduced the << ... >> syntax for dictionaries, but the tech note mentions on page 30:

    To further the aim of printing whenever possible, even when Level 2 code is sent to a Level 1 device, the following recommendations should be followed when building a PPD file.

    • Do not use the Level 2 dictionary syntax symbols << and >> directly in invocation code when constructing dictionaries. Doing so will cause a syntaxerror if this code is re-directed to a Level 1 device. Such a syntaxerror cannot be trapped in a stopped context by a print manager. The two alterna- tives are to use the more verbose Level 1 method:

      N dict
      dup /name1 value1 put
      dup /name2 value2 put
      ...
      dup /nameN valueN put
      

      or to put the more efficient Level 2 method into an executable string:

      (<<) cvx exec /name1 value1 /name2 value2
      ...
      /nameN valueN (>>) cvx exec
      

      This second method will avoid the syntaxerror described above. It will consume a tiny amount of VM, which will be restored by automatic garbage collection on a Level 2 device.

    The generic PPD bundled with macOS uses this style:

    *PageSize Letter/US Letter: "2 dict dup /PageSize [612 792] put dup /ImagingBBox null put setpagedevice"
    

    On my system this file is available at:

    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/Resources/Generic.ppd
    
     ↩︎
  2. Described Adobe Type 1 Font Format. Adobe later competed with Apple and Microsoft's TrueType fonts in the Font Wars, which ended with Microsoft and Adobe creating OpenType fonts, and Adobe ending support for Type 1 fonts as of 2023. ↩︎

  3. Apple's LaserWriter: Technical Specifications. Apart from PostScript, the printer also supported the Diablo 630 language, Chapter 5 of A Laser Printing Book by Steven Burrows says this:

    The Xerox Diablo 630 daisywheel printer was for many years the industry standard letter-quality printer for business correspondence, and was widely emulated by other printer manufacturers. As a daisywheel printer the Diablo 630 could not print graphics, and had few font selection capabilities, but it is a useful emulation on laser printers which may be used with very old word-processing software.

    Below is an ad from a 1981 edition of Computerworld:

    Diablo 630 Ad
    Diablo 630 Ad

    Plastic and metal daisy wheels? Sign me up. A 1981 edition of InfoWorld says the price was $2495, or around $8,000 adjusted for inflation. ↩︎

  4. In Evolution of the Digital Document: Celebrating Adobe Acrobat’s 25th Anniversary, Bryan Lamkin writes

    In 1985, he created a new PostScript graphics program (which would later become Acrobat Distiller) and used it to re-code an old federal tax return form. When Steve Jobs unveiled the Apple LaserWriter that year, one of the documents he printed out on stage was John’s 1040 tax form. With Apple on board, Adobe helped launch the desktop publishing revolution.

    The validity of this claim is clouded by the fact that according to Warnock it wasn't "an old federal tax return form," but a form he had hand-coded in PostScript. ↩︎

  5. Colloquially known as the "red book", there is also the PostScript Language Tutorial and Cookbook known as the "blue book", and the PostScript Language Program Design or "green book". The PostScript Language Reference has three editions, there are PDFs of the second and third, the third edition being available directly from Adobe. The first edition is avialable to borrow on archive.org. Fermilab maintained a copy of all of these documents, and they are now available only on the Wayback Machine, unfortunately PLRM1.PDF is actually a copy of the second edition. That folder contains some neat PostScript example programs, such as one to generate a fractal fern. ↩︎