Simple PostScript Solutions

Maybe you just printed to a file from xpdf or you wrote your own PostScript program. If for some reason Imagemagick can’t broker the correct GhostScript command, this has worked for me to create a PNG from PostScript.

gs -dSAFER -dBATCH -dNOPAUSE -r600 -sDEVICE=pnggray -sOutputFile=mydwg.png mydwg.ps

If you don’t want grayscale, here are some other PNG devices that might be interesting.

pngalpha, pnggray, pngmono, pngmonod, fpng, png16, png16m, png256, png48

OCR From PDF

This does work astonishingly well. The trick here is 1. getting the source document into TIFF and 2. using tesseract.

apt install tesseract-ocr
gs -sDEVICE=tiff24nc -sCompression=lzw -r300x300  \
   -dNOPAUSE -sOutputFile="/tmp/hamdymanjobdescriptiontasks.tiff" - \
   < hamdymanjobdescriptiontasks.pdf
tesseract /tmp/hamdymanjobdescriptiontasks.tiff /tmp/hamdymanjobdescriptiontasks.txt

The PostScript Language

PostScript native units are "points". 1 inch = 72 points.

Comments are preceeded with %.

Entire Postscript programs are usually signified like this:

    %!PS-Adobe-3.0 EPSF-3.0
    %%BoundingBox: 34 34 578 758
    %%More headers or comments here

Typical text output goes like this:

  /Courier findfont
  36 scalefont
  setfont
  (The text goes here!) show

Useful Commands

abs

float -> int Math operation. Absolute value.

add

# # -> sum# Math operation. Adds two numbers.

and

i t/f t/f -> t/f Logical operation. Logical AND.

arc

cenx ceny radius startang endang -> Generates circular arc section. The very annoying thing about this is that it only works in CCW. You can use moveto arc moveto to jump to the end of the arc (making it the beginning) and then back to the beginning when you’re done. But this has some severe limitations.

atan

0-1 Arctangent, silly.

bitshift
ceiling

float -> int

clear

x x x x .... x ->

cleartomark
clip

This takes the current path and uses it to create a clip mask. Everything rendered outside of this clipmask is ignored. So if you want everything to be within a certain border, you can make a path of that border and execute clip. Note that clip doesn’t lose the path information which means you could do a stroke too. The only way to make your clip region bigger is by undoing back to a previous state with grestore.

closepath

Takes current path and draws a line from the current point to the first point.

copy

3 2 1 3 copy -> 3 2 1 3 2 1 I think this is like my dupn.

cos

ang -> 0-1ang -> 0-1 Math operator. Cosine.

count
counttomark
curveto

x1 y1 x2 y2 x3 y3 -> Constructs a Bezier curve from the current point to point 3 using points 1 and 2 as control points. Point 1 is on a tangent to the curve at the start (current position) and point2 is on a tangent line to the curve where it ends at point 3.

def

/varname value -> Stores the "value" in a variable. This can be a procedure that can be executed later like so: /go { showpage clear (test.ps) run } def

dup

x -> x x Duplicate. Just like the RPN command.

eq

# # -> t/f Logical comparison operation. Equals.

exch

y x -> y x Same as swap in RPN.

exp
fill

Fills in recent path

findfont

/fontname ->

floor
for

start inc end {proc} -> n1 n2 n3 ... Looping construction. This allows for more complicated looping than the similar repeat command. This one leaves the current counter on the stack prior to executing each procedure. So if you don’t need to use this counter, the first command of your procedure might as well be pop.

ge

# # -> t/f Logical comparison operation. Greater-than or equal.

grestore

Restores the properties stored by gsave. Useful to unset temporary modifications.

gsave

Saves current state of the graphics system. This includes gray, width, paths, clippaths and just about everything. It is important to realize that gsave/grestore pairs can be nested preserving various things at various times.

gt

# # -> t/f Logical comparison operation. Greater-than.

idiv

# # -> # Math operator. Integer division.

if

t/f {proc} ->

ifelse

t/f {procT} {procF} ->

in
index
le

# # -> t/f Logical comparison operation. Less-than or equal.

lineto

x y -> Continues a path from the current point to the point specified. Segments generated with this command will become visible with a subsequent stroke command.

log
lt

# # -> t/f Logical comparison operation. Less-than.

mark
mod

# # -> # Math operator. Remainder.

moveto

x y -> Continues a path to a new point. Segments generated with this command will not be rendered with a subsequent stroke command.

mul

# # -> #

ne

# # -> t/f Logical comparison operation. Not equal.

neg

# -> -# Math operator. Negate.

newpath

Initializes the creation of a new path.

not

t/f -> f/t Logical operation. Logical not.

or

t/f t/f -> t/f Logical operation. Logical or.

pop

x -> Same as "drop" in RPN.

rand
repeat

#times {proc} -> Simple looping construction used to repeat a procedure a known # of times.

rlineto

dx dy -> Continue a path using relative coordinates. This is similar to the lineto.

rmoveto

dx dy -> Jump to another position leaving no stroke marks using relative coordinates. This is similar to moveto.

roll
rotate

deg -> Modifies the viewer’s transform matrix. This is used to change the angular layout of everything. Positive angles turn the viewer ccw, not the paper. You are rotating how you look at it, not how it is.

round
rrand
run

(filename) -> Executes the named (in parentheses) file in the PS interpreter.

scale

xfact yfact -> Modifies the transform matrix. Can be used to mirror too with -1 scale factors. All matrix transforms are cumulative so this does nothing: 2 { -1 -1 scale } repeat

scalefont

points -> Sets the current font size in pionts.

setgray

0-1 -> Sets the ink darkness. 0 is totally black and 1 is totally white.

setlinewidth

points -> Sets the width in points for subsequent stroked paths.

show

(text string here) -> Causes the specified text to be rendered in the current font.

showpage

Causes the current program to be rendered. In GS previewer, it cause a clearing of the page. When actually printing, the printer (mine DJ anyway) needs this command to get going. Without a showpage command at the end of the file, nothing will happen.

sin

ang -> 0-1 Math operator. Sine.

sqrt

# -> # Math operator. Square root.

srand
stroke

Causes the renderer to draw the current path at the current linewidth and gray level, etc.

sub

# # -> difference Math function. Subtraction.

translate

dx dy -> Modifies the viewer’s transform matrix. This basically slides the origin (0,0) for subsequent operations to the specified location. All effects are cumulative and the only way to get back to an earlier state is to follow the steps in reverse or grestore from a previous gsave.

truncate
xor

t/f t/f -> t/f Logical operator. Exclusive OR.