Linux Drucker HOWTO

Grant Taylor (gtaylor@picante.com) und Jens Vonderheide (Jens Vonderheide@wharfrat.fido.de)

v3.10, 10. September 1996, Übersetzung 25. September 1996

Dies ist die Linux Drucker HOWTO, eine Übersetzung der Linux Printing-HOWTO. Es ist eine Zusammenfassung von Informationen, wie man unter Linux (und anderen UNIX-Derivaten) Dokumente generiert, ansieht, druckt oder faxt.

Inhalt

1 Einleitung 2 1.1 Geschichte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Geschichte der deutschen Übersetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3 Copyright . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Wie druckt man? 4

3 Kernel-Drucker-Devices 4 3.1 Das lp-Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3.2 Serielle Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

4 Welche Spool-Software? 5

5 Grundlagen 5

6 Grundeinstellungen 6 6.1 Traditionelle lpd-Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6.2 File Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

7 Wie man einen passenden Magic-Filter bekommt 7 7.1 APS Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 7.2 Magic-Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 7.3 Die anderen Magic-Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

8 Serielle Drucker unter lpd 9 8.1 Einstellungen der printcap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 8.2 Ältere serielle Drucker die Zeichen verschlucken . . . . . . . . . . . . . . . . . . . . . . . . . . 10

9 Distributionsabhängige Lösungen 10 9.1 RedHat 2.x und 3.0.3 (Picasso) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 9.2 Sonstige Distributionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 Wie man einen Drucker über ein Netzwerk benutzt 11

10.1 Auf einem UNIX/lpd Host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 10.2 Mit lpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 10.3 Mit rlpr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 10.4 Auf einem Win95, WinNT, LanManager oder Samba-Drucker . . . . . . . . . . . . . . . . . . 12 10.5 Auf einem Netware-Drucker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 10.6 Auf einem EtherTalk- (Apple-) Drucker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 10.7 Auf einem HP oder anderem Ethernet-Drucker . . . . . . . . . . . . . . . . . . . . . . . . . . 13

10.7.1 Auf alten HPs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 10.8 Ein if für Netzwerkdrucker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

11 Wie man auf einem Faxgerät druckt 15 11.1 Mit einem Faxmodem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 11.2 Mit dem Remote Printing Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

12 Wie man etwas Druckbares herstellt. 15 12.1 Formatierungssprachen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 12.2 WYSIWYG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

13 Ghostscript. 17

13.1 Die Ausgabe von Ghostscript verbessern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 13.1.1 Position der Ausgabe und Größe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 13.1.2 Gamma, Punktgrößen, etc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

14 Voransicht von druckbaren Sachen auf dem Bildschirm 18 14.1 PostScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 14.2 TeX dvi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

15 Credits 18

1 Einleitung

Da dies eine Übersetzung ist, werden die Versionsnummern beibehalten, d.h. die deutsche Übersetzung beginnt mit Version 3.9. Diese HOWTO ist komplett neu geschrieben worden, deshalb sind viele Informationen aus früheren Versionen verloren gegangen. Das ist Absicht, da die früheren HOWTOs 60 Seiten und mehr umfaßten, und den Erzählfluß einer toten Schildkröte hatten. Wer hier keine passende Antwort finden, sollte a) die vorhergehende Version auf der Printing HOWTO Home Page (http://www.picante.com/~gtaylor/pht/) durchsuchen und b) dem Autor einen Nachricht hinterlassen, was in der HOWTO noch stehen sollte. Die alten Versionen stehen nur in englischer Sprache zur Verfügung. Die Printing HOWTO Home Page ist eine gute Stelle, um die aktuelle (englische) Version dieser HOWTO zu bekommen, sie ist auch bei sunsite.unc.edu erhältlich.

Die  deutsche  Version  ist  auf  ftp.heise.de:/pub  und

auf ftp.uni-stuttgart.de:/pub/systems/linux/local/doc zu bekommen. Hier werden auch weitere

deutsche Übersetzungen zu haben sein. Für die Koordination des deutschen HOWTO-Projekts ist Marco

Budde (Budde@tu-harburg.d400.de) verantwortlich.

Um die Verständlichkeit zu erhalten, habe ich einige Fachbegriffe, die im Englischen selbst-erklärend sind, unübersetzt gelassen:

Spool Warteschlange. Hier ”warten” Druckaufträge, bis der Drucker bereit ist.

Device Wörtlich Gerät. Kann sich auf ein physikalisches Gerät wie den Drucker beziehen, bezeichnet aber meistens ein logisches Gerät für Linux, z.B. lp1.

Man-page Anleitungsseite. Beschreibt einen Befehl o.ä. Wird durch man ”Befehl” angezeigt.

1.1 Geschichte

Dies ist die dritte Generation, d.h. die dritte komplette Neufassung der Printing-HOWTO. Die Geschichte der PHT ist diese:

1. Der Autor schrieb die Printing-HOWTO als Antwort auf zu viele Fragen zum Drucken in comp.os.linux, und postete sie. Dieses Posting war einige Monate vor dem HOWTO-Projekt und war damit die erste FAQ, die eine ‘HOWTO’ genannt wurde. Diese Version war in reinem ASCII.

2. Nachdem der Autor dem HOWTO-Projekt beitrat, wurde die Printing-HOWTO mit einem Lpd FAQ von Brian McCauley (B.A.McCauley@bham.ac.uk) verschmolzen, die beiden arbeiteten als Co-Autoren an der PHT etwa 2 Jahre lang weiter zusammen. In dieser Zeit wurde auch die Arbeit von Karl Auer (Karl.Auer@anu.edu.au) eingebaut. Diese Generation der PHT war in TeXinfo, und erhältlich in PS, HTML, Ascii und Info.

3. Nachdem die PHT für über ein Jahr vor sich hin gerottet war, und ein Versuch, jemand anders für die Weiterführung zu gewinnen, scheiterte, entstand diese Neufassung. Diese Generation der PHT ist in Linuxdoc-SGML.

1.2 Geschichte der deutschen Übersetzung

Die deutsch-sprachigen Versionen sind reine Übersetzung, die Geschichte stimmt daher weitestgehend mit der oben genannten Geschichte überein. Die erste übersetzte HOWTO war die Version 3.9, der Übersetzer bemüht sich, neue englisch-sprachige Version möglichst schnell einzubauen.

1.3 Copyright

Dieses Dokument ist urheberrechtlich geschützt. Das Copyright für die englische Printing-HOWTO, auf der dieses Dokument basiert, liegt bei Grant Taylor. Das Copyright für die deutsche Übersetzung liegt bei Jens Vonderheide. Das Dokument darf gemäß der GNU GPL kostenlos verbreitet werden. Das bedeutet, daß der Text sowohl über elektronische wie auch physikalische Medien ohne die Zahlung von Lizenzgebühren verbreitet werden darf, solange dieser Copyright Hinweis nicht entfernt wird. Eine kommerzielle Verbreitung ist erlaubt und sogar erwünscht. Bei einer Verbreitung in Papierform ist das deutsche HOWTO-Projekt hierüber zu informieren.

2 Wie druckt man?

Wenn lpd bereits so eingerichtet ist, daß es druckt, oder der System-Betreuer es bereits eingerichtet hat, dann muß nur der Gebrauch des lpr-Kommandos erlernt werden. Die Printing Usage HOWTO bezieht sich darauf, und auf einige weitere Kommandos, die man kennen sollte.

3 Kernel-Drucker-Devices

3.1 Das lp-Device

Das Linux-Kernel, falls das lp-Device eincompiliert oder geladen wurde (die Ausgabe von cat /proc/devices sollte das Device lp einschließen), stellt ein oder mehr Devices /dev/lp0, /dev/lp1 und /dev/lp2 zur Verfügung. Diese werden NICHT dynamisch zugeordnet, sondern korrespondieren vielmehr mit einer bestimmten I/O-Adresse der Hardware. Das heißt, das der erste Drucker entweder lp0 oder lp1 sein kann, abhängig von der verwendeten Hardware. Testen Sie beides ;)

Man kann nicht die plip- und lp-Treiber gleichzeitig auf einem Port laufen lassen. Man kann aber einen der beiden Treiber entweder manuell oder mit kerneld (mit Version 2 oder späten 1.3.x) laden. Wenn man die Interrupts u.ä. sinnvoll setzt, kann man lp auf dem einen und plip auf dem anderen Port laufen lassen. Jemand hat das gemacht, indem er die Treiber geändert hat, es bleibt abzuwarten, ob es auch eine einfache Kommandozeilen-Methode gibt.

Es gibt eine kleine Utility namens tunelp (http://www.picante.com/~gtaylor/pht/man/tunelp.html),

mit dem man als root Interrupts, Geschwindigkeit und anderes am lp-Device einstellen kann.

Wenn die Option in Kernel 2 oder einigen 1.3.x-Kernels compiliert wurde, kann eine lp=-Option gewählt werden, um die Portadressen und Interrupts einzustellen:

Wenn der lp-Treiber in der Kernel eingebaut wurde, kann ein LILO/LOADLIN-Kommando benutzt werden, um die Portadresse und Interrupts einzustellen.

     Syntax:      lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]
     Beispiel:    lp=0x378,0   oder   lp=0x278,5,0x378,7 **
     ** Standard Port-Einstellungen, der andere Port (<tt/lp0/) liegt bei 0x3bc.

Hinweis: Wenn diese Funktion benutzt wird, müssen alle Ports angegeben werden, die berücksichtigt werden sollen, es gibt keine Voreinstellungen. Man kann einen eingebauten Treiber mit lp=0 deaktivieren.

Wenn das Device als Modul geladen wird (nur in 2.0 und späten 1.3.x Kernels), können die Adressen und Interrupts in der üblichen Syntax im insmod-Kommando angegeben werden. Die Parameter sind io=x,y,z und irq=x,y,z, wobei x, y und z genau das sind, was man annimmt. Auf der Man-page zu insmod gibt es weitere Informationen.

3.2 Serielle Devices

Serielle Devices werden üblicherweise unter Linux als etwas wie /dev/ttyS1 bezeichnet. Das Programm stty

(http://www.picante.com/~gtaylor/pht/man/stty.html) erlaubt es, interaktiv die Einstellungen für die

seriellen  Schnittstellen  anzuse-

hen oder zu verändern; mit setserial (http://www.picante.com/~gtaylor/pht/man/setserial.html)

können einige erweiterte Attribute eingestellt werden und IRQs und I/O-Adressen für nicht-standardmäßige Schnittstellen eingestellt werden. Weitere Informationen über serielle Schnittstellen können in der Serial-

HOWTO (http://sunsite.unc.edu/mdw/HOWTO/Serial-HOWTO.html) nachgelesen werden.

Wenn man einen langsamen seriellen Drucker mit Flußkontrolle benutzt, kann es sein, daß einige Druckaufträge abgeschnitten werden. Das kann an den seriellen Schnittstellen liegen, die standardmäßig 30 Sekunden, nachdem das Schnittstellendevice geschlossen wurde, alle nicht gesendeten Zeichen löscht. Der Puffer hält bis zu 4096 Zeichen, wenn der Drucker Flußkontrolle verwendet und nicht schnell genug ist, um innerhalb von 30 Sekunden, nachdem die Software die Schnittstelle geschlossen hat, alle Daten aus dem Puffer zu empfangen, ist das Ende des Pufferinhalts verloren. Wenn der Befehl cat file > /dev/ttyS2 kurze Dateien komplett ausdruckt, bei längeren aber das Ende abschneidet, könnte genau dieser Fall vorliegen.

Die 30 Sekunden-Wartezeit kann durch das ”closing wait”-Element der Datenstruktur der seriellen Schnittstelle mit Hilfe eines ioctl()- Aufrufs eingestellt werden. Setserial kann dieses Element nicht einstellen, aber andere in der selben Datenstruktur, so daß es einfach ist, setserial entsprechend anzupassen. Dann kann in rc.serial der setserial-Befehl so geändert werden, daß closing wait verlängert wird.

4 Welche Spool-Software?

Bis vor kurzem war die Wahl für Linuxanwender einfach - jeder verwendete das selbe alte lpd, das fast wörtlich aus der Net-2-Distribution von BSD genommen wurde. Auch heute liefern die meisten Distributoren noch diese Software. Aber das beginnt sich zu verändern. SVR4-ähnliche Systeme wie Sun Solaris kommen mit einem komplett anderen Spool-Paket, das auf lpsched beruht. Und es gibt Anzeichen, daß einige Linux-Distributoren auf LPRng umsteigen werden, eine wesentlich neuere Implementierung, die frei erhältlich ist. LPRng ist für große Installationen wesentlich einfacher zu verwalten und besitzt einen nicht so erschreckenden Code wie lpd.

Im Moment ist lpd wohl für die meisten Linuxanwender die beste Lösung, auch mit den neuen Möglichkeiten verglichen. Obwohl es nicht das schickste System ist, funktioniert es gut, sobald es einmal eingerichtet ist, und ist gut verstanden und in vielen Unix-Büchern dokumentiert.

Weitere Informationen über LPRng sind auf der Seite LPRng - Ein verbesserter Druckspooler

(http://ltpwww.gsfc.nasa.gov:81/about/unix/Depotdoc/LDRng/) zu finden. Zukünftige Versionen

dieser HOWTO werden sowohl über lpd als auch über LPRng Informationen enthalten.

5 Grundlagen

Damit das Drucken gut funktioniert, ist es wichtig, die Funktionsweise des lpd-Systems zu verstehen.

Lpd steht für Line Printer Daemon und bezieht sich je nach Zusammenhang entweder auf den Daemon oder auf die gesamten Programme, die für das Druck-Spooling zuständig sind. Das sind:

 lpd

Der Spooling-Daemon. Einer von diesen kontrolliert alles auf einer Maschine, UND einer läuft pro Drucker solange der Drucker druckt.

 lpr

Der Spooling-Befehl für den Anwender. Lpr ruft lpd auf und setzt einen neuen Druckauftrag (Job) in den Spool.

 lpq

Listet die Jobs in einer Drucker-Warteschlange auf.

 lpc

Der Lpd Systemkontrollbefehl. Mit lpc können die Warteschlangen gestoppt, gestartet, umsortiert, etc. werden.

 lprm

lprm entfernt einen Auftrag aus der Warteschlange.

Und wie paßt das alles zusammen? Nun ja, wenn der Computer bootet wird lpd gestartet. Es durchsucht die Datei /etc/printcap, um festzustellen, für welche Drucker es die Spools verwaltet. Jedes mal, wenn man lpr aufruft, nimmt lpr mit lpd durch einen Socket namens /dev/printer Verbindung auf und übergibt lpd die zu druckende Datei und einige Informationen, wer druckt und wie zu drucken ist. Lpd druckt dann die Datei auf dem passenden Drucker aus.

Das lp-System wurde ursprünglich entwickelt, als die meisten Drucker Zeilendrucker waren - das heißt, die meisten Anwender benutzten reine Ascii-Drucker. Es hat sich herausgestellt, daß nur etwas mehr Aufwand nötig ist, damit lpd mit heutigen Druckaufträgen zusammenarbeitet, die häufig in PostScript oder Text oder dvi oder ... sind.

6 Grundeinstellungen

6.1 Traditionelle lpd-Konfiguration

Die Minimaleinstellungen für lpd liefern ein System, das Dateien in Warteschlangen verwalten und sie drucken kann. Es kümmert sich nicht darum, ob der Drucker die Dateien überhaupt versteht und wird vermutlich keine ansehnlichen Ausgaben produzieren. Trotzdem ist es der erste Schritt zum Verständnis, also weiterlesen!

Um eine Warteschlange zu lpd hinzuzufügen, muß man einen Eintrag in /etc/printcap hinzufügen und ein neues Spool-Verzeichnis unter /var/spool/lpd erzeugen.

Ein Eintrag in /etc/printcap sieht wie folgt aus:

     # LOKALER djet500
     lp|dj|deskjet:\
             :sd=/var/spool/lpd/dj:\
             :mx#0:\
             :lp=/dev/lp0:\
             :sh:

Das definiert einen Spool namens lp, dj oder deskjet, im Verzeichnis /var/spool/lpd/dj, ohne maximale Auftragsgröße, der an ein Device /dev/lp0 druckt und am Anfang des Druckauftrags keine Trennseite hinzufügt (mit dem Namen der Person, die gedruckt hat, etc.).

Jetzt wäre der richtige Augenblick, um die man-page für printcap zu lesen.

Das obige Beispiel sieht sehr einfach aus, hat aber ein Problem. Wenn man keine Files sendet, die ein DeskJet 500 verstehen kann, wird dieser Deskjet seltsame Sachen drucken. Wenn man z.B. eine gewöhnlichen UNIX-Textdatei an den Deskjet schickt, interpretiert er die Newlines wörtlich und gibt aus:

     Dies ist Zeile eins.
                         Dies ist Zeile zwei.
                                             Dies ist Zeile drei.

und so weiter. Der Ausdruck einer PostScript-Datei würde eine schöne Liste der PostScript-Befehle geben, mit diesem ”Treppenstufeneffekt” ausgedruckt, aber keine sinnvolle Ausgabe.

Also wird mehr benötigt, und genau das ist die Aufgabe des Filters. Dem aufmerksame Leser werden bei der printcap man-page die Spool-Attribute if und of aufgefallen sein. if oder der Inputfilter ist genau das, was man jetzt braucht.

Wenn man ein kleines Shellscript namens filter schreibt, daß Zeilenumbrüche (CR) vor die Newlines setzt, wird der ”Treppenstufeneffekt” verhindert. Also muß in den printcap-Eintrag eine if-Zeile eingefügt werden:

     lp|dj|deskjet:\
             :sd=/var/spool/lpd/dj:\
             :mx#0:\
             :lp=/dev/lp0:\
             :if=/var/spool/lpd/dj/filter:\
             :sh:

Ein simples Filterscript könnte sein:

     #!perl
     while(<STDIN>){printf "$_\r";};

Wenn man das machen würde, hätte man einen Spool, in den man gewöhnliche UNIX-Textdateien drucken kann und sinnvolle Ergebnisse bekäme. (Ja, es gibt vier Millionen bessere Möglichkeiten diesen Filter zu schreiben, aber wenige so anschauliche. Der Leser möge dies effizienter gestalten.)

Das einzige verbleibende Problem besteht darin, daß gewöhnlicher Text nichts Besonderes ist - es wäre sicherlich besser, wenn man PostScript und andere formatierte Texte oder Grafik-Ausgaben drucken könnte. Ja, gut, das wäre es, und es ist einfach. Dazu muß einfach der obige Zeilenumbruch-Filter erweitert werden. Wenn man einen Filter schreibt, der beliebige Dateitypen akzeptiert und diese in Deskjet-verständliche Ausgaben umwandelt, hat man wirklich einen cleveren Druck-Spooler!

So ein Filter wird Magic-Filter genannt. Man sollte sich nicht die Mühe machen und selber einen schreiben, solange man keine wirklich ungewöhnlichen Sachen drucken will. Es gibt einige wirklich gute im Netz.

6.2 File Permissions

Auf Grund von häufigen Nachfragen ist hier eine Liste der Permissions der wichtigen Dateien, wie sie auf dem System des Autors gesetzt sind. Es gibt bessere Möglichkeiten, im Idealfall ohne SUID root, sondern mit SGID Binärdateien, aber so wurde das System installiert und es funktioniert. (Ehrlich gesagt, wenn ein Verkäufer noch nicht einmal ein funktionierendes lpd liefern kann...)

     -r-sr-sr-x   1 root     lp    /usr/bin/lpr*
     -r-sr-sr-x   1 root     lp    /usr/bin/lprm*
     -rwxr--r--   1 root     root  /usr/sbin/lpd*
     -r-xr-sr-x   1 root     lp    /usr/sbin/lpc*
     drwxrwxr-x   4 root     lp    /var/spool/lpd/
     drwxr-xr-x   2 root     lp    /var/spool/lpd/lp/

Lpd muß momentan als root aufgerufen werden, damit es die lp Service-Ports mit niedrigen Nummern ansprechen kann. Es sollte vielleicht UID lp.lp oder so etwas nach der Bindung werden, aber das tut es wohl nicht.

7 Wie man einen passenden Magic-Filter bekommt

7.1 APS Filter

Einer der schönsten Magic-Filter ist APS Filter, von Andreas Klemm. Der Eintrag in der Linux Software Map ist in etwa dieser:

7. Wie man einen passenden Magic-Filter bekommt 8

Begin3
Title:          apsfilter
Version:        4.9.1
Entered-date:   Montag, 10. Juli 1995, 21:22:35 Uhr MET DST
Description:    magicfilter for lpd with auto filetype detection
(Magic-Filter fuer lpd mit automatischer Dateityp-
Erkennung)
Keywords:       lpd magicfilter aps apsfilter
Author:         andreas@knobel.GUN.de (Andreas Klemm)
Maintained-by:  sledge@hammer.oche.de (Thomas Bueschgens)
andreas@knobel.GUN.de (Andreas Klemm)
Primary-site:   sunsite.unc.edu
/pub/Linux/system/Printing/
211KB aps-491.tgz
Original-site:  ftp-i2.informatik.rwth-aachen.de
/pub/Linux/pak/APSfilter/aps-491.tgz
Platforms:      C-Compiler, gs Postscript emulator, pbmutils
Copying-policy: GPL
End

APS Filter wird als ein if-Filter für eine Warteschlange installiert und übersetzt viele häufige Dateitypen in die entsprechende Druckersprache. Es versteht z.B. Text, PostScript, dvi, gif und andere.

7.2 Magic-Filter

Der Magic-Filter, geschrieben von B.A.McCawley, arbeitet in etwa wie der APS Filter. Er ist aber in bash geschrieben und könnte deshalb besser angepaßt werden. Der LSM-Eintrag:

Version:        0.4
Description:    Bash scripts to simplify the task of configuring
lpd to auto-detect file types using /etc/magic. (As
advertised in the printing-HOWTO). This package
uses existing filters so it only prints file types
for which one already has filters (or compressed
versions thereof). Alterative magic filter approches
are described in the printing-HOWTO.
(Bashscripte, um die Konfiguration von lpd zur
Autoerkennung von Dateitypen mit /etc/magic zu
erleichtern (wie in der Printing-HOWTO angekuendigt).
Dieses Paket verwendet existierende Filter, es druckt
also nur Dateitypen, fuer die bereits Filter vorhanden
sind (oder komprimierte Versionen). Andere Ansaetze
fuer Magic-Filter sind in der Printing-HOWTO
beschrieben.)
Keywords:       lpd, /etc/magic, printing, filter
Author:         B.A.McCauley@bham.ac.uk (Brian McCauley)
Maintained-by:  B.A.McCauley@bham.ac.uk
Primary-site:   tsx-11.mit.edu pub/linux/sources/usr.bin
magic-filter-0.4.tar.gz  5709
Copying-policy: GNU GPL

7.3 Die anderen Magic-Filter

Zur maximalen Verwirrung gibt es zwei weitere Magic-Filter, die einfach nur magic filter heißen (oder sind es die gleichen?)

8. Serielle Drucker unter lpd 9

Title:          magicfilter
Version:        1.1b
Entered-date:   04APR95
Description:    A customizable, extensible automatic printer filter.
                Lets you automatically detect and print just about any
                data type you can find a conversion utility for.  This
                filter is written in C and is controlled completely
                from an external printer configuration file.
                This version adds automagic creation of configuration
                files based on the installed software on your system,
                courtesy of GNU Autoconf.
                This version is a bug fix from 1.1/1.1a; filters for
                non-ASCII capable PostScript printers have been added.
                (Ein anpassungsfaehiger, erweiterbarer automatischer
                Druckerfilter. Erkennt und druckt automatisch so
                ziemlich jeden Datentyp, fuer den es eine Umwandlungs-
                routine gibt. Dieser Filter ist in C geschrieben und
                wird komplett durch eine externe Drucker-
                Konfigurationsdatei gesteuert. ...)
Author:         H. Peter Anvin <Peter.Anvin@linux.org>
Primary-site:   sunsite.unc.edu
                53000 /pub/Linux/system/Printing/magicfilter-1.1b.tar.gz
Copying-policy: GPL

8 Serielle Drucker unter lpd

8.1 Einstellungen der printcap

Lpd besitzt 5 Attribute, die in der /etc/printcap eingestellt werden können, um die Einstellungen des seriellen Ports zu kontrollieren. Man lese dazu die printcap man page und beachte die Bedeutungen von br#, fc#, xc#, fs# und xs#. Die letzten vier dieser Attribute sind Bitmaps, die für die Einstellungen dieses Ports stehen. Das br#-Attribut ist einfach die Baudrate, z.B. ‘br#9600’.

Es ist sehr einfach, die stty-Einstellungen in printcap Flags zu übersetzen. Wenn nötig, möge man nun die man page für stty betrachten.

Man benutzt stty um den Druckerport einzustellen, so daß man ein File an ihn ‘catten’ kann. So kann ‘stty -a’ aussehen:

dina:/usr/users/andy/work/lpd/lpd# stty -a < /dev/ttyS2
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr
-igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase
-tostop -echoprt -echoctl -echoke

Die einzigen Unterschiede zwischen diesem und der Initialisierung beim Booten sind -clocal, -crtscts und ixon. Die benötigten Einstellungen können auch anders sein, abhängig von der Flußkontrolle des Druckers.

Man kann stty auf eine etwas ungewöhnliche Weise verwenden. Weil stty auf dem Terminal, das mit seinen Standardinput verbunden ist, arbeitet, kann man damit einen seriellen Port manipulieren, indem man ‘<’ wie oben verwendet.

Sobald die stty-Einstellungen richtig sind, wenn also ‘cat file > /dev/ttyS2’ (in meinem Fall) die Datei an den Drucker schickt, sollte man die Datei /usr/src/linux/include/linux/termios.h betrachten. Diese Datei enthält viele #defines und einige structs (man sollte diese Datei auf den Drucker catten (das funktioniert ja jetzt) und als Notizpapier verwenden). Man betrachte den Abschnitt, der mit

     /* c_cflag bit meaning */
     #define CBAUD   0000017

anfängt. Dieses Abschnitt listet die Bedeutungen der fc#- und fs#- Teile auf. Es fällt auf, daß die Namen (nach den Baudraten) mit einer der stty-Ausgabeleitungen übereinstimmen. Es wird wirklich leicht...

Einige dieser Einstellungen fangen mit einem - in der stty-Ausgabe an. Wenn man alle diese Nummern aufsummiert (sie sind oktal), erhält man die Bits, die man löschen will. Also ist das die fc#-Einstellung. Natürlich setzt man diese Bits direkt nach dem Löschen, also kann man einfach ‘fc#0177777’ verwenden.

Jetzt macht man das gleiche für die Einstellungen, die kein - vor sich haben. In dem Beispiel sind die wichtigen CS8 (0000060), HUPCL (0002000), und CREAD (0000200). Man beachte auch die Flags für die Baudrate (z.B. 0000015). Man addiert alle zusammen und bekommt im Beispiel 0002275 heraus. Das kommt in die fs#- Einstellung (‘fs#02275’ funktioniert gut beim Autor).

Man macht das gleiche mit ”set” und ”clear” für den nächsten Anschnitt der Includedatei, "c lflag bits". Der Autor mußte nichts einstellen und verwendet deshalb ‘xc#0157777’ und ‘xs#0’.

8.2 Ältere serielle Drucker die Zeichen verschlucken

Jon Luckey hat festgestellt, daß einige ältere serielle Drucker mit 10-cent seriellen Interfaces und kleinen Buffern wirklich Stopp meinen, wenn sie das mit ihrer Flußkontrolle sagen. Er fand heraus, daß man das abstellen kann, indem man an einer 16550er seriellen Schnittstelle mit setserial den FIFO ausschalten (man muß scheinbar nur den UART-Typ als 8250 einstellen).

9 Distributionsabhängige Lösungen

Dieser Abschnitt ist per Definition unvollständig. Details zu spezifischen Distributionen sind willkommen.

9.1 RedHat 2.x und 3.0.3 (Picasso)

RedHat hat ein GUI-Druckerverwaltungsprogramm, das Netzwerkdrucker und Drucker an lokalen Devices hinzufügen kann. Es erlaubt es, einen von PostScript unterstützten Druckertyp und eine UNIX-Device-Datei zu wählen und installiert dann eine Warteschlange in /etc/printcap und schreibt einen kleinen PostScript-und-ASCII Magic-Filter basierend auf gs und nenscript

(http://www.picante.com/~gtaylor/pht/man/nenscript.html). Diese Lösung funktioniert ziemlich gut

und ist für gewöhnliche Anforderungen leicht einzustellen.

RedHat’s neuester BETA-Release (Rembrandt II) verwendet anscheinend LPRng. Der Autor hat sich Rembrandt noch nicht angesehen.

9.2 Sonstige Distributionen

Der Autor bittet um Details, was andere Distributionen machen.

10 Wie man einen Drucker über ein Netzwerk benutzt

Eine der Fähigkeiten von lpd liegt darin, daß man über ein Netzwerk auf Druckern drucken kann, die physikalisch an einen anderen Rechner angeschlossen sind. Mit einer vorsichtigen Kombination von Filterscripts und anderen Utilities kann man mit lpr transparent auf allen möglichen Druckern über alle möglichen Netzwerke drucken.

10.1 Auf einem UNIX/lpd Host

Um es anderen Rechnern zu ermöglichen, auf dem eigenen Drucker zu drucken, müssen diese in /etc/hosts.equiv oder /etc/hosts.ldp aufgelistet werden. Achtung: hosts.equiv hat viele weitere Effekte; man sollte sich sicher sein, was man tut, wenn man hier einen Rechner auflistet. Man kann auch nur bestimmten Benutzern des anderen Rechners erlauben, zu drucken. Dazu nutzt man das rs-Attribut; siehe dazu lpd man page.

10.2 Mit lpd

Um auf einem anderen Rechner zu drucken, erstelle man einen /etc/printcap-Eintrag wie diesen:

     # NETZWERK djet500
     lp|dj|deskjet:\
             :sd=/var/spool/lpd/dj:\
             :rm=geraet.da.draussen.com:\
             :rp=printername:\
             :lp=/dev/null:\
             :sh:

Es gibt weiterhin ein Spool-Verzeichnis auf dem lokalen Rechner, das von lpd verwaltet wird. Wenn der Netzwerkrechner beschäftigt oder nicht erreichbar ist, bleiben Druckaufträge des lokalen Rechners in dem Spoolverzeichnis, bis sie gesendet werden können.

10.3 Mit rlpr

Man kann auch rlpr benutzen, um einen Druckauftrag direkt in eine Warteschlange auf einem Netzwerkrechner zu schicken, ohne sich die Mühe zu machen, lpd entsprechend einzurichten. Das ist besonders sinnvoll, wenn man nur selten auf vielen verschiedenen Druckern druckt. Aus der Ankündigung von rlpr:

Rlpr verwendet TCP/IP, um Druckaufträge an lpd-Server in einem Netzwerk zu schicken.

Anders als lpr müssen die Netzwerkdrucker dem lokalen Rechner nicht bekannt sein (z.B. durch /etc/printcap). Deshalb ist rlpr wesentlich flexibler und benötigt weniger Verwaltung.

rlpr kann überall da verwendet werden, wo ein traditionelles lpr verwendet werden kann und ist rückwärtskompatibel zum traditionellen BSD lpr.

Der Hauptvorteil von lprl ist die Möglichkeit, *von überall nach überall* zu drucken, ohne Rücksicht darauf, wie das System, von dem aus man drucken will, konfiguriert ist. Es kann genau wie das traditionelle lpr wie ein Filter funktionieren, so daß Clients, die auf einem Netzwerkrechner laufen (z.B. Netscape, XEmacs, etc) ohne größere Probleme auf dem lokalen Rechner drucken können.

Rlpr ist erhältlich von sunsite.unc.edu:/pub/Linux/system/Printing/.

10.4 Auf einem Win95, WinNT, LanManager oder Samba-Drucker

Es ist möglich, eine lpd-Warteschlange mit dem smbclient-Programm (ein Teil des Samba-Pakets) zu einem TCP/IP-basierenden SMB-Druckservice zu schicken. Dafür kommt mit Samba ein Script namens smbprint. Kurz gesagt legt man eine Konfigurationsdatei für den gewünschten Drucker im Spoolverzeichnis an und installiert das smbprint-Script als if.

Der /etc/printcap-Eintrag sieht wie folgt aus:

     lp|remote-smbprinter:\
         :lp=/dev/null:sh:\
         :sd=/var/spool/lpd/lp:\
         :if=/usr/local/sbin/smbprint:

Man sollte die Dokumentation im smbprint-Skript lesen, um weitere Informationen zu erhalten.

Man kann auch den smbclient verwenden, um eine Datei direkt an einen SMB-Druckservice zu schicken ohne lpd zu benutzen. Siehe Man-page.

10.5 Auf einem Netware-Drucker

Im ncpfs-Paket ist ein Programm namens nprint, daß die gleichen Funktionen wie smbprint für NetWare hat. ncpfs ist erhältlich bei linux01.gwdg.de:/pub/ncpfs/. Aus dem LSM-Eintrag zur Version 0.16:

With ncpfs you can mount volumes of your netware server under Linux. You can also print to netware print queues and spool netware print queues to the Linux printing system. You need kernel 1.2.x or 1.3.54 and above. ncpfs does NOT work with any 1.3.x kernel below 1.3.54. (Mit ncpfs kann man Laufwerke auf dem Netzwerk-Server unter Linux mounten. Man kann auch in Netware-Warteschlangen druchen und Netware-Warteschlangen in das Linux Drucksystem spoolen. Man benötigt Kernel 1.2.x oder 1.3.54 oder hoeher. ncpfs funktioniert NICHT mit 1.3.x-Kernels unter 1.3.54.)

Damit nprint über lpd arbeitet, schreibt man ein kleines Shellscript um stdin auf dem Netware-Drucker zu drucken und installiert es als if für eine lpd Warteschlange. Man erhält so etwas wie:

     sub2|remote-NWprinter:\
             :lp=/dev/null:sh:\
             :sd=/var/spool/lpd/sub2:\
             :if=/var/spool/lpd/nprint-script:

Das nprint-script könnte ungefähr so aussehen:

     #! /bin/sh
     /usr/local/bin/nprint -S net -U name -P passwd -q printq-q -

10.6 Auf einem EtherTalk- (Apple-) Drucker

Im netatalk-Paket ist etwas wie nprint und smbclient enthalten. Werner Eugster hat die Einstellungen, um auf einem Apple-Netzwerk zu drucken, besser beschrieben, als es der Autor je könnte, siehe seine Webseite

(http://garnet.berkeley.edu/~weugster/appleprint.html).

Obskure Warnung der Woche: Netatalk funktioniert nicht mit einer SMC Etherpower PCI-Karte mit einem DEC Tulip-Chip.

10.7 Auf einem HP oder anderem Ethernet-Drucker

HPs und einige andere Drucker haben ein Ethernet-Interface, auf dem man direkt mit lpd drucken kann. Man sollte den Anweisungen folgen, die mit dem Drucker oder Netzwerkadapter geliefert wurden, aber generell lassen solche Drucker lpd ”laufen” und stellen eine oder mehrere Warteschlangen zur Verfügung. Ein HP zum Beispiel könnte mit einem solchem Printcap-Eintrag arbeiten:

     lj-5|remote-hplj:\
             :lp=/dev/null:sh:\
             :sd=/var/spool/lpd/lj-5:\
             :rm=printer.name.com:rp=raw:

In einem großen Netz, besonders einem großen Netz, in dem einige Drucker kein PostScript unterstützen, ist ein sinnvoll, einen Print-Server zu nutzen, auf dem alle Rechner drucken und auf dem alle Ghostscript-Jobs laufen.

10.7.1 Auf alten HPs

Einige Drucker unterstützen nur ein kleines ”Nicht-Protokoll” mit reinen TCP-Verbindungen. Erwähnenswert in dieser Kategorie sind frühe JetDirect (und einige JetDirectEx) Karten. Grundsätzlich muß man zum Drucken auf diesen Drucker eine TCP-Verbindung zu dem Drucker auf einem bestimmten Port (typischerweise 9100) öffnen und den Druckauftrag hierdurch schicken. Das kann in Perl implementiert werden:

     #!/usr/bin/perl
     # Thanks to Dan McLaughlin for writing the original version of this
     # script (And to Jim W. Jones for sitting next to Dan when writing me
     # for help ;)
     $fileName = @ARGV[0];
     open(IN,"$fileName") || die "Kann Datei $fileName nicht oeffnen";
     $dpi300     = "\x1B*t300R";
     $dosCr      = "\x1B&k3G";
     $ends = "\x0A";
     $port =  9100 unless $port;
     $them = "bach.sr.hp.com" unless $them;
     $AF_INET = 2;
     $SOCK_STREAM = 1;
     $SIG{'INT'} = 'dokill';
     $sockaddr = 'S n a4 x8';
     chop($hostname = `hostname`);
     ($name,$aliases,$proto) = getprotobyname('tcp');
     ($name,$aliases,$port) = getservbyname($port,'tcp')
         unless $port =\~{} /^\d+$/;;
     ($name,$aliases,$type,$len,$thisaddr) =
             gethostbyname($hostname);
     ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them);
     $this = pack($sockaddr, $AF_INET, 0, $thisaddr);
     $that = pack($sockaddr, $AF_INET, $port, $thataddr);

10. Wie man einen Drucker über ein Netzwerk benutzt 14

if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
#    print "socket ok\n";
}
else {
    die $!;
}
# Gibt dem Socket eine Adresse
if (bind(S, $this)) {
#    print "bind ok\n";
}
else {
    die $!;
}
# Ruft den Server auf.
if (connect(S,$that)) {
#    print "connect ok\n";
}
else {
    die $!;
}
# Setzt Befehlspuffer fuer den Socket.
select(S); $| = 1; select(STDOUT);
#    print S "@PJL ECHO Hi $hostname! $ends";
#    print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends";
#    print S $dpi300;
# Durch Aufteilung Deadlock verhindern.
if($child = fork) {
    print S $dosCr;
    print S $TimesNewR;
    while (<IN>) {
        print S;
    }
    sleep 3;
    do dokill();
} else {
    while(<S>) {
        print;
    }
}
sub dokill {
    kill 9,$child if $child;
}

10.8 Ein if für Netzwerkdrucker

Eine Besonderheit von lpd ist, daß if für Netzwerkdrucker nicht aufgerufen wird. Wenn das nötig sein sollte, kann man eine doppelte Warteschlange einstellen und den Job an die zweite Warteschlange weitergeben:

Beispiel für eine passende printcap:

     lj-5:remote-hplj:\
             :lp=/dev/null:sh:\
             :sd=/var/spool/lpd/lj-5:\
             :if=/usr/lib/lpd/filter-lj-5:
     lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\
             :rp=raw:sd=/var/spool/lpd/lj-5-raw:

mit diesem filter-lj-5-Script:

     #!/bin/sh
     gs <options> -q -dSAFER -sOutputFile=- - | \
             lpr -Plj-5-remote -U$5

Die -U-Option bei lpr funktioniert nur, wenn lpr als ein Daemon gestartet wurde und setzt den Namen des Auftraggebers in der weitergegebenen Warteschlange. Man sollte eventuell eine robustere Methode verwenden, um den Usernamen zu ermitteln, denn manchmal ist es nicht Argument 5. Siehe auch die Man-page zu printcap.

11 Wie man auf einem Faxgerät druckt

11.1 Mit einem Faxmodem

Es gibt einige Faxprogramme, mit denen man faxen und Dokumente empfangen kann. Eines der komplexesten ist Sam Lefflers HylaFax, erhältlich von ftp.sgi.com. Es unterstützt alle möglichen Funktionen von mehreren Modems bis Ausstrahlung.

Es gibt auch eine bessere Wahl für die meisten Linuxboxen: efax. Das ist ein einfaches Programm, das Faxe sendet. Das getty-Programm mgetty kann Faxe empfangen (und sogar Sprache mit einigen Modems!).

11.2 Mit dem Remote Printing Service

Es gibt einen experimentellen Dienst, an den man eine eMail senden kann, die dann irgendwo anders auf einem Faxgerät erscheint. Es werden Formate wie PostScript unterstützt, so daß es ein sehr sinnvoller Dienst ist, obwohl die globale Unterstützung sehr lückenhaft ist. Für weitere Informationen siehe die FAX-FAQ

(http://www.town.hall.org/fax/faq.html).

12 Wie man etwas Druckbares herstellt.

Hier kommt man in ein wahres Rattennest an Software. Grundsätzlich kann man vier Typen von Binärdateien mit unterschiedlichem Erfolg laufen lassen: Linux, iBCS, Win16/Win32s (mit dosemu und irgendwann mit Wine) und Mac/68k (mit Executor). Hier werden nur reine Linux und UNIX-Programme behandelt, aber man sollte erwähnen, daß WordPerfect für SCO und sehr wahrscheinlich weitere kommerzielle Textverarbeitungsprogramme gut unter Linux iBCS-Emulation laufen.

Für Linux selbst ist man auf die für UNIX generell erhältlichen Programme beschränkt:

12.1 Formatierungssprachen

Die meisten Formatierungssprachen sind am besten für große oder sich wiederholende Projekte geeignet, in denen man dem Computer die Kontrolle über das Layout überlassen möchte, damit alles einheitlich aussieht. Ein schönes Zeichen in einer Formatierungssprache könnte schmerzhaft sein...

nroff

Diese war eine der ersten Formatierungssprachen für UNIX. Man-pages sind das häufigste Beispiel für Texte, die mit *roff-Makros formatiert wurden; einige Leute schwören darauf, aber nroff hat für den Autor die geheimnisvollste Syntax und ist deshalb wohl die schlechteste Wahl für neue Texte. Man sollte aber trotzdem wissen, daß man eine Man-page mit groff direkt nach PostScript konvertieren kann. Die meisten man-Befehle machen das mit man -t foo | lpr.

TeX TeX und das Makropaket LaTeX gehören zu den am häufigsten verwendeten Formatierungssprachen auf UNIX. Technische Werke werden häufig in LaTeX geschrieben, denn es vereinfacht die Layoutfragen stark und ist weiterhin eines der wenigen Textverarbeitungssystemen, daß mathematische Aspekte komplett und gut unterstützt. Die Ausgabe von TeX ist dvi und kann mit dvips oder dvilj nach PostScript oder Hewlett Packards PCL konvertiert werden.

SGML Es gibt mindestens einen freien sgml-Parser für Unix und Linux; es bildet die Basis von Linuxdoc-SGMLs selbst entwickelten Dokumentensystem. Es kann auch andere DTDs unterstützen.

HTML Jemand hat vorgeschlagen, einfache Projekte in HTML zu schreiben und mit Netscape auszudrucken. Der Autor widerspricht dem.

12.2 WYSIWYG

Es gibt sehr wenige WYSIWYG-Textverarbeitungsprogramme. Weitere Programme sind immer gefragt, und man möge den Autor auf jegliche Auslassungen hinweisen.

LyX LyriX ist ein Frontend für LaTeX, das vielversprechend aussieht. Auf der LyX Homepage

(http://www-pu.informatik.uni-tuebingen.de/users/ettrich/) gibt es weitere Informationen.

Das Andrew User Interface System AUIS beinhaltet ez, ein WYSIWYG-artiges Editor mit sehr grundlegenden Textverarbeitungsfähigkeiten, HTML und vollem MIME eMail und Newsgroup-Unterstützung.

Kommerzielle Angebote Zumindest Caldera und Red Hat beeinhalten Pakete mit den üblichen Office-Anwendungen wie eine WYSIWYG-Textverarbeitung und eine Tabellenkalkulation. Der Autor nimmt an, daß sie sehr gut funktionieren, hat sie aber noch nie benutzt. Er nimmt an, daß Caldera auch Sun’s WABI vertreibt, so daß man vielleicht etwas wie MS Office laufen lassen kann, wenn man mit den Dateien anderer Leute arbeiten muß. Jeff Phillips (jeff@I RATUS.org) verwendet Caldera’s WordPerfect für Linux (auf Slackware) und sagt, daß es gut funktioniert. Es besitzt anscheinend eingebaute Druckerunterstützung, wie zu erwarten war. Caldera sollte mehr Informationen unter http://www.caldera.com/ haben. RedHat vertreibt ein Paket namens Applixware; ihre Website ist unter http://www.redhat.com zu erreichen. Sonstige Verkäufer werden gebeten, den Autor über ihre Produkte zu unterrichten.

13 Ghostscript.

Ghostscript ist ein unheimlich wichtiges Programm für das Drucken unter Linux. Die meisten Druckprogramme unter Linux erzeugen PostScript, was normalerweise eine 150-450-DM-Option für Drucker ist. Ghostscript ist allerdings kostenlos und kann aus PostScript die jeweilige Druckersprache erzeugen. Wenn es mit dem lpd-Inputfilter zusammengebracht wird, erzeugt es einen virtuellen PostScript-Drucker und vereinfacht das Leben immens.

Es gibt zwei Arten von Ghostscript. Die kommerzielle Version, Aladdin Ghostscript, darf kostenlos für den privaten Gebrauch verwendet werden, aber nicht in kommerziellen Linux-Distributionen vertrieben werden. Es ist normalerweise dem freien Ghostscript etwa ein Jahr voraus; im Moment unterstützt Aladdin Ghostscript zum Beispiel das Portable Document Format vom Adobe Acrobat, was die älteren Ghostscripts nicht machen.

Die freie Version von Ghostscript ist GNU Ghostscript, einfach eine ältere Version von Aladdin Ghostscript, freundlicherweise GNU überlassen. (Ehre an Aladdin für dieses Verfahren; mehr Softwareverkäufer sollten freie Software so unterstützen).

Ghostscripts Hauptnachteil sind seine Schriftarten, die aus Bitmap-Scans der Zeichen erstellt wurden. Bessere, aber kommerziell lizensierte Schriftarten können aus mehreren Quellen erhalten werden, da Ghostscript Type 1 Adobe Fonts lesen kann. Adobe vertreibt lesbare Schriftarten mit ihren Acrobat PDF-Leser, oder man kann die Schriftarten von Adobes ATM oder einem Fontpack nutzen.

Was auch immer man mit gs macht, man sollte es immer mit der Option zum Verhindern von Dateizugriffen (-dSAFER) starten. PostScript ist eine komplett funktionale Sprache und ein schlechtes PostScript-Programm kann ziemliche Kopfschmerzen verursachen.

13.1 Die Ausgabe von Ghostscript verbessern

Man kann einige Sachen machen, wenn gs’ Ausgabe nicht zufriedenstellend ist (man kann wirklich alles machen, was man will, man hat ja den Quelltext).

13.1.1 Position der Ausgabe und Größe

Die Position, Größe und Vergrößerung einer Seite wird durch die drucker-spezifischen Treiber in Ghostscript kontrolliert. Wenn die Seiten zu kurz oder zu lang, oder um den Faktor Zwei zu groß sind, könnte man in das Quellmodul des Treibers schauen und alle Parameter, die einem auffallen, anpassen. Leider ist jeder Treiber anders, deswegen gibt es keine Anleitung, was einzustellen ist, aber die meisten sind vernünftig kommentiert.

13.1.2 Gamma, Punktgrößen, etc.

Die meisten nicht-Laserdrucker leiden darunter, daß ihre Punkte ziemlich groß sind. Dadurch erscheinen die Bilder zu dunkel. Wenn man das feststellt, sollte man seine eigene Übertragungsfunktion nutzen. Man erstellt einfach die folgende Datei im Ghostscript-lib-Verzeichnis und fügt den Namen zum gs-Aufruf direkt vor der eigentlichen Datei ein. Die eigentlichem Werte müssen dem eigenen Drucker angepaßt werden. Niedrigere Werte erzeugen einen helleren Druck. Besonders wenn der Treiber einen Floyd-Steinberg-Algorithmus verwenden, um Farben zu rastern, sollten niedrige Werte (0.2 - 0.15) verwendet werden.

     ---8<---- gamma.ps ----8<---
     %!
     %Uebersetzungsfunktionen fuer Cyan Magenta Gelb Schwarz
     {0.3 exp} {0.3 exp} {0.3 exp} {0.3 exp} setcolortransfer
     ---8<------------------8<---

Es ist auch möglich, Drucker, die einen Farbfehler haben, zu reparieren, indem diese Werte verändert werden. Wenn man etwas derartiges versucht, sollte man die Datei colorcir.ps, die mit Ghostscript kommt (im examples-Verzeichnis) als Testseite verwenden.

14 Voransicht von druckbaren Sachen auf dem Bildschirm

Fast alles Druckbare kann auch auf dem Bildschirm betrachtet werden.

14.1 PostScript

Ghostscript besitzt einen X11-Treiber, der am besten unter der Verwaltung des PostScript-Vorbetrachters Ghostview verwendet wird. Die neuesten Versionen dieser Programme sollten auch PDF-Dateien betrachten können.

14.2 TeX dvi

TeX DeVice-Independant-files (geräteunabhängige Dateien) können unter X11 mit xdvi betrachtet werden. Moderne Versionen von xdvi rufen Ghostscript auf, um PostScript-Spezialitäten zu verarbeiten.

Es gibt ebenfalls einen VT100-Treiber. Er wird dgvt genannt. Tmview arbeitet mit Linux und svgalib, falls das alles ist, was funktioniert.

15 Credits

Die Informationen über smbprint sind aus einem Artikel von Marcel Roelofs (marcel@paragon.nl).

Die Informationen über nprint, um NetWare-Drucker zu verwenden, wurde von Michael Smith (mikes@bioch.ox.ac.uk) zur Verfügung gestellt.

Der Abschnitt ”Serielle Drucker und lpd” ist von Andrew Tefft (teffta@engr.dnet.ge.com).

Der Teil über gammas und soweiter für gs wurde eingeschickt von Andreas (quasi@hub-fue.franken.de).

Die zwei Abschnitte über die 30 Sekunden-closing wait des seriellen Treibers sind von Chris Johnson

(cdj@netcom.com).