Printing with accounting for CUPS
There are two important things to remember when dealing with a PostScript printer:
Here is an example PostScript program. When interpreted by a PostScript printer, it outputs a sheet of paper with the text “Hello, World!” printed.
%! % PostScript signature
/Times-Roman findfont % locate font named "Times-Roman"
15 scalefont setfont % 15 point and set current font
300 500 moveto % position on paper: x=300, y=500
(Hello, World!) show % render string in raster memory
showpage % print raster memory to paper
From the PostScript interpreter’s point of view, a job lasts from the first byte received over some communications channel through the next end-of-file (EOF) indication, e.g. Ctrl-D over a serial connection or a network shutdown.
PostScript interpreters understand 7-bit ASCII. Some of the non-printing ASCII characters have special meaning:
Character | Octal | Description |
---|---|---|
Ctrl-C | 003 | Interrupt, see below |
Ctrl-D | 004 | End of file, see below |
Line Feed | 012 | End of line, the PostScript newline character |
Return | 015 | End of line, mapped to the PostScript newline |
Ctrl-Q | 021 | Start output (XON flow control) |
Ctrl-S | 023 | Stop output (XOFF flow control) |
Ctrl-T | 024 | Status query: interpreter sends a one-line status message |
Ctrl-D synchronizes the printer with the host: send a PostScript program to the printer, then send an EOF to the printer. When the printer has finished executing the program, it sends an EOF back.
While the interpreter is executing a PostScript program we can send it an interrupt (Ctrl-C). This normally causes the program being executed to terminate.
The status query message (Ctrl-T) causes a one-line status message to be returned by the printer. All messages received from the printer have the following format:
%%[ Key: Value ]%%
Any number of key-value pairs can appear in a message, separated by semicolons. Example:
%%[ Error: undefined; OffendingCommand: ssetfont ]%%
%%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
Status messages have the format
%%[ Status: idle ]%%
where other states besides idle
(no job processing) are:
busy
(executing a program), waiting
(for more of the
PostScript program), printing
(paper in motion),
initializing
, and printing test page
.
There are about 25 different errors that can occur. They have
the format as shown above. The most common errors are
dictstackunderflow
, invalidaccess
, typecheck
, and undefined
.
The operator in the second key-value pair is the operator that
caused the error.
When there is a problem with printing, a printer error is generated:
%%[ PrinterError: reason ]%%
where reason is often Out Of Paper
, Cover Open
, or
Miscellaneous Error
.
The PostScript program itself can also generate output using
the PostScript print
operator. Such output should not be
interpreted by the program driving the printer; instead it
should be sent to the user who sent the program to the printer.
Objects have attributes:
begin
to push another dictionaryend
to pop the topmost dictionarycurrentdict
pushes current dict on op stackCreate dictionary with three entries:
3 dict begin
/proc1 { pop } def
/two 2 def
/three (trois) def
currentdict end
Equivalent:
3 dict
dup /proc1 { pop } put
dup /two 2 put
dup /three (trois) put
/moveto
moveto
When PostScript encounters an executable name, it is looked up in the current environment and what is found is executed.
How to read the page counter:
statusdict begin pagecount == end
How to busy-wait for 1000 ms:
usertime dup 1000 add
{ %loop
dup usertime lt { pop exit } if
} bind loop
The usertime
operator takes no arguments and returns
execution time in milliseconds. A few other operators are
listed below; left of the operator are its arguments (--
indicates none) and right of it its return values.
Operator | Description |
---|---|
– version string | interpreter identification string |
– realtime int | real time in milliseconds |
– usertime int | execution time in msec (for interval timing) |
– languagelevel int | ll. supported by interpreter (1 if undefined) |
– product string | product name (e.g. Printer model) |
– revision int | product revision level |
– serialnumber int | product serial number |
int string string | create string of given length, init with ‘\0’ |
any string cvs string | convert ‘any’ to string representation |
The information here is taken from various sources, but mostly from the following:
W. Richard Stevens, 1993, Advanced Programming in the UNIX Environment, Addison-Wesley. ISBN 0201563177, www.apuebook.com
Adobe Systems, 1988, PostScript Language Program Design, Addison-Wesley. Known as the “Green Book”. ISBN 0201143968