DRUCKER-ABHAENGIGE BEFEHLE

PostScript -- 6. Teil:
Drucker-abhängige PostScript-Befehle


Es gibt PostScript-Operatoren und -Prozeduren, die eigentlich nur im Zusammenhang mit einem Drucker sinnvoll sind. Darüber hinaus erkennen Drucker-Kontroller spezifische Befehle, die je nach Druckertyp zur Verfügung stehen oder eben nicht.
Dieser Teil gibt einen Ueberblick über die druckerabhängigen PostScript-Befehle. Er zeigt, wie ein Drucker eine Rückmeldung an den Host senden kann (z.B. ob ein bestimmter Font verfügbar ist), wie permanente Drucker-Parameter -- z.B. das Drucker-Passwort -- modifiziert werden können, wie ein Benutzer die Fehlerbehandlung umdefinieren und wie der Administrator auf dem eingebauten Plattenspeicher einen PostScript-Startjob ablegen kann.

Verboten in EPS-Files

Zum Einstimmen auf das Thema sehen Sie hier die PostScript-Sequenz für den manuellen Papiereinzug des LaserWriters:

statusdict begin
	/manualfeed true def
end
Dieser Befehl galt bereits 1985, als Apple den ersten LaserWriter auf den Markt brachte.

Die statusdict-Operatoren sind in EPS-Files verboten, da sie geräteabhängig und somit nur beschränkt austauschbar sind. Adobe Systems schreibt auf Seite 743 des Reference-Manuals:

There are operators defined in the statusdict dictionary that are likely to be highly device dependent -- that is, some interpreters will have these operators defined and others will not. These operators must not be used in EPS files. Examples of these operators include, but are not limited to: setsccbatch, duplexmode, setpapertray, tumble, und setmargins. Documents wanting to promote device independence and receive printer rerouting services from a document manager must enclose the calls to these operators with "%%Begin(End)Feature:" comments...
EPS-Files beschreiben Logos, Grafiken und Illustrationen und dienen dazu, von anderen Dokumenten eingebettet zu werden. Dabei ist in der Regel unbekannt, welches Gerät die plazierten Grafiken schliesslich ausdrucken wird -- wenn überhaupt. Vielleicht kommt das EPS-File gar nie zu einem Drucker, sondern sein Weg endet bei einem PostScript-Viewer (ghostscript o.ä.).

FAQ: Welche Fonts gibt es im Drucker?

Eine häufig gestellte Frage lautet: Welche Fonts stehen auf dem X-Drucker in YZ zur Verfügung? So versandte ein Benutzer des Ostasiatischen Seminars der Uni Zürich folgende Mail: "Gibt es eine Uebersichtsliste, welche Fonts auf dem QMS definiert sind? Kann man zusätzliche Fonts installieren oder downloaden?". Das folgende PostScript-Programm stellt fest, welche Fonts auf einem bestimmten Drucker zur Verfügung stehen:

%!PS-Adobe-2.0
%%Pages: 1
%%Title: fontlist.ps
%%EndComments

% FontList.ps : list all defined fonts onto printer
% Send this file to Laser with lpr program 
% in order to print listing

	/left 36 def			% links oben fuer Ausdruck
	/top 700 def
	/psize 12 def			% Schriftgroesse und...
	/spacing psize 2 add def	% ...Abstand
	
	/s { show } def
	/nl { currentpoint exch pop left exch 
			spacing sub moveto } def
	
	/s40 40 string def
	
	/lsfonts {
		FontDirectory			% Dictionary
		{	pop
			s40 cvs s nl
		} forall
	} def
	
	/Helvetica findfont psize scalefont setfont
	
	left top moveto
	lsfonts
	nl
	(Total memory: ) s 		
	vmstatus s40 cvs s nl			% 1.Wert von vmstatus
	(Memory used: ) s
	s40 cvs s nl				% 2.Wert
	pop					% 3.Wert
	
	(Free memory: ) s
	vmstatus exch sub s40 cvs s nl	 % total - used
	pop
	
showpage 					% Seite drucken
Das Dictionary FontDirectory enthält für alle Fonts, die sich im VM-Speicher befinden, die beiden Einträge Fontname und Font-Dictionary. Der Operator cvs wandelt den Namen in eine Zeichenkette um. Das Programm druckt alle Fontnamen des Font-Verzeichnisses aus, ausser Namen von Fonts, die eventuell auf dem Drucker-Harddisk abgelegt sind. Demgegenüber findet der Operator findfont einen Font auch auf dem Plattenspeicher.

Der Befehl vmstatus liefert drei Objekte auf den Stack, wovon uns nur der maximale Speicherplatz (total memory) und der verbrauchte Speicherplatz (used) interessieren. Das dritte Objekt wird mit pop vernichtet. Die Differenz zwischen maximum und used ergibt den freien Speicherplatz.

Viele Laserdrucker bieten mindestens die 35 Standard-Fonts des Apple LaserWriter an:

Rückmeldungen des Druckers

Die Fontliste könnte natürlich nicht nur ausgedruckt, sondern auch an den Host geschickt werden. Das nächste PS-Programm enthält keinen showpage-Operator und druckt nichts aus; vielmehr gibt es eine Rückmeldung an den Host. Es prüft, ob der Font Palatino-Roman auf dem bestimmten Drucker vorhanden ist oder nicht:

%!PS-Adobe-2.0 Query
%%Title: sample query job
%%?BeginFontQuery: Palatino-Roman
/Palatino-Roman
 dup FontDirectory exch known { 
	 1 % ja
	}{
	 0 % nein
	} ifelse
 == 				% Resultat an Host senden 
 flush pop
%%?EndFontQuery

%%?BeginVMStatus
vmstatus exch sub == % Resultat an Host senden
flush pop
%%?EndVMStatus
In diesem Beispiel erwarten wir zwei Antworten des Druckers:

  1. Die Zahl 1 oder 0, welche uns sagt, ob der gewünschte Font vorhanden ist oder nicht.

  2. Die Grösse des freien Speicherplatzes (Differenz maximum - used) im PostScript-Drucker, also im VM-Speicher, wo sich auch die zuladbaren Fonts befinden.

Der Operator == holt sich ein Objekt vom Stack und schreibt die Textdarstellung des Objekts auf den Standard-Output. Ein alternativer Operator, der einen String zurückgibt, ist print. Der Operator flush sorgt dafür, dass der Output sofort erfolgt. Wie genau die Rückmeldung an den Host gelangt, ist vom Uebertragungsprotokoll abhängig. Sowohl die TCP/IP-Protokolle als auch AppleTalk unterstützen die Zweiweg-Kommunikation.

Die Vorgaben für die Dokumentstruktur von Adobe Systems (DSC 3.0) enthalten besondere Kommentare, die mit "%%?" beginnen. Diese Kommentare, die von einem Druckmanager ausgewertet werden könnten, besagen, dass der Drucker an den Host eine Rückmeldung liefert. Wünschbar ist, dass ein Kommando wie

fontloader Univers
erst mal kontrolliert, ob der Font nicht schon im Drucker ist. Bei der Operation Download Fonts to Non-NeXT PostScript Printers tut dies der FontInstaller von Adobe Systems leider nicht.

Das Dictionary statusdict

Die geräteabhängigen Operatoren und Systemparameter befinden sich grundsätzlich im lokalen Dictionary statusdict. Die beiden Beispiele zeigen, wie man einen einzelnen Druckjob im Duplexmodus (beidseitig bedruckt) oder im Format DIN A3 ausgeben kann. Vorausgesetzt, dass der angesteuerte Drucker die beiden Möglichkeiten Duplex und A3 beherrscht.

%!PS-Adobe-2.0
%%BeginFeature: 
statusdict begin
	true setduplexmode
end
%%EndFeature
Dieser statusdict-Befehl sorgt dafür, dass alle Seiten des Jobs zweiseitig bedruckt werden. Die Erfahrung zeigt, dass dadurch auch die Wahrscheinlichkeit eines Papierstaus steigen kann.

%!PS-Adobe-2.0
%%BeginFeature: *PaperSize A3
statusdict begin 2 setpapertray end
%%EndFeature
Dieser Spezialbefehl kann als Vorspann an einen QMS-Drucker oder an andere Seitendrucker mit A3-Kassette gesandt werden. Wie gesagt, ist dieser Befehl nur für einen einzelnen Job wirksam. Vorzuziehen -- da Device-independent -- ist allerdings:
%!PS-Adobe-2.0
%%BeginFeature: *PaperSize A3
statusdict a3 end
%%EndFeature
Merken Sie sich, dass die druckerabhängigen Befehle immer von "statusdict begin" "end" geklammert sind. Zusätzlich enthalten die Beispiele die Kommentare "%%BeginFeature:" und "%%EndFeature".

Permanente Drucker-Parameter

Um permanente Parameter zu verändern, müssen wir zuerst das alte Passwort (Default 0) angeben und die "Server-Schleife" mit exitserver verlassen.

%!PS Passwort
serverdict begin 
0 exitserver
statusdict begin
	 0 9 setpassword % Passwort alt neu
end 
Der PostScript-Interpreter bestätigt das richtige Passwort mit der Meldung

"[exitserver: permanent state may be changed]".

Darauf kann ein statusdict-Befehl abgesetzt werden, z.B. setpassword, setdefaulttimeouts, usw. Das obige Beispiel setzt das neue Passwort auf 9.

Das nächste Beispiel ruft den Operator setdefaulttimeouts auf:

%!PS Timeouts in Sekunden
serverdict begin 
9 exitserver 					% Passwort
statusdict begin
 0 60 60 setdefaulttimeouts %job manualfeed timeout
end
Der Befehl setdefaulttimeouts gibt die Anzahl Sekunden für den Jobtimeout an, d.h. wie lang ein Druckjob höchstens dauern darf. Dieser Operator hat drei Parameter.

Die erste Zahl ist der Jobtimeout-Parameter, der in Sekunden angibt, wie lang ein Druckjob höchstens dauern darf. Die zweite Zahl ist der Manualfeed-Timeout, der in Sekunden angibt, wie lang der Drucker höchstens auf die manuelle Papiereingabe durch den Benutzer warten soll. Die dritte Zahl ist der Wait-Timeout, der in Sekunden angibt, wie lang der Drucker höchstens auf die Fortsetzung eines unterbrochenen PostScript-Datenstroms wartet, bevor er den Druckjob abbricht.

Im Laserdrucker festgesetzte Default-Werte: 0 60 30 -- also beliebig lang, Manualfeed 60 Sekunden, Wait 30 Sekunden. Im Beispiel haben wir den Jobtimeout auf 0 gesetzt; keine Angst, Null hat eine besondere Bedeutung! Es bedeutet nicht 0 Sek., sondern beliebig lang.

Einige weitere statusdict-Befehle, die permanente Parameter setzen:

setmargins
legt den Druckbereich auf dem Blatt fest (in Geräte-Einheiten, z.B. in 1/300 Zoll)
setdostartpage
gibt an, ob wir nach dem Einschalten des Druckers eine Startseite wünschen oder nicht.
setprintername
gibt dem Drucker einen Namen.
setdefaultpapertray
gibt an, welches Blattmagazin normalerweise angesteuert wird.
setsccbatch
legt serielle Uebertragungsparameter fest, z.B. Baudrate Bits/sek., Datenparität und Art der Flusskontrolle
Denken Sie bitte daran, dass diese Parameter vom Druckertyp abhängig sind. Beispielsweise haben nicht alle PostScript-Geräte zwei oder drei Blattmagazine; die Linotronic belichtet Film oder Fotopapier ab Rolle. Ein Belichter kann meterlange "Fahnen" herstellen, und dies seitenverkehrt und/oder negativ. Massgebend sind die Angaben des Lieferanten.

Sehen Sie hier noch ein Beispiel für das Einstellen der Uebertragungsparameter für einen seriell angeschlossenen Laserdrucker:

%!PS serieller Anschluss
serverdict begin 
0 exitserver 					% Passwort
statusdict begin
	% Achtung: 19200 baud, parity none, DTR
 	25 19200 7 setsccbatch
end
Dieser Drucker kommuniziert mit einer Baudrate von 19200 Bits/sek., ohne Parität, Flusskontrolle mit "Data-Terminal-Ready".

Fehlermeldungen des Druckers

Wenn der Drucker-Kontroller, d.h. der PostScript-Interpreter, einen PostScript-Fehler entdeckt hat, ruft er die PostScript-Routine "handleerror" für die Fehlerbehandlung auf. Diese Prozedur weist dann den Grund und den Ort des Fehlers aus.

Wenn Sie wollen, können Sie die handleerror-Prozedur umdefinieren:

%!PS Fehlerbehandlung
serverdict begin
9 exitserver 				% Passwort
errordict begin 			% Dictionary 
 	/handleerror { 

 .... Ihre Definition, z.B. Meldung ausdrucken ....
				(siehe error.ps)

 	} def
end % Ende Dictionary
Da wir die Server-Schleife mit exitserver verlassen haben, bleiben unsere Definitionen bis zum Ausschalten des Druckers erhalten. Das Fehler-Dictionary enthält einige Einträge: der Eintrag errorname gibt die Art des Fehlers an, der Eintrag command den Ort des Fehlers. Die Variable "errorname" gibt somit z.B. "nocurrentpoint" oder "stackunderflow" an.

Rückmeldung, falls falsches Passwort angegeben:

"[Error: PasswordIncorrect; OffendingCommand: exitserver]".

Die Default-Version von handleerror liefert die Fehlermeldung an den Host zurück, druckt jedoch nichts aus. In einem Stapelbetrieb ist es meist wünschenswert, die Fehlermeldungen auf Papier auszudrucken.

Tip:
Was tun, wenn der Drucker weder Fehlermeldung noch Ausdruck liefert? Neben dem fehlenden showpage-Operator gibt es noch andere Ursachen. Häufig liegt der Fehler darin, dass eine Grafik ausserhalb des Druckbereichs liegt, z.B. im negativen Bereich, sodass der Drucker lediglich ein weisses Blatt ausspuckt. In diesem Fall können Sie versuchen, die Abbildung mittels translate wieder in den Druckbereich zu verschieben ("x y translate" vor der Seitenbeschreibung einfügen).

Drucker mit eingebautem Plattenspeicher

Es gibt verschiedene Drucker und Belichter, die mit einem Plattenspeicher bestückt sind. Solche eingebauten Plattenspeicher dienen dazu, PostScript-Jobs oder zusätzliche Fonts aufzunehmen, ferner auch Cache-Dateien. Das folgende Beispiel schreibt einen privaten PostScript-Job auf den eingebauten Plattenspeicher:

%!Achtung: PostScript job onto disk
/StartTempFile (/usr/myjob)(w) file def
/buffer 1024 string def
/storefile {
 {currentfile buffer readstring
 	pop dup length 0 eq
 		{pop StartTempFile closefile exit}
 		{StartTempFile exch writestring}
 	ifelse
 } loop					% Schleife
 } def 
storefile
... Ihr PS-Job ...
Das PostScript-Programm verwendet für die Ablaufkontrolle den Operator loop. Während readstring von currentfile liest, schreibt writestring auf das Disk-File. Die Eingabe/Ausgabe erfolgt in Blöcken von 1024 Zeichen. Auf einem eingebauten Harddisk legt man/frau mit Vorliebe sogenannte Bootjobs ab, d.h. PostScript-Jobs, die beim Aufstarten des Druckers ausgeführt werden.

Das nächste PostScript-Utility dient dazu, alle Font-Cache-Dateien zu löschen. Der Drucker-Kontroller legt diese Dateien auf dem Plattenspeicher ab, um die Druckausgabe zu beschleunigen. Es ist empfehlenswert, das Fontcache bei sehr langer Wartezeit beim Booten sowie vor dem Installieren eines neuen Fonts zu löschen.

%!Achtung: Loeschen des Fontcache
serverdict begin 
9 exitserver 				% Passwort
(FC/*)
     {dup print flush deletefile
     } 100 string 
filenameforall 				% fuer alle Files
Der neue Operator filenameforall ruft für alle Files im Verzeichnis "FC" den Operator deletefile auf. Dieses Dienstprogramm ist nicht für jedermann, sondern für den Administrator gedacht.

Um ein Verzeichnis aller auf der Festplatte abgelegten Files zu erhalten, kann ebenfalls der Operator filenameforall aufgerufen werden. Beispiel:

		...
(*)
     {show newline
     } 100 string 
filenameforall 				% fuer alle Files
Das Wildcard-Zeichen Stern (*) steht für "alle Filenamen".

PostScript Level 2

PostScript Level 2 kennt für besondere Papierformate den neuen Operator setpagedevice. Beispiel für das amerikanische 11x17-Zoll-Papier:
<< /PageSize [792 1224] >> setpagedevice
Die Grössenangaben erfolgen in typografischen Punkten. Die Kennung "<< ... >>" ist eine neue Syntax in PostScript Level 2, d.h. generiert bei Level 1 eine Fehlermeldung. Und hier DIN A4:
%%BeginFeature: *PageSize A3
<< /PageSize [842 1191] >> setpagedevice
%%EndFeature
Der Operator setpagedevice dient bei PS Level 2 und 3 generell dazu, Hersteller-abhängige Parameter festzulegen.


Verboten in EPS-Files
FAQ: Welche Fonts gibt es im Drucker?
Rückmeldungen des Druckers
Das Dictionary statusdict
Permanente Drucker-Parameter
Fehlermeldungen des Druckers
Drucker mit eingebautem Plattenspeicher

DRUCKER-ABHAENGIGE BEFEHLE - 27 JUN 95
Generated with CERN WebMaker