Kapitel 6: Drucken

Inhalt:
6.1. Den Druckdaemon einschalten
6.2. Konfiguration der /etc/printcap
6.3. Konfiguration von Ghostscript
6.4. Das Drucksystem steuern
6.5. Drucken im Netz
Seitenende und Ausstieg

Dieses Kapitel beschreibt eine einfache Konfiguration für das Drucken auf einen HP Deskjet 690c, der an den ersten Parallelport des Rechners angeschlossen ist als Beispiel. Als Erstes konfigurieren wir das System, um Textdokumente auszudrucken. Als Nächstes erweitern wir die Konfiguration, um PostScript- Dokumente mit dem Ghostscript- Programm ausdrucken zu können.

6.1. Einschalten des Druckdaemons

Nach einer frischen Installation ist es noch nicht möglich, sofort zu drucken, weil der »lpd«- Druck- Spooling Daemon nocht nicht eingeschaltet ist. Um das zu tun, muss eine Zeile in »/etc/rc.conf von...

lpd=NO
    

nach

lpd=YES
    

Geändert werden.

Diese Änderung wirkt sich erst nach dem nächsten Neustart des Systems aus; aber der Daemon kann für jetzt auch manuell gestartet werden:

# lpd -s
    

Um zu kontrollieren, ob »lpd« aktiv ist, gibt es dieses Kommando:

# ps ax | grep lpd
  179 ??  Is     0:00.01 lpd
    

Wenn Du keine Eintragung für lpd im Output dieses Kommando findest, ist der Daemon nicht aktiv.

Bevor Du »/etc/printcap« konfigurierst, ist es besser, einen Testlauf zu fahren, um zu testen, ob es eine funktionierende Verbindung zu Drucker gibt. Beispiel:

# lptest 20 10 > /dev/lpt0
    

Um zu sehen, wie der Output aussehen sollte, versuche mal dasselbe Kommando ohne Umleitung der Ausgabe auf den Drucker:

# lptest 20 10
    

Ein häufiger auftretendes Problem ist, dass die Linien im Output zum Drucker nicht korrekt in ihren Spalten stehen (Staircase- Problem), sondern abgestuft dargestellt werden. Das heisst gewöhnlich, dass der Drucker so konfiguriert ist, dass er mit einer neuen Zeile anfängt, wenn er ein <cr>(carriage return, ASCII 13) und ein <LF> (line feed, ASCII 10)- Zeichen empfangen hat, in einer neuen Zeile weiterdruckt. Das Problem lässt sich aber beheben:

Wichtig: Am vorigen Beispiel ist der lpd- Spooler nicht beteiligt, weil wir den Programmoutput nicht zwischengespeichert, sondern direkt an das Druckdevice (/dev/lpt0) geschickt haben.

nach oben

6.2. Konfiguration von »/etc/printcap«

Diese Sektion erklärt, wie der Beispieldrucker konfiguriert wird, um Texte damit zu drucken.

Der Drucker muss in »/etc/printcap« eingetragen sein. Der Eintrag beinhaltet die ID der Druckers (seinen Namen) und seine Beschreibung. Die »lp«- ID wird von vielen Programmen als Defaultwert verwendet.

Beispiel 6-1.:/etc/printcap

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:
    

Das Dateiformat und die Optionen werden im Detail in »printcap(5)« beschrieben. Du solltest wissen, dass wir gerade einen Input- Filter spezifiziert haben (mit der »if«- Option), der das Staircase- Problem nicht beseitigt:

if=/usr/local/libexec/lpfilter
    
Drucktreiber und HP- Drucker:
Beispiel 6-1:
anstelle des »lpd#«(Treiber via Interrupt) benutzt das »lpa#«- Device (Polled Printer) für den Drucker. Die Benutzung von Interrupts sorgt bei einigen Druckern für Kommunikationsprobleme. Der HP Deskjet 690c ist einer davon: Das Drucken geht extrem langsam und bei einer PostScript- Seite kann das schon mal ein paar Stündchen dauern, bis der Apparat seine Arbeit fertig hat. Gelöst wird das Problem mit dem »lpa«- Treiber. Du kannst aber auch einen Kernel kompilieren, in dem lpd immer »polled« läuft.

Der Eintrag in die printcap bescreibt ausserdem wo das Spoolverzeichnis ist, das erstellt werden muss. Dieses Verzeichnis benutzt lpd, um die Daten zu sammeln, die gedruckt werden sollen.

# cd /var/spool/lpd
# mkdir lp
# chown daemon:daemon lp
# chmod 770 lp
    

Der einzige Teil, der fehlt, ist der »lpfilter«, der geschrieben werden muss. Das einzige, was dieser Filter tut, ist, dass er den Drucker so konfiguriert, dass das Staircase- Problem beseitigt wird, bevor der Text zum Drucken abgeschickt wird. Der in unserem Beispiel benutzte Drucker benötigt diesen String, um initialisiert zu werden: »ESC &k2G«. Beispiel 6-2. /usr/local/libexec/lpfilter

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" && cat && exit 0
exit 2

# cd /usr/local/libexec
# chmod 755 lpfilter*
Hinweis: Es gibt da noch einen anderen Filter, der benutzt werden kann:
:if=/usr/libexec/lpr/lpf:
    
Dieser Filter ist weitaus komplexer, als der eben gezeigte. Er wurde geschrieben, um den Output von »nroff« zu verarbeiten und händelt Unterstreichen und Überschreiben, erweitert die Tabulatoren und konvertiert LF nach CR + LF. Die Quelle dieses Filterprogramms findet sich in /usr/src/usr.sbin/lpr/filters/lpf.c.

»lptest« kann jetzt noch einmal ausgeführt werden. Diesmal benutzt er den lpd- Spooler.

# lptest 20 10 | lpr -h
    

Das »lpr«- Programm druckt den Text in den Spooler und schickt die Daten an den Drucker. Mit der »-h«- Option wird der Druck einer Bannerseite ausgeschaltet (Wegen der »sh«- Option in der »/etc/printcap« aber nicht lebensnotwendig).

Du kannst das Staircase- Problem mit Hilfe verschiedener Tools und Methoden lösen, beispielsweise mit C- Programmen. Die präsentierte Lösung hat den Vorteil., dass sie sehr einfach ist.

nach oben

6.3. Die Konfiguration von Ghostscript

Jetzt funktioniert das einfache Drucken. Die Funktionalität des Druckens von Postscript- Dateien kann jetzt dazugefügt werden. Der einfache Drucker in diesem Beispiel unterstützt das Drucken von nativen Postscript- Dateien nicht. Ein Programm, das ein Postscript- Dokument in ein für den Drucker verständliches Format konvertiert, muss her. Das Ghostscript- Programm aus der Packages- Kollektion kann dafür verwendet werden (Siehe Kapitel 8). Diese Sektion erklärt, wie Ghostscript konfiguriert werden muss, um Postscript- Dateien auf dem HP Deskjet 690c auszudrucken.

Eine zweite ID für den Drucker wird in »/etc/printcap« erstellt: Diese neue ID benutzt einen anderen Inputfilter, der Ghostscript aufruft, um den Ausdruck eines gerade aktuellen Postscript- Dokumentes durchzuführen. Danach werden Textdokumente aus dem »lp«- Drucker ausgegeen und Postscript- Dokumente auf dem »ps«- Drucker: Beise Einträge benutzen denselben physikalischen Drucker; aber zwei verschiedene Filter.

Das gleiche Ergebnis kann auch mit anderen Konfigurationen erreicht werden. Als Beispiel kann ein einzelner Eintrag mit einem Filter verwendet werden: Der Filter sollte automatisch das Format der Dokumente erkennen und das geeignete Druckprogramm verwenden. Dieser Weg ist einfacher, aber er führt zu einem komplexeren Filter. Wenn Du willst, solltest Du Dir überlegen, ob Du nicht das »magicfilter«- Programm aus der Packages. Kollektion installierst: Es tut dies und viele andere Dinge automatisch.

Die neue /etc/printcap sieht so aus:

Beispiel 6-3.: »/etc/printcap«

lp|local printer|HP DeskJet 690C:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
        :sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:

ps|Ghostscript driver:\
        :lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
        :mx#0:sh:if=/usr/local/libexec/lpfilter-ps:
    

Option »mx#0« ist für den Ausdruck von Postscript- Dateien sehr wichtig, weil sie die Grössenrestriktionen der Input- Datei eliminiert. Postscript- Dokumente neigen dazu, sehr gross zu sein. Die »if«- Option zeigt auf den neuen Filter. Es gibt ausserdem ein neues Spool- Verzeichnis.

Der letzte Schritt ist das Erstellen des neuen Spoolverzeichnisses und des Filterprogramms.

# cd /var/spool/lpd
# mkdir ps
# chown daemon:daemon ps
# chmod 770 ps
    

Das Filterprogramm für den Postscript- Output ist komplexer als das für die Texte: Mit der Datei, die gedruckt werden soll, wird der Interpreter gefüttert, der in dieser Runde an der Drucker eine Reihe von Kommandos in der Sprache des Druckers schichkt. Wir haben es erreicht, mit Hilfe der Tugenden von NetBSD und ein paar leistungsfähigen Freeware- Paketen, einen billigen Farbdrucker in ein Gerät zu verwandeln, das für den Postscript- Output geeignet ist. Die Optionen, die wir benutzt haben, um Ghostscript zu konfigurieren werden in der Dokumentation beschrieben: »cdj550« ist das Device, mit dem wir den HP- Drucker steuern.

nach oben

Beispiel 6-4. »/usr/local/libexec/lpfilter-ps«

#!/bin/sh
# Treat LF as CR+LF
printf "\033&k2G" || exit 2
# Druck der Postscriptdatei
/usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \
-sOutputFile=- -sPAPERSIZE=a4 - && exit 0
exit 2
    

Zusammenfassung: Wir haben zwei verschiedene Druckernamen auf dem System geschaffen, die beide auf denselben Drucker zeigen, aber verschiedene Optionen verwenden, verschiedene Filter und verschiedene Spoolverzeichnisse. Texte und Postscript- Dokumente können gedruckt werden. Um Postscript- Dokumente zu drucken, muss Ghostscript auf dem System installiert sein.

nach oben

6.4. Druckanagement- Kommandos

In dieser Sektion werden einige nützliche NetBSD- Kommandos für die Drucker- und Druckjobadministration gelistet. Bisher ging es nur um die »lpr«- und »lpd«- Kommandos. Es gibt aber auch noch ein paar andere:
lpq
prüft die Schleife mit den Druckjobs und gibt ihren Inhalt aus
lprm
löscht Druckjobs aus der Warteschleife
lpc
prüft das Drucksystem, schaltet ganze Drucker oder bestimmte Features ein oder aus.

nach oben

6.5. Drucken im Netz

Es ist auch möglich, das Drucksystem so zu konfigurieren, dass ein Ausdruck auch auf einem anderen, entfernten System möglich ist. Sagen wir, dass Du auf dem Host »wotan« arbeitest und auf »loge«, also einem anderen Rechner, drucken willst. Die »/etc/printcap« aud »loge« ist die aus Beispiel 6-3. Es ist möglich, von »Wotan« aus mittels dem Ghostscript auf »loge« in Postscript zu drucken.

Der erste Schritt ist, loge für das Ausdrucken von Druckjobs, die von Wotan kommen, vorzubereiten. Das wird getan, indem eine Zeile mit dem Namen Wotans in der »/etc/hosts.lps«- Datei auf loge eingetragen wird. Das Dateiformat ist sehr einfach: In jeder Zeile steht ein Hostname, der drucken darf.

Als nächsts muss die »/etc/printcap« für das Senden von Druckjobs an loge konfigurert werden. Beispiel:

lp|line printer on loge:\
        :lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
        :rm=loge:rp=lp

ps|Ghostscript driver on loge:\
        :lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\
        :mx#0:\
        :rm=loge:rp=ps
    

Es gibt vier Hauptunterschiede in dieser Konfiguration und der in Beispiel 6-3:

  1. Die Definition von »lp« ist leer.

  2. Der »rm«- Eintrag definiert den Namen des Rechners, an den der Drucker angeschlossen ist.

  3. Der »rp«- Eintrag definiert den Namen des Druckers, der an diesen Rechner angeschlossen ist.

  4. Es ist nicht notwendig, Input- Filter zu spezifizieren, weil die Definitionen auf loge verwendet werden.

Jetzt werden die Druckjobs für »lp« und »ps« von Wotan automatisch an den Drucker, der an loge angeschlossen ist, gesendet.

nach oben


Inhaltsverzeichnis