Homepage von Ingo Klöckl
 Home
 Programmieren
 - Toolbox
 - Java
 - PostScript
 - Perl
 - Assembler
 - Links
 - Download
Ingo Klöckl
i.kloeckl@2k-software.de
PostScript lernen
Was ist eigentlich EPS?
Download
Literatur, Links

PostScript ist nicht nur ein Druckformat, es ist eine komplette Programmiersprache, die den tiefgründig interessierten Programmierer wegen ihrer Stackstruktur und den optischen Genießer mit ihren Graphikmöglichkeiten anspricht.

Viele alltägliche Probleme lassen sich leicht und platzsparend direkt in PostScript formulieren, viele beim Druckversuch auftretenden Komplikationen mit interessanten Sprachkonstrukten umgehen, sogar interaktive Kopplungen zwischen Programm und Anwender sind möglich ... Das Beispiel zeichnet eine Rosette und zeigt dabei einige grundlegende Elemente von PostScript:


%!PS-Adobe-3.0

/d 7.5 def		% Feinheit der Rosette

gsave 			% speichere graphische Attribute
200 200 translate 	% verschiebe Ursprung
50 50 scale 		% 1 Einheit = 50pt
.02 setlinewidth	% Linienbreite

1 0 moveto		% erste Linie
360 d div cvi		% wie oft?
{ 120 d add rotate	% drehe alles
  1 0 lineto		% ziehe Linie
} repeat		% Schleifenende
stroke			% ziehe Pfad mit Farbe nach

grestore showpage	% alles sichtbar machen
PostScript ist eine interpretative Sprache, das heißt das obige Programm wird nicht mehr compiliert, sondern kann unmittelbar in dieser Form ausgeführt werden. Hierzu wird es entweder auf einen Drucker kopiert und erzeugt das graphische Ergebnis auf dem Papier, was für eine Endfassung der normale Weg ist, aber während der Kennenlern- und Entwicklungsphase sehr viel Papiermüll entstehen läßt. Auch wenn man nur schnell eine PostScript-Datei ansehen will, wünscht man nicht immer gleich einen Ausdruck.
Hier hilft ein PostScript-Interpreter, gekoppelt mit Previewer, weiter. Der bekannteste (und fei obendrein) ist GhostScript, der für alle gängigen Betriebssysteme kompiliert ist (oder werden kann) und neben einem Preview-Fenster auch die interaktive Eingabe von PostScript-Code erlaubt. Hierdurch ist er ideal zum Kennenlernen der Sprache!
GhostScript tritt in zwei Arten (Aladdin und GNU) auf, die sich aber nicht unterscheiden, außer in ihren Lizenzbedingungen.
Mehr zum Betrachten fertiger, mehrseitiger PostScript-Dokumente geeignet ist Ghostview, ein Frontend für GhostScript. GSView und GV sind weitere Previewer.

Wie kann ich PostScript lernen?

Ich habe 1993 bis 1997 in den vorlesungsfreien Zeiten zwischen Sommer- und Wintersemester jeweils einen einwöchigen Kurs über dieses Thema gehalten. Dazu gibt es ein Kursscript sowie Übungsblätter mit Lösungen. Für das Selbststudium ist die Literatur heranzuziehen. Hier möchte ich meine erweiterte und umfassende Referenz und Einführung in die Sprache erwähnen, die 1995 im Hanser-Verlag erschienen ist. "PostScript - Einführung, Workshop, Referenz", Ingo Klöckl, Carl Hanser-Verlag 1995, ISBN 3-446-1838-17.

Informationen zum Kurs nicht nur für Mainzer Studis

  • psueb.zip PostScript-Kurs Übungen 1. bis 5. Tag (PS geZIPpt)

Was ist EPS

Hier soll erklärt werden, was EPS ist, wie man es erzeugt und damit umgeht. Die ausführliche technische Spezifikation kann von Adobe Developer Information geladen werden. Diese Seite gibt's auch zum Downloaden als PS-Datei.

Zunächst war PostScript nur dazu gedacht, komplette Dateien auf einem Drucker auszugeben. Die graphischen Fähigkeiten der Sprache (Skalierung und Verschiebung) lassen es jedoch zu, Graphiken beliebig auf einer Seite zu positionieren und sie als Abbildung zu betrachten, die von einer anderen Anwendung geladen wird. Solche Stücke von PostScript sind in EPS-Dateien enthalten. EPS-Dateien sind also keine selbständigen Ausgabedateien, sie sind zur Inkludierung in Dokumente gedacht. Hieraus ergeben sich einige Charakteristika, die beim Erzeugen von EPS bedacht werden müssen. In der folgenden Diskussion dieser Charakteristika müssen zwei Sichten betrachtet werden: die Sicht der EPS-Datei, um deren Erstellung es hier gehen soll, und die Sicht der Anwendung, die die EPS-Graphik lädt. Die Anwendung schreibt bei der Ausgabe im PostScript-Format eine Datei, in der die EPS-Datei eingebettet ist.

Die Charakteristika einer EPS-Datei

  • Es können grundsätzlich nur einseitige Graphiken als EPS auftreten, auch wenn ein Programm es erlauben sollte, mehrseitige Dokumente als EPS zu speichern. (Die Graphik kann auch kleiner als die ganze Seite sein :-) )
  • EPS-Dateien sollen der Version 2.0 oder höher der Adobe Document Structuring Convention (DSC) entsprechen. Laut dieser können Kommentare auftreten, die bestimmte Eigenschaften der EPS-Datei beschreiben (z.B. verwendete Fonts). Die durch die DSC beschriebenen Kommentare beginnen mit "%%" oder "%!", Fortsetzungszeilen mit "%%+"; die meisten dieser Kommentare können fortgelassen werden.
  • Um anzuzeigen, daß die EPS-Datei den DSC entspricht, sollte die erste Zeile wie folgt lauten:
    %!PS-Adobe-2.0 EPSF-2.0
    
    Die Versionsnummern korrespondieren zu den eingehaltenen DSC resp. EPS-spezifischen Kommentaren.
  • Damit das Anwendungsprogramm über die Größe der im EPS-File enthaltenen Graphik informiert ist, muß diese in der Form
    %%BoundingBox: xu yu xo yo
    
    am Anfang der Datei (z.B. in der zweite Zeile) stehen. Die vier Zahlen xu bis yo geben die Koordinaten der linken unteren und der rechten oberen Ecke der Graphik in pt (1 in = 2,54 cm = 72 pt) an. Der Nullpunkt befindet sich in der unteren linken Ecke der Seite.
  • Da eine EPS-Datei nicht direkt gedruckt wird, ist ein abschließendes showpage nicht erforderlich. Da jedoch viele PS-Dateien durch Einfügen der Bounding Box zu EPS-Dateien umgewandelt werden können, die dann showpage enthalten, ist das Auftreten dieses Befehls kein Fehler. Dies erklärt aber, warum einige EPS-Dateien beim Druck sichtbar werden (diese enthalten den showpage-Befehl), andere dagegen nicht (die Graphik wird zwar gerastert, aber nicht gedruckt). Wollen Sie für Kontrollzwecke diese EPS-Dateien drucken, ohne sie zuvor in andere Dokumente einladen zu müssen, können Sie am Ende der Datei den Befehl showpage einfügen.
  • Es ist im übrigen Sache der Anwendung, die die EPS-Datei einlädt, diesen Befehl unwirksam zu schalten, z.B. wie folgt:
      % begin EPS						%*
      /EPSFsave save def					%*
      % now init graphics state
      0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin	%*
      10 setmiterlimit [] 0 setdash newpath			%*
      /showpage {} def					%*
    
      % hier die EPS-Datei					%EPS
      ...							%EPS
      % end EPS						%EPS
    
      EPSFsave restore					%*
    
    Die mit %* gekennzeichneten Zeilen werden während der PS-Ausgabe des Dokumentes von der Anwendung geschrieben, die mit %EPS markierten stellen die von der Anwendung einkopierte EPS-Datei dar.
    Wenn der PS-Interpreter die Bearbeitung einer PS-Datei beginnt, werden alle Parameter des Graphics State (bspw. Linienbreite oder Zeichenfarbe) auf Defaultwerte gesetzt. Da EPS-Dateien jedoch während der Abarbeitung eines Rahmenprogramms ausgeführt werden, ist der Zustand des Graphics State aus der Sicht der EPS-Datei ungewiß. Die Anwendung muß daher für eine korrekte Initialisierung Sorge tragen, wie das obige Beispiel zeigt. Der Programmierer der EPS-Datei kann hierbei nichts tun, er darf zu Recht erwarten, daß das EPS-Programm einen korrekt initialisierten Zustand vorfindet, der dem entspricht, den der PS-Interpreter beim Systemstart aufbaut.
  • Einige andere Befehle sind in EPS-Dateien nicht erlaubt: grestoreall, initgraphics, initmatrix, initclip, erasepage, copypage, banddevice, framedevice, nulldevice, renderbands, setpageparams, note, exitserver. Problematisch können Interaktionen eigener Funktionen, die mit setscreen oder settransfer gesetzt werden, mit bereits vorhandenen sein.
  • Das EPS-Programm sollte die Daten- und Graphics state-Stacks in dem Zustand hinterlassen, den sie zu Beginn der Abarbeitung der EPS-Datei hatten. Dies ist bei korrekt geschriebenen EPS-Programmen normalerweise der Fall.
    Der Sinn der Forderung wird klar, wenn man den zeitlichen Ablauf bei der Bearbeitung eines PS-Dokumentes betrachtet. Zunächst wird der Teil des PS-Programmes abgearbeitet, der dem eigentlichen Dokumentinhalt entspricht und von der Anwendung erzeugt wird. Nun folgt die eingebettete EPS-Graphik, die den PS-Interpreter in einem Zustand hinterlassen kann, der von dem abweicht, den das PS-Programm an dieser Stelle eigentlich erwartet. Es ist z.B. denkbar, daß das EPS-Programm die Zeichenfarbe ändert und nicht wieder herstellt, sodaß der Rest des Dokumentes farbig gedruckt zu werden droht. Gegen solche unsauberen EPS-Gesellen sollte sich die Anwendung zwar wie oben geschildert wappnen, indem das EPS-Programm mit einer definierten Startumgebung arbeitet und der Zustand des umgebenden PS-Programmes gespeichert und nach der EPS-Graphik wiederhergestellt wird. Der EPS-Programmierer weiß jedoch nicht, ob die Anwendung sein Programm korrekt abkapseln kann, sodaß eine saubere EPS-Programmierung wichtig ist.
    Wenn ein unbekanntes PS-Programm aus dritter Hand zu einer EPS-Datei konvertiert werden muß, kann versucht werden, am Ende des Programmes einige allgemeine "Aufräumarbeiten" durchzuführen, sodaß es unabhängig von der Anwendung möglichst wenige Parameter geändert hinterläßt. Das Putzen mit clear oder countdictstack 4 sub {end} repeat kann gefährlich sein und ungewollt zu viele oder zu wenige Objekte löschen, wenn das EPS-Programm nicht wirklich verstanden wurde. Nichtsdestotrotz können folgende Zeilen gute Dienste leisten, mit denen eine EPS- oder PS-Datei gekapselt werden kann (und die im Grunde dieselben sind, mit denen sich auch die Anwendung selber vor Schäden schützt):
      %!PS-Adobe-2.0 EPSF-1.2
      %%BoundingBox: xu yu xo yo
      % begin EPS						%*
      /EPSFsave save def gsave 				%*
      /dictcount countdictstack def				%*
      mark							%*
      0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin	%*
      10 setmiterlimit [] 0 setdash newpath			%*
      /showpage {} def					%*
    
      % hier die (unbekannte) PS-Datei			%PS
      ...							%PS
      % end PS						%PS
    
      countdictstack dictcount sub { end } repeat		%*
      cleartomark						%*
      grestore EPSFsave restore				%*
    
    Die mit %* markierten Zeilen kapseln das PS-Programm, das mit %PS gekennzeichnet ist, gegen eine Umgebung ab und sorgen dafür, daß keine dauerhaften Modifikationen am Graphics State vorliegen. Eventuell angelegte Dictionaries werden gelöscht. (Sollte das PS-Programm unvorsichtigerweise zuviele Daten oder Dictionaries vom Stack löschen, können Sie leider nichts dagegen tun.)
  • Das EPS-Programm sollte Daten in einem eigenen Dictionary anlegen, das am Ende geschlossen wird. Es wird so sichergestellt, daß die Änderungen von Variablenwerten nur auf den eigenen lokalen Variablen stattfinden und nicht versehentlich eine bereits zuvor existierende Variable gleichen Namens geändert wird:
     % begin private dictionary
     10 dict begin	
     ...
     end
    
    Die Größe des Dictionaries (hier 10 Einträge) richtet sich nach der Zahl der Daten (Variablen), die angelegt und benutzt werden sollen.

Preview-Images

Zur besseren Manipulation der EPS-Graphiken in Anwendungen können der EPS-Datei optionale gerasterte Bildschirmdarstellungen für eine Vorschau mitgegeben werden, sodaß die Anwender den Bildinhalt in grober Form sehen können. Diese Bitmaps sind maschinenabhängig kodiert, eine allgemeine Form, die auf jeder Plattform erkannt werden sollte, ist das "interchange"-Format EPSI. Die Rastergraphik ist darin im ASCII-Format hexadezimal kodiert:
%%BeginPreview: width height depth lines
% "lines" Zeilen mit hexadezimal kodierten Rasterdaten
...
%%EndPreview
Im Kommentar sind Breite und Höhe des Vorschaubildes in Pixeln sowie die Zahl der Bits pro Pixel (1, 2, 4 oder 8 entsprechend 2, 4, 16 oder 256 Graustufen) enthalten. Ein Wert von 0 steht für Weiß ein solcher von 1 für Schwarz. lines gibt die Zahl der folgenden Zeilen mit hexadezimal kodierten Rasterdaten an, damit eine Anwendung diese rasch überspringen kann, falls sie am Vorschaubild nicht interessiert ist. Jede dieser Zeilen muß mit "%" beginnen und somit eine Kommentarzeile darstellen.

Automatisches Konvertieren von PS-Dateien in EPS

Es gibt mehrere Möglichkeiten, PS-Dateien in das EPS-Format zu bringen, ohne Hand anlegen zu müssen:
  • Betrachten der PS-Datei mit Ghostview. Aus Ghostview heraus durch Anwahl des Menupunktes "Datei/PS zu EPS". Hierbei wird nur die Bounding Box berechnet und an den Anfang der Datei geschrieben. Eine Kapselung findet nicht statt.

Download

  • EPS.PS Kurzeinführung in EPS

Literatur und Links zu PostScript

Links

Literatur

  • Das "Red Book", die Standardreferenz von Adobe, beschreibt PostScript Level 1 und 2 in allen Einzelheiten. "PostScript Language Reference Manual", Addison-Wesley, ISBN 0201-18127-4.
  • Das "Blue Book" ist die Einführung von Adobe in PostScript anhand einfacher Beispiele. "PostScript Language Tutorial and Cookbook", Addison-Wesley, ISBN 0201-10179-3.
  • Das "Green Book" ist eine Diskussion des Designs von PostScript-Programmen. "PostScript Language Program Design", Addison-Wesley, ISBN 0201-14396-8.
  • Aus meinem Kursskript ist eine erweiterte und umfassende Referenz und Einführung in die Sprache hervorgegangen, die 1995 im Hanser-Verlag erschienen ist. "PostScript - Einführung, Workshop, Referenz", Ingo Klöckl, Carl Hanser-Verlag 1995, ISBN 3-446-1838-17.
  • Einführender Artikel "Verkanntes Genie - Einführung in die PostScript-Programmierung", DOS International 4/1996