---
title: Kapitel 9. Drucken
part: Part II. Common Tasks
prev: books/handbook/kernelconfig
next: books/handbook/linuxemu
showBookMenu: true
weight: 12
params:
  path: "/books/handbook/printing/"
---

[[printing]]
= Drucken
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 9
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/handbook/printing/

ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]

ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]

Trotz vieler Versuche es zu vermeiden, ist der Druck von Informationen auf Papier immer noch eine wichtige Funktion. Drucken hat zwei grundlegende Komponenten. Die Daten müssen an den Drucker gesendet werden, und zwar in einer Form, die der Drucker verstehen kann.

[[printing-quick-start]]
== Schnellstart

Die grundlegende Druckfunktion kann schnell eingerichtet werden. Der Drucker muss lediglich fähig sein, normalen ASCII-Text zu drucken. Informationen zum Druck von anderen Dateien finden Sie in <<printing-lpd-filters>>.

[.procedure]
****
. Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge:
+
[source,shell]
....
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
....

. Erstellen Sie als `root` die Datei [.filename]#/etc/printcap# mit folgendem Inhalt:
+
[.programlisting]
....
lp:\
	:lp=/dev/unlpt0:\  <.>
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:lf=/var/log/lpd-errs:
....
+
<.> Diese Zeile ist für einen Drucker, der an einem USB-Port angeschlossen ist.Für einen Drucker, der am parallelen oder "Drucker"-Port angeschlossen ist, verwenden Sie:Für einen Netzwerkdrucker verwenden Sie:Ersetzen Sie _network-printer-name_ durch den DNS-Namen des Netzwerkdruckers.
. Aktivieren Sie `lpd` beim Systemstart, indem Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
+
[.programlisting]
....
lpd_enable="YES"
....
+ 
Starten Sie den Dienst:
+
[source,shell]
....
# service lpd start
Starting lpd.
....
+ 
Drucken Sie eine Testseite:
+
[source,shell]
....
# printf "1. Der Drucker kann drucken.\n2. Dies ist die zweite Zeile.\n" | lpr
....
+
[TIP]
====

Wenn die beiden Zeilen nicht am linken Rand starten und Sie einen "Treppeneffekt" beobachten, lesen Sie <<printing-lpd-filters-stairstep>>.
====
+ 
Mit `lpr` können nun Textdateien gedruckt werden. Geben Sie den Dateinamen auf der Kommandozeile an oder lassen Sie `lpr` von einer Pipe lesen.
+
[source,shell]
....
% lpr textfile.txt
% ls -lh | lpr
....
****

[[printing-connections]]
== Druckerverbindungen

Es gibt eine Vielzahl von Möglichkeiten, einen Drucker mit einem Rechner zu verbinden. Kleine Desktop-Drucker werden in der Regel mit dem USB-Anschluss verbunden, ältere Modelle nutzen oft die parallele Schnittstelle. Einige Drucker sind direkt mit einem Netzwerk verbunden, damit sie leichter von mehreren Rechnern benutzt werden können. Nur noch wenige Drucker verwenden einen seriellen Anschluss.

FreeBSD unterstützt die folgenden Arten von Druckern:

[[printing-connections-usb]]
USB::
USB-Drucker können mit einem freien USB-Anschluss des Rechners verbunden werden.
+
Wenn FreeBSD einen USB-Drucker erkennt, werden zwei Gerätenamen erstellt: [.filename]#/dev/ulpt0# und [.filename]#/dev/unlpt0#. Beide Geräte leiten die Daten an den Drucker weiter. Nach jedem Druckauftrag wird der USB-Anschluss von [.filename]#ultp0# zurückgesetzt. Das Zurücksetzen kann bei einigen Druckern Probleme verursachen, daher wird in der Regel stattdessen [.filename]#unlpt0# verwendet, das den Anschluss nicht zurücksetzt.
[[printing-connections-parallel]]
Prallel (IEEE-1284)::
Die parallele Schnittstelle ist [.filename]#/dev/lpt0#. Der Gerätename erscheint unabhängig davon, ob ein Drucker angeschlossen ist oder nicht. Eine automatische Erkennung findet nicht statt.
+
Die Hersteller haben sich weitgehend von diesem älteren Anschluss verabschiedet und auch viele Rechner haben keine parallele Schnittstelle mehr. Es existieren jedoch Adapter, um einen parallelen Drucker an einem USB-Port anzuschließen. Der Drucker wird dann wie ein USB-Drucker behandelt. Es können auch _Printserver_ verwendet werden, um parallele Drucker direkt mit einem Netzwerk zu verbinden.
[[printing-connections-serial]]
Seriell (RS-232)::
Serielle Anschlüsse sind veraltet und werden außer in Nischenanwendungen nur noch selten verwendet. Die Kabel, Stecker und die erforderliche Verkabelung sind oft sehr unterschiedlich.
+
Der Gerätename für einen seriellen Anschlüsse ist [.filename]#/dev/cuau0# oder [.filename]#/dev/cuau1#. Es können auch USB-Adapter verwendet werden. Diese erscheinen als [.filename]#/dev/cuaU0#.
+
Damit mit dem Drucker kommuniziert werden kann, müssen einige Kommunikationsparameter bekannt sein. Zu den wichtigsten zählen die _Baudrate_ (BPS - Bits pro Sekunde) und die _Parität_. Diese Werte variieren, aber typische serielle Drucker verwenden eine Baudrate von 9600 und keine Parität.
[[printing-connections-network]]
Netzwerk::
Netzwerkdrucker werden direkt mit dem lokalen Netzwerk verbunden.
+
Der DNS-Name des Druckers muss bekannt sein. Wenn dem Drucker eine dynamische Adresse per DHCP zugeteilt wird, sollte das DNS automatisch aktualisiert werden, so dass der Drucker immer die richtige IP-Adresse hat. Um dieses Problem zu vermeiden, werden Netzwerkdruckern häufig statische IP-Adressen zugeteilt.
+
Die meisten Netzwerkdrucker verstehen Druckaufträge, die über das LPD-Protokoll empfangen werden. Sie können auch den Namen der Druckwarteschlange angeben. Einige Drucker verarbeiten die Daten unterschiedlich, je nachdem welche Warteschlange verwendet wird. Zum Beispiel druckt eine `Raw`-Warteschlange die Daten unverändert, während eine `Text`-Warteschlange den Text um Wagenrückläufe ergänzt.
+
Viele Netzwerkdrucker können auch Daten drucken, die direkt an Port 9100 gesendet werden.

[[printing-connections-summary]]
=== Zusammenfassung

Verkabelte Netzwerkdrucker drucken in der Regel am schnellsten und sind einfach einzurichten. Für den direkten Anschluss am Rechner wird USB wegen seiner Geschwindigkeit und Einfachheit bevorzugt. Parallele Verbindungen funktionieren, haben jedoch ihre Begrenzung in Bezug auf Kabellänge und Geschwindigkeit. Serielle Verbindungen sind schwieriger zu konfigurieren und die Verdrahtung unterscheidet sich zwischen den Modellen. Zudem müssen Baudrate und Parität bekannt sein. Glücklicherweise sind serielle Drucker selten geworden.

[[printing-pdls]]
== Gebräuchliche Seitenbeschreibungssprachen

Daten, die an einen Drucker gesendet werden, müssen in einer Sprache verfasst sein, die der Drucker verstehen kann. Diese Sprachen werden Seitenbeschreibungssprachen oder Page Description Languages (PDL) genannt.
[[print-pdls-ascii]]
ASCII::
Schlichter ASCII-Text ist die einfachste Möglichkeit, um Daten an einen Drucker zu senden. Die Zeichen werden eins zu eins gedruckt: ein `A` in den Daten erscheint beim Druck als `A` auf dem Papier. Eine Formatierung ist nur bedingt verfügbar und es gibt keine Möglichkeit, eine Schriftart oder eine bestimmte Laufweite zu wählen. Die Einfachheit von schlichtem ASCII-Text bedeutet, dass Text ohne bzw. wenig Codierung oder Übersetzung gedruckt werden kann. Die gedruckte Ausgabe entspricht dem, was an den Drucker gesendet wurde.
+
Einige kostengünstige Drucker können keinen einfachen ASCII-Text drucken. Das macht sie in der Regel schwieriger einzurichten.
[[print-pdls-postscript]]
PostScript(R)::
PostScript(R) ist fast das Gegenteil von ASCII. Anstelle von einfachem Text, besteht ein PostScript(R)-Programm aus einer Reihe von Anweisungen, die das endgültige Dokument generieren. Es können auch verschiedene Schriften und Grafiken benutzt werden. Diese Fähigkeiten haben jedoch ihren Preis. Das Programm, das die Seite generiert, muss zunächst erzeugt werden. Normalerweise wird dieses Programm durch die Anwendung erzeugt, so dass der Prozess für den Benutzer transparent bleibt.
+
Kostengünstige Drucker sind manchmal nicht kompatibel mit PostScript(R).

[[print-pdls-pcl]]
PCL (Printer Command Language)::
PCL ist eine Erweiterung von ASCII. Es enthält Escape-Sequenzen für die Formatierung, Schriftauswahl und das Drucken von Grafiken. Viele Drucker bieten Unterstützung für PCL5, einige unterstützen auch das neuere PCL6 oder PCLXL. Die neueren Versionen sind Kombinationen von PCL5 und bieten eine schnellere Druckgeschwindigkeit.
[[print-pdls-host-based]]
Host-basiert::
Hersteller können die Kosten eines Druckers reduzieren, indem sie einen einfachen Prozessor und etwas Speicher verbauen. Diese Drucker sind nicht in der Lage normalen Text zu drucken. Stattdessen werden die Texte und Grafiken von einem Treiber auf dem Host-Rechner generiert und dann an den Drucker gesendet. Diese Drucker werden Host-basierte Drucker genannt.
+
Die Kommunikation zwischen dem Treiber und dem Drucker wird oft durch proprietäre oder nicht dokumentierte Protokolle realisiert, weshalb sie nur mit den gängigsten Betriebssystemen funktionieren.

[[print-pdls-table]]
=== PostScript(R) in eine andere Sprache konvertieren

Viele Anwendungen aus der Ports-Sammlung und FreeBSD Werkzeuge können PostScript(R) erzeugen. Die folgende Tabelle listet die verfügbaren Programme, um PostScript(R) in andere PDLs zu konvertieren:

[[printing-pdls-ps-to-other-tbl]]
.Ausgabe PDLs
[cols="20%,20%,60%", options="header"]
|===
<| Ausgabe PDL
<| Generiert von
<| Hinweis

|PCL oder PCL5
|package:print/ghostscript9-base[]
|`-sDEVICE=ljet4` für Schwarzweiß, `-sDEVICE=cljet5` für Farbe

|PCLXL oder PCL6
|package:print/ghostscript9-base[]
|`-sDEVICE=pxlmono` für Schwarzweiß, `-sDEVICE=pxlcolor` für Farbe

|ESC/P2
|package:print/ghostscript9-base[]
|`-sDEVICE=uniprint`

|XQX
|package:print/foo2zjs[]
|
|===

[[print-pdls-summary]]
=== Zusammenfassung

Um die Konfiguration einfach zu halten, wählen Sie einen Drucker, der PostScript(R) oder auch PCL unterstützt. Mit package:print/ghostscript9-base[] können diese Drucker PostScript(R) nativ verstehen. Wenn der Drucker PostScript(R) oder PCL direkt unterstützt, können Sie auch sofort einfache ASCII-Textdateien drucken.

Zeilenbasierte Drucker wie Tintenstrahldrucker unterstützen in der Regel kein PostScript(R) oder PCL. Dennoch können Sie ASCII-Textdateien drucken. package:print/ghostscript9-base[] unterstützt die Sprachen dieser Drucker. Jedoch ist der Druck von Grafiken auf diesen Druckern oft sehr langsam, da aufgrund der großen Menge an Daten übertragen und ausgedruckt werden müssen.

Host-basierte Drucker sind oft schwieriger einzurichten. Einige Drucker können überhaupt nicht benutzt werden, da sie proprieräte PDLs verwerden. Solche Drucker sollten Sie nach Möglichkeit vermeiden.

Die Beschreibungen vieler PDLs finden Sie auf http://www.undocprint.org/formats/page_description_languages[]. Spezielle PDLs, die von einigen Druckern verwendet werden finden Sie auf http://www.openprinting.org/printers[].

[[printing-direct]]
== Direktes Drucken

Für den gelegentlichen Druck können die Dateien auch direkt, ohne zusätzliche Einstellungen, an den Drucker gesendet werden. Zum Beispiel kann die Datei [.filename]#sample.txt# direkt an einen USB-Drucker gesendet werden:

[source,shell]
....
# cp sample.txt /dev/unlpt0
....

Ob Sie direkt auf einen Netzwerkdrucker drucken können, hängt von den Fähigkeiten des Druckers ab. Die meisten akzeptieren jedoch Druckaufträge auf Port 9100, die Sie mit man:nc[1] an den Drucker senden können. So drucken Sie die gleiche Datei auf einem Drucker mit dem DNS-Namen _netlaser_:

[source,shell]
....
# nc netlaser 9100 < sample.txt
....

[[printing-lpd]]
== LPD (Line Printer Daemon)

Drucken im Hintergrund wird _Spooling_ genannt. Ein Spooler (Warteschlange) ermöglicht es dem Benutzer die Programme auf dem Rechner fortzusetzen, ohne warten zu müssen bis der Druckauftrag abgeschlossen ist.

FreeBSD enthält den Spooler namens man:lpd[8]. Druckaufträge werden mit man:lpr[1] übermittelt.

[[printing-lpd-setup]]
=== Konfiguration

Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge und setzen Sie die Berechtigungen auf diesem Verzeichnis, damit der Inhalt der Druckaufträge nicht von anderen Benutzern eingesehen werden kann:

[source,shell]
....
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
....

Drucker werden in [.filename]#/etc/printcap# angelegt. Ein Eintrag für einen Drucker enthält dessen Name, Anschluss sowie weitere Einstellungen. Erstellen Sie [.filename]#/etc/printcap# mit folgendem Inhalt:

[.programlisting]
....
lp:\				<.>
	:lp=/dev/unlpt0:\	<.>
	:sh:\			<.>
	:mx#0:\			<.>
	:sd=/var/spool/lpd/lp:\	<.>
	:lf=/var/log/lpd-errs:	<.>
....

<.> Der Name des Druckers. man:lpr[1] sendet Druckaufträge an den Drucker `lp`, es sei denn, ein anderer Drucker wird mit der Option `-P` angegeben. Der Standarddrucker sollte also `lp` genannt werden.
<.> Der Anschluss, über den der Drucker verbunden ist. Ersetzen Sie diese Zeile mit dem entsprechenden, hier aufgeführten Verbindungstyp.
<.> Unterdrückt das Drucken eines Deckblattes zu Beginn des Druckauftrags.
<.> Die maximale Größe des Druckauftrags wird nicht begrenzt.
<.> Das Verzeichnis zur Speicherung der Druckdaten. Jeder Drucker verwendet ein eigenes Verzeichnis.
<.> Die Logdatei, in welche die Fehler des Druckers geschrieben werden.

Nachdem Sie [.filename]#/etc/printcap# erstellt haben, verwenden Sie man:chkprintcap[8] um die Datei auf Fehler zu testen:

[source,shell]
....
# chkprintcap
....

Beheben Sie alle gemeldeten Fehler, bevor Sie fortfahren.

Aktivieren Sie man:lpd[8] in [.filename]#/etc/rc.conf#:

[.programlisting]
....
lpd_enable="YES"
....

Starten Sie den Dienst:

[source,shell]
....
# service lpd start
....

[[printing-lpd-lpr]]
=== Drucken mit man:lpr[1]

Mit `lpr` werden Dokumente an den Drucker geschickt. Die Datei können Sie auf der Kommandozeile angeben, oder über eine Pipe an `lpr` schicken. Die beiden folgenden Kommandos sind gleichwertig, sie schicken den Inhalt von [.filename]#doc.txt# an den Standarddrucker:

[source,shell]
....
% lpr doc.txt
% cat doc.txt | lpr
....

Drucker können auch mit `-P` ausgewählt werden. Um auf einen Drucker namens _laser_ zu drucken:

[source,shell]
....
% lpr -Plaser doc.txt
....

[[printing-lpd-filters]]
=== Filter

In den bisher gezeigten Beispielen wurde lediglich eine Textdatei an den Drucker gesendet. Solange der Drucker den Inhalt dieser Dateien versteht, wird die Ausgabe korrekt gedruckt werden.

Einige Drucker sind nicht in der Lage einfachen Text zu drucken. Es kann sogar sein, das die Eingabedatei gar keinen Text enthält.

Mit Hilfe von _Filtern_ können Dateien übersetzt oder verarbeitet werden. Ein typischer Anwendungsfall ist die Umwandlung der Eingabedaten in ein Format, das der Drucker verstehen kann, wie bspw. PostScript(R) oder PCL. Filter können auch verwendet werden um zusätzliche Funktionen hinzuzufügen, wie bspw. Seitenzahlen oder das Hervorheben von Quellcode, um die Lesbarkeit zu verbessern.

Die hier beschriebenen Filter werden _Eingabefilter_ oder auch _Textfilter_ genannt. Diese Filter übersetzen die eingehende Datei in verschiedene Formen. Werden Sie mit man:su[1] zu `root`, bevor Sie die Dateien erstellen.

Filter werden in [.filename]#/etc/printcap# mit der Kennung `if=` festgelegt. Um [.filename]#/usr/local/libexec/lf2crlf# als Filter einzusetzen, bearbeiten Sie [.filename]#/etc/printcap# wie folgt:

[.programlisting]
....
lp:\
	:lp=/dev/unlpt0:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/lp:\
	:if=/usr/local/libexec/lf2crlf:\   <.>
	:lf=/var/log/lpd-errs:
....

<.> `if=` identifiziert den Eingangsfilter, der auf den eingehenden Text angewendet werden soll.

[TIP]
====

Der Backslash am Ende der Zeilen zeigt an, das ein Eintrag für einen Drucker wirklich nur eine Zeile ist, in der die einzelnen Einträge durch einen Doppelpunkt getrennt sind. Das Beispiel hätte man auch wie folgt schreiben können:

[.programlisting]
....
lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:
....

====

[[printing-lpd-filters-stairstep]]
==== Den Treppeneffekt verhindern

Typische Textdateien enthalten einen Zeilenvorschub am Ende jeder Zeile. Diese Zeilen erzeugen auf dem Drucker einen "Treppeneffekt":

[.programlisting]
....
A printed file looks
                    like the steps of a staircase
                                                 scattered by the wind
....

Ein Filter kann Zeilenumbrüche in Wagenrückläufe und Zeilenumbrüche konvertieren. Erstellen Sie [.filename]#/usr/local/libexec/lf2crlf# mit folgendem Inhalt:

[.programlisting]
....
#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"
....

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

[source,shell]
....
# chmod 555 /usr/local/libexec/lf2crlf
....

Passen Sie [.filename]#/etc/printcap# an, so dass der neue Filter verwendet wird:

[.programlisting]
....
:if=/usr/local/libexec/lf2crlf:\
....

Drucken Sie nochmal die gleiche Datei, um den Filter zu testen.

[[printing-lpd-filters-enscript]]
==== Mit package:print/enscript[] normalen Text auf PostScript(R)-Druckern drucken

GNUEnscript wandelt Textdateien in formatiertes PostScript(R) um, die dann auf PostScript(R)-Druckern gedruckt werden können. Das Programm fügt auch Seitenzahlen und Zeilenumbrüche hinzu und stellt andere Funktionen bereit, um gedruckte Textdateien besser lesbar zu machen. Abhängig vom Papierformat können Sie entweder package:print/enscript-letter[] oder package:print/enscript-a4[] aus der Ports-Sammlung installieren.

Erstellen Sie [.filename]#/usr/local/libexec/enscript# mit diesem Inhalt:

[.programlisting]
....
#!/bin/sh
/usr/local/bin/enscript -o -
....

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

[source,shell]
....
# chmod 555 /usr/local/libexec/enscript
....

Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:

[.programlisting]
....
:if=/usr/local/libexec/enscript:\
....

Testen Sie den Filter, indem Sie eine einfache Textdatei drucken.

[[printing-lpd-filters-ps2pcl]]
==== PostScript(R) auf PCL-Druckern drucken

Viele Programme erzeugen PostScript(R)-Dokumente. Allerdings können kostengünstige Drucker oft nur Textdateien oder PCL verstehen. Dieser Filter wandelt PostScript(R)-Dateien in PCL um, bevor die Datei an den Drucker geschickt wird. Installieren Sie den Ghostscript PostScript(R) Interpreter package:print/ghostscript9-base[] aus der Ports-Sammlung.

Erstellen Sie [.filename]#/usr/local/libexec/ps2pcl# mit diesem Inhalt:

[.programlisting]
....
#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -
....

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

[source,shell]
....
# chmod 555 /usr/local/libexec/ps2pcl
....

Die PostScript(R)-Eingabe wird von dem Skript erst in PCL umgewandelt, bevor es an den Drucker geschickt wird.

Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:

[.programlisting]
....
:if=/usr/local/libexec/ps2pcl:\
....

Testen Sie den Filter mit einem kleinen PostScript(R)-Programm.

[source,shell]
....
% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr
....

[[printing-lpd-filters-smart]]
==== Intelligente Filter

Ein Filter kann sehr nützlich sein, wenn er die Eingabe erkennt und sie automatisch in ein für den Drucker verständliches Format umwandelt. Die ersten beiden Zeichen in einer PostScript(R)-Datei sind in der Regel `%!`. Ein Filter ist in der Lage diese beiden Zeichen zu erkennen. PostScript(R)-Dateien können unverändert an einen PostScript(R)-Drucker geschickt werden. Textdateien können, wie eben gezeigt, mit Enscript in PostScript(R) umgewandelt werden. Erstellen Sie [.filename]#/usr/local/libexec/psif# mit diesem Inhalt:

[.programlisting]
....
#!/bin/sh
#
#  psif - Print PostScript or plain text on a PostScript printer
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`

case "$first_two_chars" in
%!)
    # %! : PostScript job, print it.
    echo "$first_line" && cat && exit 0
    exit 2
    ;;
*)
    # otherwise, format with enscript
    ( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
    exit 2
    ;;
esac
....

Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:

[source,shell]
....
# chmod 555 /usr/local/libexec/psif
....

Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:

[.programlisting]
....
:if=/usr/local/libexec/psif:\
....

Um den Filter zu testen, drucken Sie PostScript(R)- und einfache Textdateien.

[[printing-lpd-queues]]
=== Mehrere Warteschlangen

Die Einträge in [.filename]#/etc/printcap# sind nichts anderes als Definitionen von Warteschlangen. Für jeden Drucker können eine oder mehrere Warteschlangen definiert werden. Kombiniert mit Filtern bieten mehrere Warteschlangen eine bessere Kontrolle über die Druckaufträge.

Als Beispiel dient ein vernetzter PostScript(R)-Laserdrucker in einem Büro. Die meisten Benutzer möchten einfache Textdateien drucken, aber ein paar fortgeschrittene Anwender sollen in der Lage sein, PostScript(R)-Dateien direkt zu drucken. Hierfür werden zwei Einträge für den Drucker in [.filename]#/etc/printcap# erstellt:

[.programlisting]
....
textprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/textprinter:\
	:if=/usr/local/libexec/enscript:\
	:lf=/var/log/lpd-errs:

psprinter:\
	:lp=9100@officelaser:\
	:sh:\
	:mx#0:\
	:sd=/var/spool/lpd/psprinter:\
	:lf=/var/log/lpd-errs:
....

Dokumente, die zum `textprinter` geschickt werden, werden wie im vorherigen Beispiel durch den Filter [.filename]#/usr/local/libexec/enscript# formatiert. Fortgeschrittene Anwender können PostScript(R)-Dateien direkt auf dem Drucker `psprinter` drucken, wo keine Filterung stattfindet.

Mit mehreren Warteschlangen können Sie einen direkten Zugriff auf alle Arten von Druckerfunktionen zur Verfügung stellen. Ein Duplex-Drucker könnte zwei Warteschlangen verwenden, eine für den gewöhnlichen Druck und eine für den Duplexdruck.

[[printing-lpd-monitor]]
=== Druckaufträge steuern und überwachen

Es stehen verschiedene Programme zur Verfügung um Druckaufträge zu überwachen und den Druckbetrieb zu steuern.

[[printing-lpd-monitor-lpq]]
==== man:lpq[1]

man:lpq[1] zeigt den Status der Druckaufträge des Benutzers an. Druckaufträge anderer Benutzer werden nicht angezeigt.

Dieser Befehl zeigt die anstehenden Druckaufträge eines Benutzers für einen Drucker an:

[source,shell]
....
% lpq -Plp
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     0    (standard input)                      12792 bytes
....

Der folgende Befehl zeigt die anstehenden Druckaufträge eines Benutzers für alle Drucker an:

[source,shell]
....
% lpq -a
lp:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     1    (standard input)                      27320 bytes

laser:
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     287  (standard input)                      22443 bytes
....

[[printing-lpd-monitor-lprm]]
==== man:lprm[1]

Mit man:lprm[1] können Druckaufträge gelöscht werden. Normale Benutzer dürfen lediglich ihre eigenen Aufträge löschen. `root` kann hingegen jeden beliebigen Auftrag löschen.

Dieser Befehl löscht alle anstehenden Druckaufträge eines Druckers:

[source,shell]
....
# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued
....

Mit dem folgenden Befehl löschen Sie einen bestimmten Druckauftrag. Benutzen Sie man:lpq[1], um die Nummer des Auftrags zu finden.

[source,shell]
....
% lpq
Rank   Owner      Job  Files                                 Total Size
1st    jsmith     5    (standard input)                      12188 bytes
% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued
....

[[printing-lpd-monitor-lpc]]
==== man:lpc[8]

Mit man:lpc[8] kann der Druckerstatus überprüft und verändert werden. `lpc` wird zusammen mit einem Kommando und optional mit einem Druckernamen aufgerufen. Mit `all` können alle Drucker angesprochen werden, auf denen das Kommando ausgeführt werden soll. Normale Benutzer können sich den Status mit man:lpc[8] ansehen. Nur `root` darf Kommandos ausführen, die den Status des Druckers verändern.

Dieser Befehl zeigt den Status von allen Druckern an:

[source,shell]
....
% lpc status all
lp:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	printer idle
laser:
	queuing is enabled
	printing is enabled
	1 entry in spool area
	waiting for laser to come up
....

Der Drucker kann die Annahme neuer Druckaufträge verweigern. Anschließend sollen Aufträge wieder akzeptiert werden:

[source,shell]
....
# lpc stop lp
lp:
	printing disabled
# lpc start lp
lp:
	printing enabled
	daemon started
....

Starten Sie den Drucker nach einem Fehler neu:

[source,shell]
....
# lpc restart lp
lp:
	no daemon to abort
	printing enabled
	daemon restarted
....

Schalten Sie die Warteschlange aus und deaktivieren Sie den Druck. Sie können den Benutzern gleichzeitig eine Nachricht hinterlassen:

[source,shell]
....
# lpc down lp Ersatzteile werden am Montag ankommen
lp:
	printer and queuing disabled
	status message is now: Ersatzteile werden am Montag ankommen
....

Reaktivieren Sie den Drucker:

[source,shell]
....
# lpc up lp
lp:
	printing enabled
	daemon started
....

Weitere Kommandos und Optionen finden Sie in man:lpc[8].

[[printing-lpd-shared]]
=== Gemeinsam genutzte Drucker

In Unternehmen und Schulen werden Drucker häufig von mehreren Benutzern genutzt. Es werden zusätzliche Funktionen angeboten, um die gemeinsame Nutzung von Druckern zu erleichtern.

[[printing-shared-aliases]]
==== Aliase

Der Druckername wird in der ersten Zeile von [.filename]#/etc/printcap# festgelegt. Weitere Namen oder _Aliase_ können nach dem Druckernamen hinzugefügt werden. Aliase werden vom Namen durch das Pipe-Zeichen `|` getrennt:

[.programlisting]
....
lp|repairsprinter|salesprinter:\
....

Anstelle des Druckernamens können Aliase verwendet werden. Zum Beispiel können Mitarbeiter der Verkaufsabteilung wie folgt auf ihren Drucker drucken:

[source,shell]
....
% lpr -Psalesprinter sales-report.txt
....

Mitarbeiter der Reparaturabteilung drucken auf dem Drucker mit:

[source,shell]
....
% lpr -Prepairsprinter repairs-report.txt
....

Alle Dokumente werden auf diesem einen Drucker gedruckt. Wenn die Verkaufsabteilung größer wird und die Abteilung einen eigenen Drucker benötigt, kann der Alias entfernt und für einen neuen Drucker verwendet werden. Die Mitarbeiter in beiden Abteilungen benutzen zum Drucken weiterhin die gleichen Befehle, nur dass die Aufträge der Verkaufsabteilung jetzt zum neuen Drucker gesendet werden.

[[printing-shared-headers]]
==== Deckblätter

Bei einem viel benutzten Drucker kann es für die Anwender schwierig sein, ihre Dokumente in einem großen Papierstapel wiederzufinden. Um dieses Problem zu lösen, können _Deckblätter_ verwendet werden. Dabei wird vor jedem Druckauftrag ein Deckblatt mit dem Benutzernamen und dem Dokumentnamen gedruckt. Deckblätter werden manchmal auch als _Banner_ oder _Trennseite_ bezeichnet.

Das Aktivieren der Deckblätter hängt davon ab, ob der Drucker direkt über ein USB, paralleles oder serielles Kabel, oder über ein Netzwerk mit dem Rechner verbunden ist.

Wenn der Drucker direkt verbunden ist, aktivieren Sie die Deckblätter durch Entfernen der Zeile `:sh:\` (Supress Header) in [.filename]#/etc/printcap#. Diese Deckblätter verwenden lediglich einen Zeilenvorschub für neue Zeilen. Einige Drucker benötigen den Filter [.filename]#/usr/shared/examples/printing/hpif# um den Treppeneffekt zu vermeiden. Der Filter konfiguriert PCL-Drucker so, dass sowohl Zeilenumbrüche als auch Zeilenvorschübe verwendet werden, wenn ein Zeilenvorschub empfangen wird.

Für Netzwerkdrucker müssen Deckblätter auf dem Drucker selbst konfiguriert werden, da Einträge für Deckblätter in [.filename]#/etc/printcap# ignoriert werden. Die Einstellungen sind über einen Webbrowser zugänglich und stehen in der Regel auf der Hauptseite der Konfigurations-Webseite zur Verfügung.

[[printing-lpd-references]]
=== Referenzen

Beispieldateien: [.filename]#/usr/shared/examples/printing/#.

Das _4.3BSD Line Printer Spooler Manual_, [.filename]#/usr/shared/doc/smm/07.lpd/paper.ascii.gz#.

Manualpages: man:printcap[5], man:lpd[8], man:lpr[1], man:lpc[8], man:lprm[1], man:lpq[1].

[[printing-other]]
== Andere Drucksysteme

Neben dem in FreeBSD enthaltenen man:lpd[8] existieren noch weitere Drucksysteme. Diese Systeme bieten zusätzliche Funktionen und Unterstützung für andere Protokolle.

[[printing-other-cups]]
=== CUPS (Common UNIX(R) Printing System)

CUPS ist ein beliebtes Drucksystem, das für viele Betriebssysteme erhältlich ist. CUPS unter FreeBSD wird in einem separaten Artikel beschrieben: extref:{cups}[CUPS on FreeBSD].

[[printing-other-hplip]]
=== HPLIP

Hewlett Packard stellt ein Drucksystem zur Verfügung, das viele ihrer Drucker unterstützt. Der Port heißt package:print/hplip[]. Die Webseite befindet sich unter http://hplipopensource.com/hplip-web/index.html[]. Der FreeBSD-Port kümmert sich um alle Details während der Installation. Informationen zur Konfiguration finden Sie unter http://hplipopensource.com/hplip-web/install/manual/hp_setup.html[].

[[printing-other-lprng]]
=== LPRng

LPRng wurde als eine verbesserte Alternative zu man:lpd[8] entwickelt. Der Port heißt package:sysutils/LPRng[]. Weitere Informationen und Dokumentation finden Sie unter https://lprng.sourceforge.net/[].
