Getting started with postscript
Remarks#
PostScript is a reverse-polish stack-based, dynamically-typed, dynamic-namespacing, scripting language with built-in primitives for generating rendered images from vector descriptions. PostScript employs the same “Adobe Image Model” as the PDF file format.
PostScript is used as an output format by many programs since it is designed to be easily machine-generated.
Like LISP, PostScript is homoiconic and code and data share the same representation. Procedures can take procedures as data and yield procedures as results, lending itself to techniques from concatenative-programming as well.
Installation or Setup
The authentic Adobe PostScript interpreters are available in high-end printers, the Display PostScript (DPS) product, and the Acrobat Distiller product. As authors of the standard, these products are considered “the standard implementation” for the purpose of describing differences among PostScript implementations.
The Standard interface to the interpreter defined in the PLRM is the program-stream which may be either text or binary depending upon the details of the underlying channel or OS/controller. Acrobat Distiller has a GUI front-end to select the input postscript program and render its output as a pdf. Distiller also has some limited support for using the output text stream for reporting errors and other program output. GSView provides a similar GUI front-end for a similar workflow using Ghostscript as the interpreter.
Ghostscript and Xpost both work in a command-line mode. The postscript program file to run can be mentioned on the command-line (gs program.ps
or xpost program.ps
) which will open a graphics window to display the graphical output. Options may be used to render the graphics somewhere else like a disk file or suppress the graphics entirely and use postscript just as a text scripting language.
The various interpreters each have their own installation and setup instructions and it would be wasteful (and prone to falling out-of-date) to reproduce them here.
Freely-available PostScript interpreters
-
Ghostscript is available for all major platforms and Linux distributions, in source or binary form, under the GNU license or under other license arrangements with the authors, Artifex software. Ghostscript implements the full PostScript 3 standard.
-
Xpost is available in source form for all major platforms, under the BSD-3-clause license. It implements the Level-1 standard with some Level-2 extensions and some DPS extensions.
General Description of PostScript
PostScript is a Turing-complete general programming language, designed and developed by Adobe Systems. Many of the ideas which blossomed in PostScript had been cultivated in projects for Xerox and Evans & Sutherland.
Its main real-world application historically is as a page description language, or in its single-page EPS form a vector-graphics image-description language. It is dynamically-typed, dynamically-scoped, and stack-based which leads to a mostly Reverse Polish syntax.
There are three major releases of PostScript.
- PostScript Level 1 — this was released to the market in 1984 as the resident operating system of the Apple LaserWriter laser printer, inaugurating the Desktop Publishing Era.
- PostScript Level 2 — released in 1991, this contained several important improvements to Level 1, including support for image decompression, in-RIP separation, auto-growing dictionaries, garbage collection, Named Resources, binary encodings of the PostScript program stream itself.
- PostScript 3 — the latest and perhaps most widely adopted version was released in 1997. It too contains several import improvements over Level 2 such as Smooth Shading. The term “level” has been dropped.
Though PostScript is typically used as a page description language — and therefore is implemented inside many printers to generate raster images — it can also be used for other purposes. As a quick reverse-polish calculator with more memorable operator names than bc
. As an output format generated by another program (usually in some other language).
Though PostScript file are typically 7-bit-clean ASCII, there exist several kinds of binary encoding described in the level 2 standard. And being programmable, a program may implement its own arbitrarily-complex encoding scheme for itself. There is an International Obfuscated Postscript Competition, somewhat less active than the C one.
Online References
- Index Pages of Adobe Documentation:
https://www.adobe.com/products/postscript/resources.html
https://www.adobe.com/devnet/postscript.html
https://www.adobe.com/devnet/font.html
- PostScript Language Reference Manual, 3ed - The PostScript 3 standard.
(7.41MB pdf)
(Supplement,
Errata)
- PostScript Language Reference Manual, 2ed - The PostScript Level 2 standard.
(includes Display PostScript documentation.) (3.29MB pdf)
-
Postscript Tutorial and Cookbook - The blue book. (847KB pdf)
-
Postscript Language Program Design - The green book. (911KB pdf)
-
Thinking in Postscript - By the author of the green book and the blue-book’s tutorial. (826KB pdf)
-
PostScript Language Document Structuring Conventions Specification 3.0
(521KB pdf)
(444KB pdf)
-
Encapsulated PostScript File Format Specification 3.0 (185KB pdf)
-
[PostScript Printer Description File Format Specification
4.3](https://wwwimages.adobe.com/content/dam/Adobe/en/devnet/postscript/pdfs/5003.PPD_Spec_v4.3.pdf) (186KB pdf) (Update)
-
Troubleshoot PostScript errors - Debugging tips. (158KB html)
-
Acumen Journal - Archive of Postscript and PDF programming articles. (html directory of zipped pdfs)
-
Mathematical Illustrations: A Manual of Geometry and Postscript - by Bill Casselman. (html directory of pdf chapters and code downloads)
-
Thread with many sorting algorithm implementations (usenet archive)
-
Don Lancaster’s Guru Pages
-
Anastigmatix’s Direct use of the Postscript Language
-
Open-source step-wise Debugger for Postscript Code
FAQs
Books
-
Postscript Language Reference Manual, 1ed, 1985. Recommended for its small size, and easy operator index from the summary pages (missing from later editions).
-
Real World Postscript. Chapters by various authors on various topics, including excellent coverage of halftoning.
Local namespaces for functions
Postscript is a dynamic-namespacing or LISP 1 language. But it provides the tools to implement local variables in procedures and other effects needed to implement algorithms.
For local names in a procedure, make a new dictionary at the start and pop it at the end.
/myproc {
10 dict begin
%... useful code ...
end
} def
You can also combine this nicely with a shortcut to define the function’s arguments as variables.
% a b c myproc result
/myproc {
10 dict begin
{/c /b /a} {exch def} forall
%... useful code yielding result ...
end
} def
If you need to update a *“global” * variable while the local dictionary is on top, use store
instead of def
.
Hello World example
Select a font and fontsize, select location, show
string.
%!PS
/Palatino-Roman 20 selectfont
300 400 moveto
(Hello, World!) show
showpage
Notes and common pitfalls:
-
Failing to set a font (resulting in either no text or a default (ugly) font)
-
Using
findfont
andsetfont
but forgetting toscalefont
in between. Using the level-2selectfont
avoids this problem and is more concise. -
Failing to set a point with
moveto
, or setting the point outside of the page. For US letter paper 8.5x11 is 792x612 ps points. So it’s easy to remember roughly 800x600 (but a smidge shorter and wider). So300 400
is roughly the center of the page (little high, little left). -
Forgetting to call
showpage
. If you preview a ps program withgs
and it does not end inshowpage
,gs
may display an image for you. And yet, the file will mysteriously fail to produce any output when you try to convert to pdf or something else.
Curriculum
Read the documentation in this order to easily learn postscript:
-
Paul Bourke’s excellent tutorial: https://paulbourke.net/dataformats/postscript/
-
Blue Book, first half, the original official tutorial:
https://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF
- Green Book, how to use postscript effectively:
https://www-cdf.fnal.gov/offline/PostScript/GREENBK.PDF
-
Thinking in Postscript, ‘nuff said: https://wwwcdf.pd.infn.it/localdoc/tips.pdf
-
Mathematical Illustrations. Start small, build big. The math behind Bezier Curves. The Hodgman-Sutherland polygon clipping
algorithm. Affine transformations and non-linear transformations of the path. 3D drawing and Gouraud shading. From the preface:
Which [of the many tools to help one produce mathematical graphics] to choose apparently involves a trade-off between simplicity and quality, in which most go for what they perceive to be simplicity. The truth is that the trade-off is unnecessary — once one has made a small initial investment of effort, by far the best thing to do in most situations is to write a program in the graphics programming language PostScript. There is practically no limit to the quality of the output of a PostScript program, and as one acquires experience the difficulties of using the language decrease rapidly. The apparent complexity involved in producing simple figures by programming in PostScript, as I hope this book will demonstrate, is largely an illusion. And the amount of work involved in producing more complicated figures will usually be neither more nor less than what is necessary.