Python + Postscript = Profit!

Sat 12 March 2016

While setting up the computing environment for the "Introduction to Computational Quantum Nanoelectronics" tutorial at the APS March Meeting, I came across the problem that I needed to generate 150 chits of paper with login information on them. While all the login info was available in plain text form, this didn't really lend itself well to easy printing. Given the number of chits we would have to generate I didnt really feel like manually copy/pasting/formatting the contents of the text file using word processing software. A colleague suggested that I take a look at Postscript, which is a language for creating vector graphics. It's pretty bare-bones in terms of the features it offers (it's mainly meant as the output of sophisticated document processors such as TeX), but getting a few lines of text layed out on a page it's perfect. The Python snippet below shows how simple it is to write a simple Postscript generator.

import sys

postscript_header = """
    %%!PS-Adobe-2.0

    /Inconsolata findfont
    50 scalefont
    setfont

    %%Pages: {0}
"""

postscript_page = """
    %%Page {0} {0}
    %%BeginPageSetup
      90 rotate 0 -595 translate
    %%EndPageSetup

    newpath
    50 400 moveto
    (user: {1}) show
    50 300 moveto
    (password: {2}) show
    showpage
"""

pages = [postscript_header]
for pagenum, line in enumerate(sys.stdin, 1):
    user, passwd = line.split()
    pages.append(postscript_page.format(pagenum, user, passwd))

# now we know the number of pages, format the page header
pages[0] = pages[0].format(pagenum)
print('\n'.join(pages))

The above snippet takes username/password pairs from stdin and and writes a postscript document to stdout. It displays a single username/password per page in 50pt Inconsolata1 and oriented landscape. This can be read using most standard document viewers, and when printing the output can be compacted somewhat by printing several logical pages per physical page. The raw postscript can also be converted into other formats such as PDF, which is useful as the fonts are embedded directly into the document and mean that the document can be easily shared.

Now that I've seen just how easy it is to generate proper documents with Python and postscript I'm sure that I'll be integrating it into my workflow more often!


  1. This font is advantageous for username/password combinations as it distinguishes zeros from O's by putting a slash through the former.