<?xml version="1.0" encoding="iso-8859-1"?> <!-- The FreeBSD Documentation Project The FreeBSD German Documentation Project $FreeBSD$ $FreeBSDde: de-docproj/books/handbook/printing/chapter.xml,v 1.56 2012/02/16 20:07:18 bcr Exp $ basiert auf: 1.124 --> <chapter id="printing"> <chapterinfo> <authorgroup> <author> <firstname>Sean</firstname> <surname>Kelly</surname> <contrib>Beigetragen von </contrib> </author> <!-- 30 Sept 1995 --> </authorgroup> <authorgroup> <author> <firstname>Jim</firstname> <surname>Mock</surname> <contrib>Restrukturiert und aktualisiert durch </contrib> <!-- Mar 2000 --> </author> </authorgroup> <authorgroup> <author> <firstname>Stefan</firstname> <surname>Bethke</surname> <contrib>Übersetzt von </contrib> <!-- Jan 2003 --> </author> </authorgroup> </chapterinfo> <title>Drucken</title> <sect1 id="printing-synopsis"> <title>Übersicht</title> <indexterm> <primary>LPD spooling system</primary> </indexterm> <indexterm> <primary>drucken</primary> </indexterm> <para>Mit &os; können Sie viele unterschiedliche Drucker benutzen, von den ältesten Nadeldruckern bis zu den neuesten Laserdruckern, und allen möglichen Geräten dazwischen. Auf diese Weise können Sie hochwertige Ausdrucke mit Ihren Programmen erzeugen.</para> <para>Sie können &os; auch so konfigurieren, dass es Druckaufträge von anderen Computern über Ihr lokales Netzwerk entgegennimmt, seien es &windows;-, &macos;- oder andere &os;-Computer. &os; stellt sicher, dass die Druckaufträge in der richtigen Reihenfolge bearbeitet werden und kann optional ein Deckblatt mit dem Namen des Auftraggebers eines Druckauftrags aufgeben. &os; kann auch Statistiken über die Computer und Benutzer führen, die Ausdrucke in Auftrag geben.</para> <para>In diesem Kapitel erfahren Sie, wie Sie:</para> <itemizedlist> <listitem> <para>&os;-Druckerwarteschlangen einrichten.</para> </listitem> <listitem> <para>Druckfilter installieren, die Druckaufträge je nach Bedarf besonders behandeln und z.B. Dokumente automatisch in eine Form umwandeln, die Ihr Drucker versteht.</para> </listitem> <listitem> <para>Druckaufträge mit einem Deckblatt versehen können.</para> </listitem> <listitem> <para>Mit einem Drucker drucken können, der an einen anderen Computer angeschlossen ist.</para> </listitem> <listitem> <para>Mit einem Drucker drucken können, der direkt an das Netzwerk angeschlossen ist.</para> </listitem> <listitem> <para>die Größe von Druckaufträgen beschränken können, oder bestimmte Benutzer von den Benutzung des Drucksystems ausschließen können.</para> </listitem> <listitem> <para>Statistiken aufzeichnen und die Benutzung des Drucksystems nach Benutzern und Computern aufschlüsseln können.</para> </listitem> <listitem> <para>Probleme beim Drucken diagnostizieren und beheben können.</para> </listitem> </itemizedlist> <para>Bevor Sie dieses Kapitel lesen:</para> <itemizedlist> <listitem> <para>Machen Sie sich mit der Konfiguration und Installation eines neuen Kernels vertraut (<xref linkend="kernelconfig"/>).</para> </listitem> </itemizedlist> </sect1> <sect1 id="printing-intro-spooler"> <title>Einführung</title> <para>Um einen Drucker mit &os; zu benutzen, können Sie das Berkeley Line Printer Spooling System, das auch als <application>LPD</application>-Drucksystem oder nur als <application>LPD</application> bekannt ist, verwenden. Dieses System zur Verwaltung von Druckaufträgen ist das Standardsystem in &os;. Dieses Kapitel führt Sie in <application>LPD</application> und dessen Konfiguration ein.</para> <para>Wenn Sie bereits mit <application>LPD</application> oder einem anderen Drucksystem vertraut sind, können Sie direkt im Abschnitt <link linkend="printing-intro-setup">Einfache Drucker-Konfiguration</link> weiterlesen.</para> <para><application>LPD</application> steuert alle Aspekte rund um die Drucker, die an den Computer angeschlossen sind. Es ist verantwortlich für:</para> <itemizedlist> <listitem> <para>Die Zugriffskontrolle für direkt und über das Netzwerk angeschlossene Drucker.</para> </listitem> <listitem> <indexterm> <primary>Druckaufträge</primary> </indexterm> <para>Die Entgegennahme von Dateien, die gedruckt werden sollen; eine so an das Drucksystem übergebene Datei wird als <emphasis>Druckauftrag</emphasis> bezeichnet.</para> </listitem> <listitem> <para>Den gleichzeitigen Zugriff von mehreren Benutzern auf einen Drucker. Alle Druckaufträge werden in einer <emphasis>Druckerwarteschlange</emphasis> gesammelt, und nacheinander abgearbeitet.</para> </listitem> <listitem> <para>Den Druck von <emphasis>Deckblättern</emphasis> (auch als <emphasis>Banner-</emphasis> oder <emphasis>Burst-</emphasis>Seiten bezeichnet), damit Benutzer ihre Druckaufträge schnell innerhalb eines Stapels von ausgedruckten Dokumenten finden können.</para> </listitem> <listitem> <para>Das Einstellen der korrekten Kommunikations-Parameter für Drucker, die seriell angeschlossen sind.</para> </listitem> <listitem> <para>Das Senden von Druckaufträgen an ein <application>LPD</application>-System auf einem anderen Computer.</para> </listitem> <listitem> <para>Das Ausführen von speziellen Filtern, um Druckaufträge in die unterschiedlichen Seitenbeschreibungssprachen umzusetzen oder an die Fähigkeiten eines Druckers anzupassen.</para> </listitem> <listitem> <para>Das Erfassen von Verrechnungsdaten für Druckaufträge.</para> </listitem> </itemizedlist> <para>Sie können <application>LPD</application> alle diese Funktionen, oder auch nur einen Teil davon, ausführen lassen, indem Sie die Konfigurationsdatei (<filename>/etc/printcap</filename>) anpassen, und indem Sie spezielle Filterprogramme bereitstellen.</para> <sect2 id="printing-intro-why"> <title>Vorteile des Drucksystems</title> <para>Wenn Sie der einzige Benutzer sind, der mit Ihrem Computer arbeitet, fragen Sie sich vielleicht, warum Sie die Konfigurationsarbeit für das Drucksystem auf sich nehmen sollten, wenn Sie Deckblätter, Abrechnungsdaten oder Zugriffskontrolle nicht benötigen. Obwohl Sie direkt auf den Drucker zugreifen können, bietet <application>LPD</application> eine Reihe von Vorteilen: </para> <itemizedlist> <listitem> <para><application>LPD</application> druckt im Hintergrund; Sie müssen nicht erst darauf warten, dass Ihr Druckauftrag an den Drucker übermittelt worden ist.</para> </listitem> <listitem> <indexterm> <primary>&tex;</primary> </indexterm> <para><application>LPD</application> kann Druckaufträge mit Kopf- oder Fußzeilen versehen, oder ein spezielles Dateiformat, wie DVI von &tex;, automatisch in ein für den Drucker verständliches Format umwandeln; Sie müssen diese Schritte nicht manuell ausführen.</para> </listitem> <listitem> <para>Viele freie und kommerzielle Programme, mit denen Sie drucken können, erwarten, mithilfe des <application>LPD</application>-Drucksystems zu drucken. Wenn Sie das Drucksystem konfiguriert haben, können Sie einfacher mit neuer oder auch vorhandener Software drucken.</para> </listitem> </itemizedlist> </sect2> </sect1> <sect1 id="printing-intro-setup"> <title>Grund-Konfiguration</title> <warning> <para>Mit &os; 8.0 wurden die Gerätedateien für serielle Ports von <filename>/dev/ttyd<replaceable>N</replaceable></filename> in <filename>/dev/ttyu<replaceable>N</replaceable></filename> umbenannt. Setzen Sie noch &os; 7.X ein, müssen Sie die Befehle in den folgenden Abschnitten entsprechend anpassen.</para> </warning> <para>Um einen Drucker mit dem <application>LPD</application>-Drucksystem benutzen zu können, müssen Sie sowohl Ihren Drucker und die Drucker-Schnittstelle als auch das <application>LPD</application>-Drucksystem konfigurieren. Dieser Abschnitt beschreibt zwei Konfigurationen:</para> <itemizedlist> <listitem> <para>Abschnitt <link linkend="printing-simple">Einfache Drucker-Konfiguration</link> beschreibt, wie Sie einen Drucker an Ihren Computer anschließen und <application>LPD</application> so konfigurieren, dass Sie Textdateien zum Drucker senden können.</para> </listitem> <listitem> <para>Abschnitt <link linkend="printing-advanced">Erweiterte Drucker-Konfiguration</link> beschreibt, wie Sie mit speziellen Dateiformaten umgehen können, wie Sie Deckblätter drucken können, wie Sie den Zugriff auf Drucker einschränken können, und wie Sie Verrechnungsdaten aufzeichnen können.</para> </listitem> </itemizedlist> <sect2 id="printing-simple"> <title>Einfache Drucker-Konfiguration</title> <para>Dieser Abschnitt beschreibt, wie Sie die <application>LPD</application>-Software konfigurieren, um Ihren Drucker zu benutzen. Diese Grundlagen werden erklärt:</para> <itemizedlist> <listitem> <para>Abschnitt <link linkend="printing-hardware">Hardware-Konfiguration</link> erläutert, wie Sie Ihren Drucker an Ihren Computer anschließen können.</para> </listitem> <listitem> <para>Abschnitt <link linkend="printing-software">Software-Konfiguration</link> erklärt, wie Sie die <application>LPD</application>-Konfigurationsdatei (<filename>/etc/printcap</filename>) anpassen.</para> </listitem> </itemizedlist> <para>Wenn Sie einen Drucker einrichten möchten, der über das Netzwerk angeschlossen ist (anstatt über die serielle oder parallele Schnittstelle), lesen Sie bitte Abschnitt <link linkend="printing-advanced-network-net-if">Drucker mit direkter TCP-Schnittstelle</link>.</para> <para>Obwohl dieser Abschnitt <quote>Grund-Konfiguration</quote> heißt, ist die Konfiguration relativ komplex. Es ist vergleichsweise schwierig, einen Drucker mit Ihrem Computer und dem <application>LPD</application>-Drucksystem zu verbinden. Die weiteren Optionen, wie Kopfzeilen oder Deckblätter, sind einfach zu konfigurieren, sobald die Grund-Konfiguration erfolgreich abgeschlossen ist.</para> <sect3 id="printing-hardware"> <title>Hardware-Konfiguration</title> <para>Dieser Abschnitt beschreibt, über welche Schnittstellen Sie einen Drucker mit Ihrem Computer verbinden können. Er behandelt sowohl die Schnittstellen und Kabel, als auch die Kerneloptionen, die Sie benötigen, um &os; mit Ihrem Drucker kommunizieren zu lassen.</para> <para>Wenn Sie Ihren Drucker bereits erfolgreich mit einem anderen Betriebssystem auf Ihrem PC eingesetzt haben, können Sie wahrscheinlich mit dem Abschnitt <link linkend="printing-software">Software-Konfiguration</link> fortfahren.</para> <sect4 id="printing-ports"> <title>Schnittstellen und Kabel</title> <para>Praktisch alle Drucker unterstützen mindestens eine dieser Schnittstellen:</para> <itemizedlist> <listitem> <indexterm> <primary>Drucker</primary> <secondary>serielle</secondary> </indexterm> <para><emphasis>Seriell</emphasis> angeschlossene Drucker werden über eine serielle Schnittstelle (auch RS-232 oder COM-Schnittstelle genannt) mit Ihrem Computer verbunden. Diese Schnittstelle wird von vielen unterschiedlichen Systemen verwendet. Serielle Kabel sind leicht erhältlich und können auch einfach selbst hergestellt werden. Einige Drucker erfordern möglicherweise ein spezielles Kabel oder besondere Kommunikationseinstellungen. Die meisten seriellen Schnittstellen von PCs besitzen eine maximale Datenübertragungsrate von 115200 bps; zum Ausdruck großer Grafiken sind serielle Drucker daher ungeeignet.</para> </listitem> <listitem> <indexterm> <primary>Drucker</primary> <secondary>parallele</secondary> </indexterm> <para><emphasis>Parallel</emphasis> angeschlossene Drucker werden über eine parallele Schnittstelle mit Ihrem Computer verbunden. Diese Schnittstelle wird hauptsächlich von PCs und Workstations benutzt. Die Schnittstelle bietet eine höhere Datenübertragungsrate als serielle Schnittstellen. Kabel sind leicht erhältlich, sind aber vergleichsweise schwer selbst herzustellen. Üblicherweise brauchen keine Kommunikationsparameter festgelegt zu werden; dies macht die Einrichtung sehr einfach.</para> <indexterm> <primary>Centronics</primary> <see>Drucker, parallele</see> </indexterm> <para>Die parallele Schnittstelle wird auch als <quote>Centronics</quote>-Schnittstelle bezeichnet, nach dem Namen des Steckverbinders, der hier häufig zum Einsatz kommt.</para> </listitem> <listitem> <indexterm> <primary>Drucker</primary> <secondary>USB</secondary> </indexterm> <para>USB-Schnittstelle (Universal Serial Bus) bieten noch höhere Geschwindigkeiten als parallele Schnittstellen oder serielle RS-232-Schnittstellen. USB-Kabel sind einfach und billig. Zum Drucken ist die USB-Schnittstelle besser geeignet als serielle oder parallele Schnittstellen, auf vielen &unix; Systemen werden USB-Schnittstellen jedoch nur unzureichend unterstützt. Um Probleme zu vermeiden, sollten Sie sich einen Drucker anschaffen, der sowohl eine USB-Schnittstelle als auch eine parallele Schnittstelle besitzt (viele Drucker besitzen heute beide Schnittstellen).</para> </listitem> </itemizedlist> <para>Im Allgemeinen versenden parallele Schnittstellen Daten nur in eine Richtung (vom Computer zum Drucker), serielle Schnittstellen und USB-Schnittstellen versenden Daten in beide Richtungen. Moderne parallele Schnittstellen (EPP and ECP) übertragen Daten bi-direktional nach dem Standard IEEE 1284.</para> <indexterm> <primary>PostScript</primary> </indexterm> <para>Ein Drucker kann auf zwei Arten bi-direktional angesprochen werden. Die erste Methode benutzt einen Druckertreiber, der die herstellerspezifische Sprache des Druckers beherrscht. Diese Methode wird oft mit Tintenstrahl-Druckern eingesetzt und dazu benutzt, den Füllstand der Tintenpatronen und andere Status-Informationen auszugeben. Die zweite Methode wird benutzt, wenn der Drucker &postscript; beherrscht.</para> <para>Da ein &postscript;-Druckauftrag ein komplettes Programm ist, kann es auch Daten an den Computer zurückliefern, ohne überhaupt eine Seite Papier zu bedrucken. Auf diesem Wege werden auch Probleme wie z.B. ein Papierstau vom Drucker an den Computer übermittelt. Darüberhinaus ist dies die effektivste Methode, um die tatsächlich gedruckte Anzahl an Seiten vom Drucker abzufragen: ein &postscript;-Programm ermittelt jeweils vor und direkt nach einem Druckauftrag den Seitenzähler des Druckers, und vergleicht die beiden Zählerwerte.</para> </sect4> <sect4 id="printing-parallel"> <title>Parallele Schnittstellen</title> <para>Um einen Drucker mit paralleler Schnittstelle an Ihren Computer anzuschließen, verbinden Sie den Drucker mit einer parallelen Schnittstelle Ihres Computers. Die Dokumentation zu Ihrem Drucker oder Computer sollte Ihnen hier weiterhelfen.</para> <para>Notieren Sie sich, mit welcher parallelen Schnittstelle des Computers Sie den Drucker verbunden haben. Die meisten Computer haben lediglich eine parallele Schnittstelle. Der &os;-Gerätename der ersten Schnittstelle lautet <filename class="devicefile">ppc0</filename>, der der zweiten <filename class="devicefile">ppc1</filename>, und so weiter. Der Gerätename für den Drucker an der ersten parallelen Schnittstelle folgt dem selben Schema und lautet <filename class="devicefile">/dev/lpt0</filename>, usw.</para> </sect4> <sect4 id="printing-serial"> <title>Serielle Schnittstellen</title> <para>Um einen Drucker mit serieller Schnittstelle an Ihren Computer anzuschließen, verbinden Sie den Drucker mit einer seriellen Schnittstelle Ihres Computers. Die Dokumentation zu Ihrem Drucker oder Computer sollte Ihnen hier weiterhelfen.</para> <para>Sollten Sie sich nicht sicher sein, welches das <quote>richtige Kabel</quote> ist, können Sie eine dieser Alternativen ausprobieren:</para> <itemizedlist> <listitem> <para>Ein <emphasis>Modemkabel</emphasis> verbindet alle Anschlüsse an einem Ende des Kabels eins-zu-eins mit den Anschlüssen am anderen Ende des Kabels. Ein solches Kabel wird auch als (engl.) <quote>DTE-to-DCE-</quote> oder <quote>DEE-zu-DÜE-</quote>Kabel bezeichnet.</para> </listitem> <listitem> <indexterm> <primary>Nullmodemkabel</primary> </indexterm> <para>Ein <emphasis>Nullmodemkabel</emphasis> verbindet einige Signale eins-zu-eins, andere über Kreuz (z.B. Sende- und Empfangsleitung), und verbindet einige weitere direkt im Stecker miteinander. Ein solches Kabel wird auch als (engl.) <quote>DTE-to-DTE-</quote> oder <quote>DEE-zu-DEE-</quote>Kabel bezeichnet.</para> </listitem> <listitem> <para>Ein <emphasis>Serielles Druckerkabel</emphasis> schließlich, das für einige spezielle Drucker benötigt wird, verbindet zusätzliche Signale miteinander, anstatt sie im Stecker zurückzuführen.</para> </listitem> </itemizedlist> <indexterm> <primary>Baudrate</primary> </indexterm> <indexterm> <primary>Parität</primary> </indexterm> <indexterm> <primary>Flusssteuerung</primary> </indexterm> <para>Sie sollten auch die Kommunikationsparameter am Drucker einstellen; üblicherweise gibt es dazu DIP-Schalter, oder eine Option in der Menüführung am Drucker. Wählen Sie die höchste <emphasis>Bitrate</emphasis> (auch als <literal>bps</literal> Bits pro Sekunde oder <emphasis>Baudrate</emphasis> bezeichnet), die sowohl Ihr Drucker als auch Ihr Computer unterstützen. Wählen Sie 7 oder 8 Bits, gerade, ungerade oder keine Parität, und ein oder zwei Stoppbits. Wählen Sie die Art der Flusssteuerung: keine, XON/XOFF (auch als <quote>in-band-</quote> oder <quote>Software</quote>-Flusssteuerung bezeichnet), oder Hardware. Notieren Sie sich diese Einstellungen, damit Sie sie später bei der Software-Konfiguration zur Verfügung haben.</para> </sect4> </sect3> <sect3 id="printing-software"> <title>Software-Konfiguration</title> <para>Dieser Abschnitt beschreibt die notwendigen Konfigurationsschritte, damit Sie mit dem &os;-<application>LPD</application>-System drucken können.</para> <para>Diese Schritte müssen Sie ausführen:</para> <procedure> <step> <para>Konfigurieren Sie Ihren Kernel, soweit notwendig, um die Schnittstelle benutzen zu können, an die Ihr Drucker angeschlossen ist. Abschnitt <link linkend="printing-kernel">Kernel-Konfiguration</link> erklärt, welche Optionen Sie benötigen.</para> </step> <step> <para>Konfigurieren Sie die Kommunikationseinstellungen für die parallele Schnittstelle, sofern Sie sie benutzen. Abschnitt <link linkend="printing-parallel-port-mode">Kommunikationseinstellungen für die parallele Schnittstelle</link> enthält die Details.</para> </step> <step> <para>Prüfen Sie, ob Sie Daten an den Drucker senden können. Abschnitt <link linkend="printing-testing">Prüfen der Drucker-Kommunikation</link> führt eine Reihe von Möglichkeiten auf.</para> </step> <step> <para>Konfigurieren Sie <application>LPD</application> für Ihren Drucker, indem Sie die Konfigurationsdatei <filename>/etc/printcap</filename> anpassen. Details dazu finden Sie im Abschnitt <link linkend="printing-printcap"><application>LPD</application> aktivieren: die <filename>/etc/printcap</filename>-Datei</link>.</para> </step> </procedure> <sect4 id="printing-kernel"> <title>Kernel-Konfiguration</title> <para>Der Betriebssystem-Kernel ist für eine bestimmte Kombination aus Geräten kompiliert. Dies schließt Ihre seriellen oder parallelen Schnittstellen mit ein. Dementsprechend kann es notwendig sein, die Kernelkonfiguration um weitere Schnittstellen zu erweitern.</para> <para>So können Sie prüfen, ob Ihr Kernel die serielle Schnittstelle unterstützt, an die Sie den Drucker angeschlossen haben:</para> <screen>&prompt.root; <userinput><command>grep sio<replaceable>N</replaceable> <filename>/var/run/dmesg.boot</filename></command></userinput></screen> <para>Ersetzen Sie <replaceable>N</replaceable> durch die Nummer der seriellen Schnittstelle, beginnend bei Null. Wenn Sie eine Ausgabe ähnlich der folgenden erhalten, unterstützt ihr Kernel diese Schnittstelle:</para> <screen>sio2 at port 0x3e8-0x3ef irq 5 on isa sio2: type 16550A</screen> <para> Erhalten Sie keine Ausgabe, oder eine Fehlermeldung, wird die Schnittstelle nicht korrekt unterstützt.</para> <para>So können Sie prüfen, ob Ihr Kernel die parallele Schnittstelle unterstützt, an die Sie den Drucker angeschlossen haben:</para> <screen>&prompt.root; <userinput>grep ppc<replaceable>N</replaceable> /var/run/dmesg.boot</userinput></screen> <para>Ersetzen Sie <replaceable>N</replaceable> durch die Nummer der parallelen Schnittstelle, beginnend bei Null. Wenn Sie eine Ausgabe ähnlich der folgenden erhalten, unterstützt ihr Kernel diese Schnittstelle:</para> <screen>ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0 ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode ppc0: FIFO with 16/16/8 bytes threshold</screen> <para> Erhalten Sie keine Ausgabe, oder eine Fehlermeldung, wird die Schnittstelle nicht korrekt unterstützt.</para> <para>Gegebenenfalls müssen Sie Ihren Kernel umkonfigurieren und neu kompilieren, damit die von Ihnen gewählte Schnittstelle unterstützt wird.</para> <para>Um Unterstützung für eine serielle Schnittstelle hinzuzufügen, lesen Sie bitte Kapitel <link linkend="kernelconfig">Konfiguration des &os; Kernels</link>. Um eine parallele Schnittstelle hinzuzufügen, lesen Sie bitte ebenfalls jenes Kapitel als auch den folgenden Abschnitt <link linkend="printing-parallel-port-mode">Kommunikationseinstellungen für die parallele Schnittstelle</link>.</para> </sect4> </sect3> <sect3 id="printing-parallel-port-mode"> <title>Kommunikationseinstellungen für die parallele Schnittstelle</title> <para>Wenn Sie die parallele Schnittstelle zur Kommunikation mit Ihrem Drucker benutzen, haben Sie die Wahl zwischen Interrupt-gesteuerter oder Polling-Datenübertragung. Der generische Druckergerätetreiber &man.lpt.4; in &os; benutzt das &man.ppbus.4;-System, das die parallele Schnittstelle mithilfe des &man.ppc.4;-Treibers steuert.</para> <itemizedlist> <listitem> <para>Die <emphasis>Interrupt-gesteuerte</emphasis> Datenübertragung ist die Voreinstellung im GENERIC-Kernel. Der Treiber benutzt eine IRQ-Leitung, um zu erfahren, wann der Drucker weitere Daten empfangen kann.</para> </listitem> <listitem> <para>Bei der <emphasis>Polling-Methode</emphasis> prüft der Treiber in regelmäßigen Abständen, ob weitere Daten übertragen werden können.</para> </listitem> </itemizedlist> <para>Die Interrupt-gesteuerte Methode ist überlicherweise schneller und verbraucht weniger Rechenzeit als die Polling-Methode, es wird jedoch eine eigene IRQ-Leitung für die Schnittstelle benötigt. Darüberhinaus kann es mit einigen Druckermodellen zu Problemen kommen, wenn die Interrupt-gesteuerte Übertragung zum Einsatz kommt.</para> <para>Die können die Kommunikationseinstellung entweder in der Kernel-Konfiguration wählen, oder mittels des &man.lptcontrol.8;-Programms zur Laufzeit einstellen.</para> <para><emphasis>So legen Sie die Kommunikationseinstellung in der Kernel-Konfiguration fest:</emphasis></para> <procedure> <step> <para>Ändern Sie Ihre Kernel-Konfigurationsdatei. Finden Sie die Zeile, die mit <literal>device ppc0</literal> beginnt. Wenn Sie die zweite parallele Schnittstelle konfigurieren möchten, suchen Sie nach <literal>device ppc1</literal>, für die dritte Schnittstelle <literal>ppc2</literal>, usw.</para> <itemizedlist> <listitem> <para>Um die Interrupt-Steuerung zu aktivieren, passen Sie die folgende Zeile an:</para> <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting> <para>Ersetzen Sie <replaceable>N</replaceable> durch die Nummer der IRQ-Leitung, die dieser parallelen Schnittstelle zugewiesen ist. Stellen Sie sicher, dass Ihre Kernel-Konfigurationsdatei den &man.ppc.4;-Treiber enthält:</para> <screen>device ppc</screen> </listitem> <listitem> <para>Wenn Sie den Polling-Modus verwenden möchten, entfernen Sie die folgende Zeile aus <filename>/boot/device.hints</filename>:</para> <programlisting>hint.ppc.0.irq="<replaceable>N</replaceable>"</programlisting> <para>Sollte der Treiber die Schnittstelle dennoch im Interrupt-Modus betreiben, könnte dies an der Aktivierung durch das &man.acpi.4;-System in &os; liegen. Bitte prüfen Sie die ACPI- und die BIOS-Konfiguration.</para> </listitem> </itemizedlist> </step> <step> <para>Wenn Sie Ihre Kernel-Konfigurationsdatei angepasst haben, kompilieren und installieren Sie nun einen neuen Kernel. Das Kapitel <link linkend="kernelconfig">Konfiguration des &os;-Kernels</link> enthält weitere Details dazu.</para> </step> </procedure> <para><emphasis>So können Sie die Kommunikationseinstellung mit</emphasis>&man.lptcontrol.8; <emphasis>ändern:</emphasis></para> <procedure> <step> <para>Um die Interrupt-Steuerung für die Schnittstelle <replaceable>N</replaceable> zu aktivieren, geben Sie ein:</para> <screen>&prompt.root; <userinput><command>lptcontrol <option>-i</option> <option>-d</option> <filename class="devicefile">/dev/lpt<replaceable>N</replaceable></filename></command></userinput></screen> </step> <step> <para>Um den Polling-Modus für die Schnittstelle <replaceable>N</replaceable> zu aktivieren, geben Sie ein:</para> <screen>&prompt.root; <userinput><command>lptcontrol <option>-p</option> <option>-d</option> <filename class="devicefile">/dev/lpt<replaceable>N</replaceable></filename></command></userinput></screen> </step> </procedure> <para>Sie können diesen Befehl in <filename>/etc/rc.local</filename> aufnehmen, damit er bei jedem Systemstart automatisch ausgeführt wird. &man.lptcontrol.8; enthält weitere Informationen.</para> </sect3> <sect3 id="printing-testing"> <title>Kommunikation mit den Drucker prüfen</title> <para>Bevor Sie mit der Konfiguration des <application>LPD</application>-Drucksystems fortfahren, sollten Sie sicherstellen, das Sie erfolgreich Daten an Ihren Drucker senden können. Es ist deutlich einfacher, Kommunikations- und Konfigurationsprobleme unabhängig voneinander zu lösen.</para> <para>Der Drucker kann mit einem Probeausdruck getestet werden. Für alle Drucker, die normalen Text unmittelbar drucken können, bietet sich das Programm &man.lptest.1; an: es produziert alle 96 druckbaren ASCII-Zeichen auf 96 Zeilen.</para> <indexterm> <primary>PostScript</primary> </indexterm> <para>Für einen &postscript;-Drucker (oder andere Drucker, die eine Seitenbeschreibungssprache verwenden) muss ein passendes Programm an den Drucker gesendet werden, z.B. dieses:</para> <programlisting>%!PS 100 100 moveto 300 300 lineto stroke 310 310 moveto /Helvetica findfont 12 scalefont setfont (Funktioniert dieser Drucker?) show showpage</programlisting> <para>Sie können dieses ProstScript-Programm in einer Datei speichern, und mit den Beispielen in den folgenden Abschnitt verwenden.</para> <indexterm> <primary>PCL</primary> </indexterm> <note> <para>Nicht alle Drucker, die eine Seitenbeschreibungssprache verwenden, benötigen ein Test-Programm: z.B. HPs PCL (das auch in vielen kompatiblen Druckern zum Einsatz zu kommt), versteht normalen Text. Besondere Escape-Sequenzen werden benutzt, um die erweiterten Möglichkeiten aufzurufen. &postscript;-Drucker können in der Regel keinen normalen Text direkt verarbeiten, weil sie ein &postscript;-Programm erwarten, das eine Seite produziert.</para> </note> <sect4 id="printing-checking-parallel"> <title>Einen Paralleldrucker prüfen</title> <indexterm> <primary>Drucker</primary> <secondary>parallele</secondary> </indexterm> <para>Dieser Abschnitt führt vor, wie Sie die Kommunikation mit Ihrem Drucker über die parallele Schnittstelle prüfen können.</para> <para><emphasis>So testen Sie einen Drucker an einer parallelen Schnittstelle:</emphasis></para> <procedure> <step> <para>Werden Sie <username>root</username> mithilfe des &man.su.1;-Befehls.</para> </step> <step> <para>Senden Sie Testdaten an den Drucker.</para> <itemizedlist> <listitem> <para>Wenn Ihr Drucker reinen Text direkt drucken kann, verwenden Sie &man.lptest.1;:</para> <screen>&prompt.root; <userinput>lptest > /dev/lpt<replaceable>N</replaceable></userinput></screen> <para>Ersetzen Sie <replaceable>N</replaceable> durch die Nummer der parallelen Schnittstelle, an die der Drucker angeschlossen ist (angefangen bei Null).</para> </listitem> <listitem> <para>Wenn Ihr Drucker &postscript; (oder eine andere Seitenbeschreibungssprache) versteht, senden Sie ein passendes Testprogramm an den Drucker. Geben Sie folgenden Befehl ein:</para> <screen>&prompt.root; <userinput><command>cat <filename><replaceable>file</replaceable></filename> > <filename class="devicefile">/dev/lpt<replaceable>N</replaceable></filename></command></userinput></screen> <para>Ersetzen Sie <replaceable>N</replaceable> durch die Nummer der parallelen Schnittstelle, an die der Drucker angeschlossen ist (angefangen bei Null). Geben Sie nun das Testprogramm ein, Zeile für Zeile. Kontrollieren Sie jede Zeile, bevor Sie die Eingabetaste drücken: Sie können die Zeile später nicht mehr ändern. Zum Schluss tippen Sie <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>D</keycap> </keycombo>. Wenn Sie ein anderes Zeichen nutzen, um das Ende der Datei anzuzeigen, müssen Sie natürlich die entsprechende Tastenkombination für dieses Zeichen betätigen.</para> <para>Sie können das Testprogramm auch in einer Datei speichern, und dann diesen Befehl aufrufen:</para> <screen>&prompt.root; <userinput>cat <replaceable>Testprogramm</replaceable> > /dev/lpt<replaceable>N</replaceable></userinput></screen> <para>Ersetzen Sie <replaceable>Testprogramm</replaceable> durch den Dateinamen, unter dem Sie das Testprogramm gespeichert haben.</para> </listitem> </itemizedlist> </step> </procedure> <para>Der Drucker sollte einige Zeilen oder eine Seite drucken. Machen Sie sich keine Sorgen über falsche Formatierungen: die Software-Konfiguration enthält Informationen zum Umformatieren von Druckaufträgen.</para> </sect4> <sect4 id="printing-checking-serial"> <title>Einen seriellen Drucker prüfen</title> <indexterm> <primary>Drucker</primary> <secondary>serielle</secondary> </indexterm> <para>Dieser Abschnitt führt vor, wie Sie die Kommunikation mit Ihrem Drucker über die parallele Schnittstelle prüfen können.</para> <para><emphasis>So testen Sie einen Drucker an einer seriellen Schnittstelle:</emphasis></para> <procedure> <step> <para>Werden Sie <username>root</username> mithilfe des &man.su.1;-Befehls.</para> </step> <step> <para>Ändern Sie die Datei <filename>/etc/remote</filename>. Fügen Sie den folgenden Eintrag hinzu:</para> <programlisting>printer:dv=<filename class="devicefile">/dev/<replaceable>port</replaceable></filename>:br#<replaceable>bps-rate</replaceable>:pa=<replaceable>parity</replaceable></programlisting> <indexterm> <primary>Baudrate</primary> </indexterm> <indexterm> <primary>serieller Anschluss</primary> </indexterm> <indexterm> <primary>Parität</primary> </indexterm> <para>Ersetzen Sie <replaceable>Gerät</replaceable> durch den Gerätenamen der seriellen Schnittstelle (<literal>ttyu0</literal> für die erste, <literal>ttyu1</literal> für die zweite, usw.), <replaceable>Baudrate</replaceable> ist die Geschwindigkeit und <replaceable>Parität</replaceable> die Parität (<literal>even</literal> für gerade, <literal>odd</literal> für ungerade oder <literal>none</literal> für keine), die Sie am Drucker eingestellt haben.</para> <para>Hier ein Beispieleintrag für einen Drucker, der über die dritte serielle Schnittstelle angeschlossen ist, mit 19.200 Baud kommuniziert und keine Parität verwendet:</para> <programlisting>printer:dv=<filename class="devicefile">/dev/ttyu2</filename>:br#19200:pa=none</programlisting> </step> <step> <para>Verbinden Sie sich mit dem Drucker über den Befehl &man.tip.1;:</para> <screen>&prompt.root; <userinput><command>tip</command> printer</userinput></screen> <para>Kommt es hierbei zu einer Fehlermeldung, ändern Sie den Eintrag in <filename class="devicefile">/dev/cuaa<replaceable>N</replaceable></filename> und verwenden Sie <filename class="devicefile">/dev/cuaa<replaceable>N</replaceable></filename> statt <filename class="devicefile">/dev/ttyu<replaceable>N</replaceable></filename>.</para> </step> <step> <para>Senden Sie Testdaten an den Drucker.</para> <itemizedlist> <listitem> <para>Wenn Ihr Drucker reinen Text direkt drucken kann, verwenden Sie &man.lptest.1;:</para> <screen>&prompt.user; <userinput>$lptest</userinput></screen> </listitem> <listitem> <para>Wenn Ihr Drucker &postscript; (oder eine andere Seitenbeschreibungssprache) versteht, senden Sie ein passendes Testprogramm an den Drucker. Geben Sie das Testprogramm ein, Zeile für Zeile. Kontrollieren Sie jede Zeile, bevor Sie die Eingabetaste drücken: Sie können die Zeile später nicht mehr ändern. Zum Schluss tippen Sie <literal>Control-D</literal>.</para> <para>Sie können das Testprogramm auch in einer Datei speichern, und dann diesen Befehl aufrufen:</para> <screen>&prompt.user; <userinput>><replaceable>Testprogramm</replaceable></userinput></screen> <para>Ersetzen Sie <replaceable>Testprogramm</replaceable> durch den Dateinamen, unter dem Sie das Testprogramm gespeichert haben. Nachdem &man.tip.1; die Datei gesendet hat, tippen Sie <literal>Control-D</literal>.</para> </listitem> </itemizedlist> </step> </procedure> <para>Der Drucker sollte einige Zeilen oder eine Seite drucken. Machen Sie sich keine Sorgen über falsche Formatierungen: die Software-Konfiguration enthält Informationen zum Umformatieren von Druckaufträgen.</para> </sect4> </sect3> <sect3 id="printing-printcap"> <title><application>LPD</application> aktivieren: die <filename>/etc/printcap</filename>-Datei</title> <para>Nachdem Sie Ihren Drucker angeschlossen haben, Ihren Kernel richtig konfiguriert haben und erfolgreich einen Testausdruck produziert haben, können Sie nun das <application>LPD</application>-System konfigurieren.</para> <para>Sie konfigurieren <application>LPD</application>, indem Sie die Datei <filename>/etc/printcap</filename> anpassen. Da <application>LPD</application> die Datei jedes Mal liest, wenn eine Aktion durchgeführt wird, werden Änderungen an der Konfiguration sofort aktiv.</para> <indexterm> <primary>Drucker</primary> <secondary>Eigenschaften</secondary> </indexterm> <para>Die &man.printcap.5;-Datei ist einfach aufgebaut. Sie können <filename>/etc/printcap</filename> mit Ihrem bevorzugten Texteditor bearbeiten. Sie verwendet dasselbe Format wie auch <filename>/usr/share/misc/termcap</filename> oder <filename>/etc/remote</filename>. Informationen zum Format finden Sie in &man.cgetent.3;.</para> <para>Die Grund-Konfiguration des <application>LPD</application>-Systems beinhaltet diese Schritte:</para> <procedure> <step> <para>Wählen Sie einen Namen (und einige praktische Abkürzungen) für die Druckerwarteschlage, und tragen Sie ihn in die <filename>/etc/printcap</filename>-Datei ein. Abschnitt <link linkend="printing-naming">Einen Namen wählen</link> enthält weitere Informationen.</para> </step> <step> <indexterm> <primary>Deckblätter</primary> </indexterm> <para>Schalten Sie den Druck von Deckblättern aus (dies ist standardmäßig eingeschaltet), indem Sie das Attribut <literal>sh</literal> setzen. Abschnitt <link linkend="printing-no-header-pages">Den Druck von Deckblättern ausschalten</link> erklärt, wie Sie dies tun können.</para> </step> <step> <para>Legen Sie ein Pufferverzeichnis für die Warteschlange an, und geben Sie den Pfad mittels des <literal>sd</literal>-Attributs an: siehe Abschnitt <link linkend="printing-spooldir">Das Pufferverzeichnis anlegen</link>.</para> </step> <step> <para>Geben Sie den Gerätenamen für Ihren Drucker mittels des <literal>lp</literal>-Attributs an: siehe Abschnitt <link linkend="printing-device">Festlegen der Drucker-Gerätedatei</link>. Ist Ihr Drucker über eine serielle Schnittstelle angeschlossen, benutzen Sie das Attribut <literal>ms#</literal>, wie dies in Abschnitt <link linkend="printing-commparam">Festlegen der Kommunikationsparameter</link> beschrieben ist.</para> </step> <step> <para>Installieren Sie einen Filter für reinen Text: siehe Abschnitt <link linkend="printing-textfilter">Den Textfilter installieren</link>.</para> </step> <step> <para>Testen Sie die Konfiguration, indem Sie etwas mit dem &man.lpr.1;-Befehl drucken. Die Abschnitte <link linkend="printing-trying">Die Konfiguration testen</link> und <link linkend="printing-troubleshooting">Fehlersuche und Problembehebung</link> enthalten weitere Informationen.</para> </step> </procedure> <note> <para>Drucker, die eine Seitenbeschreibungssprache wie &postscript; verwenden, können keinen reinen Text drucken. Es wird deshalb angenommen, dass Sie nur solche Dateien drucken, die Ihr Drucker verarbeiten kann.</para> </note> <para>Viele Anwender erwarten, dass sie normalen Text auf allen Druckern drucken können. Viele Programme, die mit <application>LPD</application> zusammenarbeiten, gehen ebenfalls von dieser Annahme aus. Wenn Sie einen &postscript;-Drucker installieren, und Sie sowohl &postscript;- als auch Textdateien drucken möchten, sollten Sie einen weiteren Konfigurationsschritt ausführen und einen Text-zu-&postscript;-Filter installieren. Der Abschnitt <link linkend="printing-advanced-if-conversion">Drucken von reinen Textdateien auf einem &postscript;-Drucker</link> erklärt, wie Sie dies tun können.</para> <sect4 id="printing-naming"> <title>Einen Namen wählen</title> <para>Der erste einfache Schritt ist, einen Namen für Ihren Drucker zu wählen. Sie können diesen Namen frei wählen, Sie sollten allerdings keine Sonderzeichen oder Umlaute verwenden. Sie können mehrere Alias-Namen vergeben.</para> <para>Ein Drucker in <filename>/etc/printcap</filename> sollte den Alias <literal>lp</literal> haben. Dieser Name wird standardmäßig von allen Druckbefehlen verwendet, wenn auf der Befehlszeile oder in der <envar>PRINTER</envar>-Umgebungsvariablen kein anderer Drucker angegeben ist.</para> <para>Ebenso ist es üblich, eine ausführliche Beschreibung des Druckermodells als letzten Alias-Namen zu verwenden.</para> <para>Sobald Sie einen Namen und einige einfache Alias-Namen ausgewählt haben, tragen Sie sie in die Datei <filename>/etc/printcap</filename> ein. Beginnen Sie die Zeile mit dem Namen des Druckers und fügen Sie alle Alias-Namen an. Trennen Sie die Namen durch den senkrechten Strich <literal>|</literal>. Fügen Sie an das Ende der Zeile einen Doppelpunkt <literal>:</literal> an.</para> <para>Das folgende Beispiel definiert zwei Drucker, einen Diablo 630 Zeilendrucker, und einen Panasonic KX-P4455 &postscript;-Laserdrucker:</para> <programlisting># # /etc/printcap for host rose # rattan|line|diablo|lp|Diablo 630 Line Printer: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:</programlisting> <para>Der erste Drucker hat den Namen <literal>rattan</literal>, und hat die Alias-Namen <literal>line</literal>, <literal>diablo</literal>, <literal>lp</literal> und <literal>Diablo 630 Line Printer</literal>. Da er den Alias-Namen <literal>lp</literal> trägt, wird er standardmäßig von den Druckprogrammen verwendet. Der zweite Drucker heißt <literal>bamboo</literal>, und hat die Alias-Namen <literal>ps</literal>, <literal>PS</literal>, <literal>S</literal>, <literal>panasonic</literal> und <literal>Panasonic KX-P4455 PostScript v51.4</literal>.</para> </sect4> <sect4 id="printing-no-header-pages"> <title>Keine Deckblätter drucken</title> <indexterm> <primary>drucken</primary> <secondary>Deckblatt</secondary> </indexterm> <para>Standardmäßig druckt das <application>LPD</application>-System ein <emphasis>Deckblatt</emphasis> vor jedem Druckauftrag, die den Namen des Druckauftrags, den Benutzer und den Computer angibt. Während der Einrichtung des Systems und beim Testen stört das Deckblatt allerdings, weshalb Sie sie zunächst deaktivieren sollten.</para> <para>Um den Druck von Deckblättern zu deaktivieren, fügen Sie das Attribut <literal>sh</literal> zur Druckerdefinition in <filename>/etc/printcap</filename> hinzu. Hier ein Beispiel:</para> <programlisting># # /etc/printcap for host rose - no header pages anywhere # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:</programlisting> <para>Beachten Sie die korrekte Formatierung: die beiden Definitionen beginnen auf einer Zeile; weitere Zeilen der Definition sind mit einem <literal>Tab</literal>-Zeichen eingerückt, und alle Zeilen einer Definition, bis auf die letzte, enden mit dem Backslash <literal>\</literal>.</para> </sect4> <sect4 id="printing-spooldir"> <title>Das Pufferverzeichnis anlegen</title> <indexterm> <primary>Pufferverzeichnis</primary> </indexterm> <indexterm> <primary>Druckaufträge</primary> </indexterm> <para>Der nächste Schritt ist, das <emphasis>Pufferverzeichnis</emphasis> anzulegen. In diesem Verzeichnis werden Druckaufträge zwischengespeichert, während sie gedruckt werden. Gleichzeitig werden hier auch einige Verwaltungsdateien des Systems abgelegt.</para> <para>Da sich die Dateien in diesem Verzeichnis häufig ändern, ist es üblich, das Verzeichnis unter <filename class="directory">/var/spool</filename> anzulegen. Es ist nicht notwendig, Sicherungskopien der Dateien herzustellen; das Verzeichnis kann nötigenfalls leicht mit &man.mkdir.1; wieder angelegt werden.</para> <para>Es ist auch üblich, dem Verzeichnis denselben Namen wie dem Drucker zu geben:</para> <screen>&prompt.root; <userinput><command>mkdir <filename class="directory">/var/spool/<replaceable>printer-name</replaceable></filename></command></userinput></screen> <para>Wenn Sie viele Drucker verwenden, ist es am besten, wenn Sie für die Pufferverzeichnisse ein eigenes Unterverzeichnis in <filename>/var/spool</filename> anlegen, wie dies hier für die beiden Beispieldrucker <literal>rattan</literal> und <literal>bamboo</literal> gezeigt wird:</para> <screen>&prompt.root; <userinput><command>mkdir <filename class="directory">/var/spool/lpd</filename></command></userinput> &prompt.root; <userinput><command>mkdir <filename class="directory">/var/spool/lpd/rattan</filename></command></userinput> &prompt.root; <userinput><command>mkdir <filename class="directory">/var/spool/lpd/bamboo</filename></command></userinput></screen> <note> <para>Um zu verhindern, dass alle Benutzer den Inhalt aller Druckaufträge einsehen können, sollten Sie die Rechte auf den Pufferverzeichnissen einschränken. Die Verzeichnisse sollten dem Benutzer <username>daemon</username> und der Gruppe <groupname>daemon</groupname> gehören, und auch nur vom Benutzer und der Gruppe les-, schreib- und durchsuchbar sein. Für unsere Beispieldrucker:</para> <screen>&prompt.root; <userinput><command>chown daemon:daemon <filename class="directory">/var/spool/lpd/rattan</filename></command></userinput> &prompt.root; <userinput><command>chown daemon:daemon <filename class="directory">/var/spool/lpd/bamboo</filename></command></userinput> &prompt.root; <userinput><command>chmod 770 <filename class="directory">/var/spool/lpd/rattan</filename></command></userinput> &prompt.root; <userinput><command>chmod 770 <filename class="directory">/var/spool/lpd/bamboo</filename></command></userinput></screen> </note> <para>Schließlich müssen Sie dem <application>LPD</application>-System noch mitteilen, wo Sie die Pufferverzeichnisse angelegt haben. Dazu geben Sie in der Definition das Attribut <literal>sd</literal> an:</para> <programlisting># # /etc/printcap for host rose - added spooling directories # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:</programlisting> <para>Beachten Sie, dass der Druckername in der ersten Spalte beginnt, und dass alle Folgezeilen mit einem <literal>Tab</literal> eingerückt sind.</para> <para>Wenn Sie das <literal>sd</literal>-Attribut nicht angeben, verwendet das System <filename class="directory">/var/spool/lpd</filename> als Verzeichnis.</para> </sect4> <sect4 id="printing-device"> <title>Festlegen der Drucker-Gerätedatei</title> <para>Nachdem Sie die korrekte Gerätedatei für die Schnittstelle im Abschnitt <link linkend="printing-hardware">Hardware-Konfiguration</link> identifiziert und angelegt haben, müssen Sie dem <application>LPD</application>-System mitteilen, welche Gerätedatei im Verzeichnis <filename class="directory">/dev</filename> es für die Datenübertragung zum Drucker verwenden soll.</para> <para>Geben Sie die Gerätedatei durch das Attribut <literal>lp</literal> in <filename>/etc/printcap</filename> an.</para> <para>Wenn <literal>rattan</literal> an die erste parallele Schnittstelle angeschlossen ist, und <literal>bamboo</literal> an die sechste serielle, dann sieht <filename>/etc/printcap</filename> so aus:</para> <programlisting># # /etc/printcap for host rose - identified what devices to use # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:</programlisting> <para>Wenn Sie <literal>lp</literal> nicht angeben, versucht <application>LPD</application> die Gerätedatei <filename class="devicefile">/dev/lp</filename> zu verwenden. <filename class="devicefile">/dev/lp</filename> ist zurzeit in &os; nicht definiert.</para> <para>Wenn Ihr Drucker über eine parallele Schnittstelle angeschlossen ist, können Sie mit dem Abschnitt <link linkend="printing-textfilter">Den Textfilter installieren</link> fortfahren. Verwenden Sie eine serielle Schnittstelle, beachten Sie bitte den folgenden Abschnitt.</para> </sect4> <sect4 id="printing-commparam"> <title>Kommunikationsparameter festlegen</title> <indexterm> <primary>Drucker</primary> <secondary>serielle</secondary> </indexterm> <para>Für seriell angeschlossene Drucker kann <application>LPD</application> die Geschwindigkeit, Parität und weitere Kommunikationsparameter einstellen. Dies hat folgende Vorteile:</para> <itemizedlist> <listitem> <para>Sie können die Parameter einfach in <filename>/etc/printcap</filename> ändern, ohne das Ausgabe-Filterprogramm anpassen zu müssen.</para> </listitem> <listitem> <para>Dasselbe Ausgabe-Filterprogramm kann für unterschiedliche Drucker verwendet werden, auch wenn diese unterschiedliche Kommunikationseinstellungen benötigen.</para> </listitem> </itemizedlist> <para>Die folgenden Attribute legen die seriellen Kommunikationsparameter fest:</para> <variablelist> <varlistentry> <term><literal>br#<replaceable>Baudrate</replaceable></literal></term> <listitem> <para>Setzt die Übertragungsgeschwindigkeit auf <replaceable>Baudrate</replaceable>. <replaceable>Baudrate</replaceable> kann üblicherweise 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, oder 115200 Bit pro Sekunde betragen.</para> </listitem> </varlistentry> <varlistentry> <term><literal>ms#<replaceable>stty-Modi</replaceable></literal></term> <listitem> <para>Setzt die Eigenschaften für das Gerät, nachdem es geöffnet wurde. Die verfügbaren Eigenschaften sind in &man.stty.1; aufgeführt.</para> </listitem> </varlistentry> </variablelist> <para>Wenn <application>LPD</application> das mit <literal>lp</literal> angegebene Gerät öffnet, setzt es die mit <literal>ms#</literal> angegebenen Eigenschaften. Von besonderem Interesse sind hier die Modi <literal>parenb</literal>, <literal>parodd</literal>, <literal>cs5</literal>, <literal>cs6</literal>, <literal>cs7</literal>, <literal>cs8</literal>, <literal>cstopb</literal>, <literal>crtscts</literal> und <literal>ixon</literal>, die in der &man.stty.1;-Handbuchseite erläutert werden.</para> <para>Für den über die sechste serielle Schnittstelle angeschlossenen Laserdrucker beträgt die Geschwindigkeit 38.400 Baud, und es werden diese Kommunikationseinstellungen verwendet: keine Parität (<literal>-parenb</literal>), 8-Bit-Zeichen (<literal>cs8</literal>), keine Modemsteuerung (<literal>clocal</literal>) und Hardware-Flusssteuerung (<literal>crtscts</literal>):</para> <programlisting>bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:\ :lp=<filename class="devicefile">/dev/ttyd5</filename>:ms#-parenb cs8 clocal crtscts:</programlisting> </sect4> <sect4 id="printing-textfilter"> <title>Den Textfilter installieren</title> <indexterm> <primary>Druckfilter</primary> </indexterm> <para>Ein <emphasis>Textfilter</emphasis>, auch als <emphasis>Eingangsfilter</emphasis> bezeichnet, ist ein Programm, das von <application>LPD</application> aufgerufen wird, wenn ein Druckauftrag verarbeitet wird. Dabei wird die Standardeingabe des Programms mit der zu druckenden Datei verbunden, und die Standardausgabe mit dem im <literal>lp</literal>-Attribut angegebenen Gerät. Das Programm sollte nun die Datei einlesen, alle Übersetzungen durchführen, die für den Drucker notwendig sind, und das Ergebnis über die Standardausgabe an den Drucker senden. Textfilter werden im Abschnitt <link linkend="printing-advanced-filters">Filter</link> genauer erläutert.</para> <para>Um einen einfachen Test durchzuführen, reicht ein kleines Filterprogramm, dass schlicht <command>/bin/cat</command> aufruft, um die Daten unverändert und den Drucker zu schicken. &os; verfügt über das Programm <filename>lpf</filename>, das Unterstreichung und Fettdruck für solche Drucker ermöglicht, die ansonsten dazu nicht in der Lage wären. Darüberhinaus gibt es viele andere Filter, die Sie einsetzen können. <command>lpf</command> wird im Abschnitt <link linkend="printing-advanced-lpf">lpf: ein Textfilter</link> ausführlich beschrieben.</para> <para>Legen Sie zunächst das folgende Shell-Skript als <filename>/usr/local/libexec/if-simple</filename> mit Ihrem bevorzugten Texteditor an:</para> <programlisting>#!/bin/sh # # if-simple - Simple text input filter for lpd # Installed in /usr/local/libexec/if-simple # # Simply copies stdin to stdout. Ignores all filter arguments. /bin/cat && exit 0 exit 2</programlisting> <para>Machen Sie die Datei ausführbar:</para> <screen>&prompt.root; <userinput><command>chmod 555 <filename>/usr/local/libexec/if-simple</filename></command></userinput></screen> <para>Konfigurieren Sie nun den Textfilter für Ihren Drucker in <filename>/etc/printcap</filename>, indem Sie das <literal>if</literal>-Attribut hinzufügen. Hier die Konfiguration unserer beiden Beispieldrucker:</para> <programlisting># # /etc/printcap for host rose - added text filter # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:\ :if=<filename>/usr/local/libexec/if-simple</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:\ :if=<filename>/usr/local/libexec/if-simple</filename>:</programlisting> <note> <para>Das Shell-Skript <filename>if-simple</filename> steht im Verzeichnis <filename class="directory">/usr/share/examples/printing</filename>.</para> </note> </sect4> <sect4> <title><application>LPD</application> aktivieren</title> <para>&man.lpd.8; wird von <filename>/etc/rc</filename> gestartet, wenn die &man.rc.conf.5;-Variable <literal>lpd_enable</literal> auf <literal>YES</literal> gesetzt ist. Fügen Sie dazu diese Zeile in <filename>/etc/rc.conf</filename> hinzu:</para> <programlisting>lpd_enable="YES"</programlisting> <para>Starten Sie Ihren Computer neu, oder starten Sie &man.lpd.8; von Hand:</para> <screen>&prompt.root; <userinput><command>lpd</command></userinput></screen> </sect4> <sect4 id="printing-trying"> <title>Die Konfiguration testen</title> <para>Damit ist die einfache Konfiguration abgeschlossen. Noch muss die Konfiguration aber getestet werden und etwaige Probleme müssen behoben werden. Um die Konfiguration zu testen, sollten Sie einen Probeausdruck mithilfe des Programms &man.lpr.1; produzieren. &man.lpr.1; übergibt Druckaufträge an das <application>LPD</application>-System.</para> <para>Sie können &man.lpr.1; mit &man.lptest.1; kombinieren, um Testdaten zu drucken. &man.lptest.1; wurde im Abschnitt <link linkend="printing-testing">Kommunikation mit den Drucker prüfen</link> vorgestellt.</para> <para><emphasis>So testen Sie die einfache <application>LPD</application>-Konfiguration:</emphasis></para> <screen>&prompt.root; <userinput><command>lptest 20 5 | lpr <option>-P</option><replaceable>Druckername</replaceable></command></userinput></screen> <para>Ersetzen Sie <replaceable>Druckername</replaceable> durch den Namen des Druckers, den Sie testen möchten. Wenn Sie den Standard-Drucker testen möchten, rufen Sie &man.lpr.1; ohne die Option <option>-P</option> auf. Wenn Sie einen Drucker testen möchten, der nur &postscript; versteht, müssen Sie ein &postscript;-Testprogramm an &man.lpr.1; übergeben. Ein Testprogramm, das Sie in einer Datei gespeichert haben, können Sie mit dem Befehl <command>lpr <replaceable>Dateiname</replaceable></command> an das <application>LPD</application>-System übergeben.</para> <para>Bei einem &postscript;-Drucker hängt das Ergebnis naturgemäß vom Testprogramm ab. Wenn Sie &man.lptest.1; verwenden, sollte das Ergebnis ungefähr so aussehen:</para> <screen>!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456 $%&'()*+,-./01234567 %&'()*+,-./012345678</screen> <para>Um sicherzustellen, dass alles richtig funktioniert, sollten Sie jetzt ein größeres &postscript;-Programm senden. Mit &man.lptest.1; können Sie größere Datenmengen z.B. mit dem Befehl <command>lptest 80 60</command> erzeugen: &man.lptest.1; produziert 60 Zeilen mit je 80 Zeichen.</para> <para>Wenn Sie nicht erfolgreich drucken können, finden Sie im Abschnitt <link linkend="printing-troubleshooting">Fehlersuche und Problembehebung</link> weitere Informationen.</para> </sect4> </sect3> </sect2> </sect1> <sect1 id="printing-advanced"> <sect1info> <authorgroup> <author> <firstname>Johann</firstname> <surname>Kois</surname> <contrib>Übersetzt von </contrib> </author> </authorgroup> </sect1info> <title>Erweiterte Drucker-Konfiguration</title> <warning> <para>Mit &os; 8.0 wurden die Gerätedateien für serielle Ports von <filename>/dev/ttyd<replaceable>N</replaceable></filename> in <filename>/dev/ttyu<replaceable>N</replaceable></filename> umbenannt. Setzen Sie noch &os; 7.X ein, müssen Sie die Befehle in den folgenden Abschnitten entsprechend anpassen.</para> </warning> <para>Dieser Abschnitt beschreibt den Einsatz von Filtern für das Drucken speziell formatierter Seiten oder von Deckblättern, das Drucken über ein Netzwerk sowie die Beschränkung und Verrechnung der Druckernutzung.</para> <sect2 id="printing-advanced-filter-intro"> <title>Filter</title> <indexterm> <primary>Drucken</primary> <secondary>Filter</secondary> </indexterm> <para>Obwohl <application>LPD</application> Netzwerkprotokolle, Warteschlangen, Zugriffskontrollen und andere für das Drucken wichtige Aspekte prinzipiell unterstützt, passiert ein Großteil der <emphasis>wirklichen</emphasis> Arbeit in den sogenannten <emphasis>Filtern</emphasis>. Dabei handelt es sich um Programme, die direkt mit einem Drucker kommunizieren und deren Gerätespezifika und spezielle Anforderungen erfüllen. Im einfachsten Fall installiert man nur einen reinen Textfilter, der mit beinahe allen Druckern funktionieren sollte. (Lesen Sie dazu auch den Abschnitt <link linkend="printing-textfilter">Den Text-Filter installieren</link>.)</para> <para>Um die erweiterten Fähigkeiten von Druckern auch einsetzen zu können, sollten Sie verstehen, wie Filter arbeiten, da diese für die Bereitstellung dieser Funktionen zuständig sind. Die schlechte Nachricht ist, dass <emphasis>Sie</emphasis> diese Filter bereitstellen müssen. Die gute Nachricht ist allerdings, dass diese in der Regel bereits vorhanden sind. Ist dies nicht der Fall, können Sie einen Filter meist relativ einfach selbst erstellen.</para> <para>Der Filter <filename>/usr/libexec/lpr/lpf</filename> wird bereits mit &os; geliefert. Er kümmert sich um die korrekte Behandlung von gelöschten Zeichen (das sogenannte <foreignphrase>Backspacing</foreignphrase>), um im Text enthaltene Tabulatoren, sowie um die Verrechnung von Druckaufträgen. Das ist aber auch alles, was dieser Filter kann. Zusätzliche Filter und für die Funktion von Filtern nötige Komponenten finden sich aber in der &os; Ports-Sammlung.</para> <para>Dieser Abschnitt behandelt folgende Themen:</para> <itemizedlist> <listitem> <para>Der Abschnitt <link linkend="printing-advanced-filters"> Die Funktionsweise von Filtern</link> versucht, einen Überblick über die Rolle von Filtern innerhalb des Druckprozesses zu geben. Sie sollten diesen Abschnitt lesen, damit Sie verstehen, was <quote>unter der Haube</quote> passiert, wenn <application>LPD</application> einen Filter verwendet. Dieses Wissen wird Ihnen dabei helfen, Probleme, die bei Installation von Filtern für verschiedene Drucker entstehen können, vorauszusehen und zu beheben.</para> </listitem> <listitem> <para><application>LPD</application> geht davon aus, dass jeder Drucker in der Lage ist, normalen Text zu drucken. Für &postscript;- (oder andere sprachbasierte) Drucker stellt dies allerdings ein Problem dar, da diese nicht in der Lage sind, normalen Text direkt zu drucken. Der Abschnitt <link linkend="printing-advanced-if-conversion">Normalen Text auf &postscript;-Druckern drucken</link> beschreibt, wie Sie dieses Problem lösen können. Besitzen Sie einen &postscript;-Drucker, sollten Sie diesen Abschnitt lesen.</para> </listitem> <listitem> <para>&postscript; ist ein populäres Ausgabeformat, das von vielen Programmen unterstützt wird. Es ist sogar möglich, &postscript;-Code direkt zu schreiben. Leider sind &postscript;-Drucker in der Regel relativ teuer. Der Abschnitt <link linkend="printing-advanced-ps">&postscript; auf Nicht-&postscript;-Druckern emulieren</link> beschreibt, wie Sie einen Textfilter anpassen müssen, um &postscript;-Daten auf einem <emphasis>nicht-&postscript;-fähigen Drucker</emphasis> auszugeben. Haben Sie keinen &postscript;-Drucker, sollten Sie insbesondere diesen Abschnitt lesen.</para> </listitem> <listitem> <para>Der Abschnitt <link linkend="printing-advanced-convfilters"> Konvertierungsfilter</link> beschreibt eine Möglichkeit zur automatischen Konvertierung verschiedener Dateiformate in ein von Ihrem Drucker unterstütztes Format. Nachdem Sie diesen Abschnitt gelesen haben, werden Sie in der Lage sein, Ihren Drucker so zu konfigurieren, dass Sie durch die Eingabe von <command>lpr <option>-t</option></command> troff-Daten, von <command>lpr <option>-d</option></command> &tex;-DVI-Daten, oder von <command>lpr <option>-v</option></command> Rasterbilddaten drucken können. Daher sollten Sie diesen Abschnitt auf jeden Fall lesen.</para> </listitem> <listitem> <para>Im Abschnitt <link linkend="printing-advanced-of"> Ausgabefilter</link> wird eine nur selten genutzte Eigenschaft von <application>LPD</application>, die sogenannten Ausgabefilter, beschrieben. Wenn Sie keine <link linkend="printing-advanced-header-pages"> Deckblätter</link> drucken müssen, können Sie diesen Abschnitt überspringen.</para> </listitem> <listitem> <para>Der Abschnitt <link linkend="printing-advanced-lpf">lpf: Ein Textfilter</link> beschreibt <command>lpf</command>, einen kompletten, wenn auch einfachen Textfilter für Zeilendrucker (oder auch Laserdrucker, die sich analog verhalten), der bereits mit &os; geliefert wird. Wenn Sie nur am Ausdruck von reinem Text interessiert sind, oder wenn Ihr Drucker nur <quote>Schrott</quote> produziert, wenn er auf Backspace-Zeichen trifft, sollten Sie sich <command>lpf</command> näher ansehen.</para> </listitem> </itemizedlist> <note> <para>Eine Kopie der verschiedenen Skripte finden Sie im Verzeichnis <filename class="directory">/usr/share/examples/printing</filename>.</para> </note> <sect3 id="printing-advanced-filters"> <title>Die Funktionsweise von Filtern</title> <para>Bei einem Filter handelt es sich um ein ausführbares Programm, das von <application>LPD</application> gestartet wird, um den geräteabhängigen Teil der Kommunikation mit einem Drucker zu übernehmen.</para> <para>Wenn <application>LPD</application> eine Datei über einen Druckauftrag drucken will, startet es ein Filterprogramm. Danach setzt es die Standardeingabe des Filters auf die zu druckende Datei, die Standardausgabe auf den Drucker und die Standardfehlerausgabe auf <filename class="devicefile">/dev/console</filename> (Voreinstellung) oder auf die über die Option <literal>lf</literal> in <filename>/etc/printcap</filename> festgelegte Datei.</para> <indexterm> <primary><command>troff</command></primary> </indexterm> <para>Welcher Filter von <application>LPD</application> mit welchen Argumenten geladen wird, wird in der Datei <filename>/etc/printcap</filename> oder durch die Argumente, die der Anwender &man.lpr.1; auf der Kommandozeile übergibt, festgelegt. Gibt der Anwender beispielsweise <command>lpr <option>-t</option></command> ein, startet <application>LPD</application> über die <literal>tf</literal>-Fähigkeit den troff-Filter für den gewünschten Drucker. Wollen Sie hingegen normalen Text drucken, wird der <literal>if</literal>-Filter gestartet. (Für Ausnahmen von diesem Vorgehen lesen Sie bitte den Abschnitt <link linkend="printing-advanced-of"> Ausgabefilter</link>.)</para> <para>Es gibt drei Arten von Filtern, die Sie in <filename>/etc/printcap</filename> angeben können:</para> <itemizedlist> <listitem> <para><emphasis>Textfilter</emphasis> (die in der <application>LPD</application>-Dokumentation als <emphasis>input filter</emphasis> bezeichnet werden) sind für den Druck von normalem Text zuständig. Es handelt sich dabei um eine Art Standardfilter, da <application>LPD</application> von jedem Drucker erwartet, dass er normalen Text drucken kann. Aufgabe des Textfilters ist es, sicherzustellen, dass gelöschte Zeichen (<foreignphrase>Backspaces</foreignphrase>), Tabulatoren und andere Sonderzeichen Ihren Drucker nicht verwirren. Falls Sie für die Nutzung eines Druckers bezahlen müssen, kann der Textfilter über die Anzahl der gedruckten Zeilen auch die Anzahl der von Ihnen gedruckten Seiten ermitteln. Der Textfilter wird mit folgenden Argumenten gestartet:</para> <cmdsynopsis> <command>filter-name</command> <arg>-c</arg> <arg choice="plain">-w <replaceable>width</replaceable></arg> <arg choice="plain">-l <replaceable>length</replaceable></arg> <arg choice="plain">-i <replaceable>indent</replaceable></arg> <arg choice="plain">-n <replaceable>login</replaceable></arg> <arg choice="plain">-h <replaceable>host</replaceable></arg> <arg choice="plain"><replaceable>acct-file</replaceable></arg> </cmdsynopsis> <para>Die einzelnen Argumente haben folgende Bedeutung:</para> <variablelist> <varlistentry> <term><option>-c</option></term> <listitem> <para>Notwendig, wenn <command>lpr <option>-l</option></command> verwendet wird.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>width</replaceable></term> <listitem> <para>Der Wert der in <filename>/etc/printcap</filename> festgelegten Option <literal>pw</literal> (<foreignphrase>page width</foreignphrase>). In der Voreinstellung ist dieser Wert auf 132 gesetzt.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>length</replaceable></term> <listitem> <para>Der Wert der <literal>pl</literal>-Fähigkeit (<foreignphrase>page length</foreignphrase>), Voreinstellung 66.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>indent</replaceable></term> <listitem> <para>Der durch <command>lpr <option>-i</option></command> festgelegte Einzug, Voreinstellung 0.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>login</replaceable></term> <listitem> <para>Der Name des Benutzers, der die Datei druckt.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>host</replaceable></term> <listitem> <para>Der Rechner, auf dem der Druckauftrag gestartet wurde.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>acct-file</replaceable></term> <listitem> <para>Der Name der Verrechnungsdatei, in der die Ergebnisse der <literal>af</literal>-Fähigkeit gespeichert werden.</para> </listitem> </varlistentry> </variablelist> </listitem> <listitem> <indexterm> <primary>Drucken</primary> <secondary>Filter</secondary> </indexterm> <para>Ein <emphasis>Konvertierungsfilter</emphasis> konvertiert verschiedene Dateiformate in ein Format, das Ihr Drucker auf Papier ausgeben kann. So kann etwa der ditroff-Schriftsatz nicht direkt gedruckt werden, daher müssen Sie einen Konvertierungsfilter installieren, um diese Daten in ein Format zu bringen, das Ihr Drucker verarbeiten und drucken kann. Der Abschnitt <link linkend="printing-advanced-convfilters"> Konvertierungsfilter</link> enthält ausführliche Informationen zu diesen Filtern. Konvertierungsfilter können auch zur Verrechnung verwendet werden. Sie werden mit folgenden Argumenten gestartet:</para> <cmdsynopsis> <command>filter-name</command> <arg choice="plain">-x <replaceable>pixel-width</replaceable></arg> <arg choice="plain">-y <replaceable>pixel-height</replaceable></arg> <arg choice="plain">-n <replaceable>login</replaceable></arg> <arg choice="plain">-h <replaceable>host</replaceable></arg> <arg choice="plain"><replaceable>acct-file</replaceable></arg> </cmdsynopsis> <para><replaceable>pixel-width</replaceable> ist der Wert der <literal>px</literal>-Fähigkeit (Voreinstellung 0), während <replaceable>pixel-height</replaceable> dem Wert der <literal>py</literal>-Fähigkeit (Voreinstellung ebenfalls 0) entspricht.</para> </listitem> <listitem> <para><emphasis>Ausgabefilter</emphasis> werden nur verwendet, wenn keine Textfilter vorhanden sind oder wenn Deckblätter benötigt werden. Der Abschnitt <link linkend="printing-advanced-of">Ausgabefilter</link> enthält weitere Informationen. Ausgabefilter unterstützen nur zwei Argumente:</para> <cmdsynopsis> <command>filter-name</command> <arg choice="plain">-w <replaceable>width</replaceable></arg> <arg choice="plain">-l <replaceable>length</replaceable></arg> </cmdsynopsis> <para>Beide Argumente entsprechen den Optionen <option>-w</option> und <option>-l</option> der Textfilter.</para> </listitem> </itemizedlist> <para>Alle Filter sollten mit folgenden Rückgabewerten (Exitcodes) <emphasis>beendet</emphasis> werden:</para> <variablelist> <varlistentry> <term>exit 0</term> <listitem> <para>Der Filter hat die Datei erfolgreich gedruckt.</para> </listitem> </varlistentry> <varlistentry> <term>exit 1</term> <listitem> <para>Der Filter war nicht in der Lage, die Datei zu drucken und meldet diesen Exitcode an <application>LPD</application>, um die Datei erneut zu drucken. <application>LPD</application> startet daraufhin den Filter erneut.</para> </listitem> </varlistentry> <varlistentry> <term>exit 2</term> <listitem> <para>Der Filter war nicht in der Lage, die Datei zu drucken. Bei diesem Exitcode soll <application>LPD</application> aber nicht versuchen, die Datei erneut zu drucken, sondern den Druckauftrag verwerfen.</para> </listitem> </varlistentry> </variablelist> <para><filename>/usr/libexec/lpr/lpf</filename>, der mit &os; gelieferte Textfilter, nutzt die Argumente <foreignphrase>page width</foreignphrase> und <foreignphrase>page length</foreignphrase>, um festzulegen, wann ein Seitenumbruch (<foreignphrase>form feed</foreignphrase>) gesendet werden soll sowie zur Verrechnung von Druckaufträgen. Dazu werden der Benutzername, der für den Druckauftrag verwendete Rechner sowie die Verrechnungsdatei ausgewertet, um die entsprechenden Einträge zu erstellen.</para> <para>Wenn Sie auf der Suche nach Filtern sind, achten Sie darauf, dass diese LPD-kompatibel sind. Dazu müssen diese die oben beschriebenen Argumente unterstützen. Wenn Sie planen, Ihre Filter selbst zu erstellen, müssen diese ebenfalls die gleichen Argumente und Exitcodes unterstützen.</para> </sect3> <sect3 id="printing-advanced-if-conversion"> <title>Normalen Text auf &postscript;-Druckern drucken</title> <indexterm><primary>Druckjob</primary></indexterm> <para>Sie sind der alleinige Benutzer Ihres Computers und Ihres &postscript;-Druckers und Sie sind sich sicher, dass Sie niemals normalen Text an Ihren Drucker senden werden? Außerdem werden Sie niemals ein Programm verwenden, um normalen Text auszudrucken? Nur wenn dies alles zutrifft, können Sie diesen Abschnitt überspringen.</para> <para>Wollen Sie allerdings sowohl &postscript; als auch normalen Text drucken, müssen Sie Ihren Drucker zuvor entsprechend konfigurieren. Dazu muss Ihr Textfilter in der Lage sein, zu unterscheiden, ob es sich bei einem ankommenden Druckauftrag um normalen Text oder um &postscript;-Daten handelt. Jeder &postscript;-Druckauftrag muss mit den Zeichen <literal>%!</literal> beginnen (sehen Sie in Ihrem Druckerhandbuch nach, ob Ihr Drucker weitere Sprachen unterstützt). Sind dies die beiden ersten Zeichen eines Druckauftrages, so handelt es sich um &postscript;-Daten, die direkt gedruckt werden können. Fehlen diese Zeichen allerdings, muss der Textfilter den Inhalt der Datei nach &postscript; konvertieren, bevor die Datei gedruckt werden kann.</para> <para>Wie funktioniert diese Unterscheidung?</para> <indexterm> <primary>Drucker</primary> <secondary>seriell</secondary> </indexterm> <para>Haben Sie einen seriellen Drucker, können Sie <command>lprps</command> installieren. <command>lprps</command> ist ein &postscript;-Druckerfilter, der eine Zweiwegekommunikation mit einem Drucker ermöglicht. Er aktualisiert die Druckerstatusdatei mit Protokollinformationen des Druckers. Dadurch sind Anwender und Administratoren in der Lage, den genauen Zustand des Druckers zu prüfen (durch Meldungen wie <errorname>toner low</errorname> oder <errorname>paper jam</errorname>). Wichtiger ist allerdings, dass <command>lprps</command> <command>psif</command> enthält, ein Programm, das feststellen kann, ob ein ankommender Druckauftrag normalen Text enthält. Ist dies der Fall, wird <command>textps</command> (das ebenfalls mit <command>lprps</command> geliefert wird) aufgerufen und die Datei nach &postscript; konvertiert. Danach kann <command>lprps</command> die Datei an den Drucker senden.</para> <para><command>lprps</command> ist in der &os; <link linkend="ports">Ports-Sammlung</link> enthalten. Je nach der von Ihnen verwendeten Papiergröße installieren Sie dazu den Port <filename role="package">print/lprps-a4</filename> oder <filename role="package">print/lprps-letter</filename>. Nach der Installation müssen Sie nur noch den Pfad zum Programm <command>psif</command> angeben, das als Teil von <command>lprps</command> installiert wird. Haben Sie <command>lprps</command> über die Ports-Sammlung installiert, fügen Sie folgende Zeile in den Eintrag Ihres &postscript;-Druckers in <filename>/etc/printcap</filename> ein:</para> <programlisting>:if=<filename>/usr/local/libexec/psif</filename>:</programlisting> <para>Zusätzlich sollten Sie die <literal>rw</literal>-Fähigkeit aktivieren, um <application>LPD</application> im Schreib- und Lesemodus zu öffnen.</para> <para>Haben Sie hingegen einen parallelen &postscript;-Drucker, was eine Zweiwegekommunikation mit Ihrem Drucker (auf die <command>lprps</command> angewiesen ist) unmöglich macht, können Sie das folgende Shell-Skript verwenden:</para> <programlisting>#!/bin/sh # # psif - Drucke PostScript oder normalen Text auf einem PostScript-Drucker # Script-Version; das ist NICHT die mit lprps gelieferte Version! # Installiert unter: /usr/local/libexec/psif # IFS="" read -r first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # PostScript - einfach drucken. # echo "$first_line" && cat && printf "\004" && exit 0 exit 2 else # # Normaler Text - zuerst konvertieren, dann drucken. # ( echo "$first_line"; cat ) | /usr/local/bin/textps && printf "\004" && exit 0 exit 2 fi </programlisting> <para>Für dieses Skript wurde <command>textps</command> als seperates Programm installiert, um normalen Text nach &postscript; zu konvertieren. Sie können aber auch jeden anderen Text-nach-&postscript;-Konverter verwenden. Die &os; <link linkend="ports">Ports-Sammlung</link> enthält mit <literal>a2ps</literal> ein umfangreiches Programm zur Konvertierung von normalem Text nach &postscript;.</para> </sect3> <sect3 id="printing-advanced-ps"> <title>&postscript; auf Nicht-&postscript;-Druckern emulieren</title> <indexterm> <primary>PostScript</primary> <secondary>Emulation</secondary> </indexterm> <indexterm> <primary>Ghostscript</primary></indexterm> <para>Bei &postscript; handelt es sich um den <emphasis>de facto</emphasis>-Standard für hochwertigen Schriftsatz und Druck. Leider ist &postscript; aber auch ein <emphasis>teurer</emphasis> Standard. Glücklicherweise hat Aladdin Enterprises daher eine freie &postscript;-ähnliche Implementierung namens <application>Ghostscript</application> entwickelt, die auch unter &os; lauffähig ist. <application>Ghostscript</application> kann fast jede &postscript;-Datei lesen und auf den verschiedensten Geräten ausgeben, darunter auch auf vielen Nicht-&postscript;-Druckern. Durch die Installation von <application>Ghostscript</application> und die Nutzung eines speziellen Textfilters erreichen Sie, dass sich Ihr Nicht-&postscript;-Drucker wie ein echter &postscript;-Drucker verhält.</para> <para><application>Ghostscript</application> ist in verschiedenen Versionen in der &os; Ports-Sammlung enhalten, die am häfigsten verwendete Version ist <filename role="package">print/ghostscript-gpl</filename>.</para> <para>Um &postscript; zu emulieren, muss der Textfilter erkennen, ob er eine &postscript;-Datei drucken soll. Ist dies nicht der Fall, wird die Datei direkt an den Drucker geschickt. Anderenfalls wird die Datei an <application>Ghostscript</application> übergeben, das die Datei in ein Format konvertiert, das Ihr Drucker versteht.</para> <para>Dazu ein Beispiel. Das folgende Skript ist ein Textfilter für den Drucker DeskJet 500 von Hewlett Packard. Nutzen Sie einen anderen Drucker, müssen Sie die Option <option>-sDEVICE</option> beim Aufruf von <command>gs</command> (Ghostscript) entsprechend anpassen. Eine Liste der von <application>Ghostscript</application> unterstützten Geräte erhalten Sie durch die Eingabe von <command>gs <option>-h</option></command> auf der Kommandozeile.</para> <programlisting>#!/bin/sh # # ifhp - Ghostscript-emuliertes PostScript auf einem HP DeskJet 500 drucken # Installiert unter: /usr/local/libexec/ifhp # # LF als CR+LF behandeln (um einen "Treppeneffekt" auf HP/PCL-Drucker # zu vermeiden) # printf "\033&k2G" || exit 2 # # Lies die ersten zwei Zeichen der Datei # IFS="" read -r first_line first_two_chars=`expr "$first_line" : '\(..\)'` if [ "$first_two_chars" = "%!" ]; then # # Oh. Es ist PostScript; mit Ghostscript konvertieren, danach drucken. # /usr/local/bin/gs -dSAFER -dNOPAUSE -q -sDEVICE=djet500 \ -sOutputFile=- - && exit 0 else # # Normaler Text oder HP/PCL, einfach direkt drucken. Ans Ende setzen wir # einen Seitenumbruch (also ein Form Feed), damit auch die letzte Seite # ausgeworfen wird. # echo "$first_line" && cat && printf "\033&l0H" && exit 0 fi exit 2</programlisting> <para>Zuletzt müssen Sie <application>LPD</application> noch durch die <literal>if</literal>-Fähigkeit über den neuen Filter informieren:</para> <programlisting>:if=<filename>/usr/local/libexec/ifhp</filename>:</programlisting> <para>Das ist alles. Ab sofort sollte sowohl ein <command>lpr <filename><replaceable>normaler.text</replaceable></filename></command> als auch ein <command>lpr <replaceable>wasauchimmer.ps</replaceable></command> funktionieren und beide Dateien sollten problemlos gedruckt werden.</para> </sect3> <sect3 id="printing-advanced-convfilters"> <title>Konvertierungsfilter</title> <para>Nachdem Sie Ihren Drucker wie unter <link linkend="printing-simple">Einfache Drucker-Konfiguration</link> eingerichtet haben, wollen Sie wahrscheinlich einige Konvertierungsfilter installieren, damit Sie (abgesehen von ASCII-Text) auch Ihre Lieblings-Dateiformate drucken können.</para> <sect4> <title>Warum sollte ich einen Konvertierungsfilter installieren?</title> <indexterm> <primary>&tex;</primary> <secondary>DVI-Dateien drucken</secondary> </indexterm> <para>Konvertierungsfilter erleichtern das Drucken von verschiedenen Dateiformaten. Nehmen wir beispielsweise an, dass Sie sehr viel mit dem &tex;-Satzsystem arbeiten und über einen &postscript;-Drucker verfügen. Eine vom &tex;-System erzeugte DVI-Datei kann erst dann gedruckt werden, nachdem diese nach &postscript; konvertiert wurde. Dazu geben Sie Folgendes ein:</para> <screen>&prompt.user; <userinput><command>dvips <filename><replaceable>seaweed-analysis.dvi</replaceable></filename></command></userinput> &prompt.user; <userinput><command>lpr <filename><replaceable>seaweed-analysis.ps</replaceable></filename></command></userinput></screen> <para>Haben Sie einen Konvertierungsfilter für DVI-Dateien installiert, können Sie die manuelle Konvertierung überspringen, da dies nun <application>LPD</application> für Sie erledigt. Wollen Sie eine DVI-Datei drucken, geben Sie nur noch den folgenden Befehl ein:</para> <screen>&prompt.user; <userinput><command>lpr <option>-d</option> <filename><replaceable>seaweed-analysis.dvi</replaceable></filename></command></userinput></screen> <para>Durch die Verwendung der Option <option>-d</option> wurde <application>LPD</application> angewiesen, unsere DVI-Datei vor dem Druck zu konvertieren. Der Abschnitt <link linkend="printing-lpr-options-format">Formatierungs- und Konvertierungsoptionen</link> beschreibt die dabei möglichen Optionen.</para> <para>Für jede Konvertierungsoption, die Ihr Drucker unterstützen soll, müssen Sie einen eigenen <emphasis>Konvertierungsfilter</emphasis> installieren und dessen Pfad in der Datei <filename>/etc/printcap</filename> angeben. Ein Konvertierungsfilter verhält sich im Prinzip wie ein Textfilter bei einer einfachen Druckerkonfiguration (lesen Sie dazu auch den Abschnitt <link linkend="printing-textfilter">Den Textfilter installieren</link>), allerdings konvertiert er die Datei in ein Format, das Ihr Drucker versteht, anstatt normalen Text zu drucken.</para> </sect4> <sect4> <title>Welche Konvertierungsfilter sollte ich installieren?</title> <para>Sie sollten nur Filter installieren, die Sie auch benötigen. Wenn Sie sehr viele DVI-Dateien drucken, sollten Sie auch einen DVI-Konvertierungsfilter installieren. Müssen Sie viele troff-Daten drucken, ist ein troff-Filter hilfreich.</para> <para>Die folgende Tabelle listet die von <application>LPD</application> unterstützten Filter sowie die Einträge in <filename>/etc/printcap</filename> auf, mit denen Sie diese Fähigkeiten aktivieren. Zusätzlich wird angegeben, wie Sie <command>lpr</command> jeweils aufrufen müssen:</para> <informaltable frame="none" pgwide="1"> <tgroup cols="3"> <thead> <row> <entry>Dateityp</entry> <entry><filename>/etc/printcap</filename>-Fähigkeit</entry> <entry><command>lpr</command>-Option</entry> </row> </thead> <tbody> <row> <entry>cifplot</entry> <entry><literal>cf</literal></entry> <entry><option>-c</option></entry> </row> <row> <entry>DVI</entry> <entry><literal>df</literal></entry> <entry><option>-d</option></entry> </row> <row> <entry>plot</entry> <entry><literal>gf</literal></entry> <entry><option>-g</option></entry> </row> <row> <entry>ditroff</entry> <entry><literal>nf</literal></entry> <entry><option>-n</option></entry> </row> <row> <entry>FORTRAN-Text</entry> <entry><literal>rf</literal></entry> <entry><option>-f</option></entry> </row> <row> <entry>troff</entry> <entry><literal>tf</literal></entry> <entry><option>-f</option></entry> </row> <row> <entry>Rasterdaten</entry> <entry><literal>vf</literal></entry> <entry><option>-v</option></entry> </row> <row> <entry>Normaler Text</entry> <entry><literal>if</literal></entry> <entry>keine, <option>-p</option>, or <option>-l</option></entry> </row> </tbody> </tgroup> </informaltable> <para>Wollen Sie also <command>lpr <option>-d</option></command> verwenden, muss die <literal>df</literal>-Fähigkeit in <filename>/etc/printcap</filename> aktiviert sein.</para> <indexterm><primary>FORTRAN</primary></indexterm> <para>Obwohl manche Leute etwas anderes behaupten, sind Formate wie FORTRAN-Text und -Plot inzwischen nahezu obsolet. Wenn Sie diese Formate dennoch benötigen, installieren Sie einfach einen angepassten Filter. Wollen Sie beispielsweise zwar Printerleaf-Dateien (also Dateien des Desktop Publishing-Programms von Interleaf), aber keine Plotdateien drucken, so können Sie einen Printerleaf-Konvertierungsfilter installieren, der es durch die Aktivierung der <literal>gf</literal>-Fähigkeit erlaubt, diese Dateien direkt zu drucken. Nun müssen Sie Ihren Mitarbeitern nur noch mitteilen, dass <command>lpr <option>-g</option></command> nun für <quote>drucke Printerleaf-Dateien</quote> steht.</para> </sect4> <sect4> <title>Konvertierungsfilter installieren</title> <para>Da Konvertierungsfilter nicht zum Basissystem von &os; gehören, sollten diese unter <filename class="directory">/usr/local</filename> installiert werden. Häufig wird das Verzeichnis <filename class="directory">/usr/local/libexec</filename> verwendet, da es sich bei Konvertierungsfiltern um spezielle Programme handelt, die nur von <application>LPD</application>, aber nicht von einem normalen Benutzer gestartet werden.</para> <para>Um einen Konvertierungsfilter zu aktivieren, müssen Sie dessen Pfad zusätzlich zur benötigten Fähigkeit in der Datei <filename>/etc/printcap</filename> eintragen.</para> <para>In unserem Beispiel wollen wir einen DVI-Konvertierungsfilter für den Drucker <literal>bamboo</literal> installieren. Unsere bereits bekannte <filename>/etc/printcap</filename> wurde allerdings um die <literal>df</literal>-Fähigkeit für den Drucker <literal>bamboo</literal> erweitert:</para> <programlisting># # /etc/printcap des Rechners rose - neuer df-Filter für bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:\ :if=<filename>/usr/local/libexec/if-simple</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:\ :if=<filename>/usr/local/libexec/psif</filename>:\ :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting> <para>Beim DVI-Filter handelt es sich um ein Shell-Skript namens <filename>/usr/local/libexec/psdf</filename>:</para> <programlisting>#!/bin/sh # # psdf - DVI-nach-PostScript Druckerfilter # Installiert unter: /usr/local/libexec/psdf # # Wird von lpd aktiviert, wenn der Nutzer lpr -d eingibt. # exec /usr/local/bin/dvips -f | /usr/local/libexec/lprps "$@"</programlisting> <para>Dieses Skript startet <command>dvips</command> im Filtermodus (durch das Argument <option>-f</option> wird der Druckauftrag über die Standardeingabe entgegengenommen). Danach wird der &postscript;-Druckerfilter <command>lprps</command> (lesen Sie dazu auch den Abschnitt <link linkend="printing-advanced-if-conversion">Drucken von reinen Textdateien auf einem &postscript;-Drucker</link>) mit den von <application>LPD</application> übergebenen Argumenten gestartet. Das <command>lprps</command>-Werkzeug wiederum nutzt diese Argumente, um die gedruckten Seiten zu verrechnen.</para> </sect4> <sect4> <title>Beispiele für Konvertierungsfilter</title> <para>Da es keine verbindliche Prozedur zur Installation eines Druckerfilters gibt, folgen nun weitere Beispiele in diesem Abschnitt. Verwenden Sie diese, um Ihre eigenen Filter zu erstellen. Falls ein Filter Ihren Anforderungen bereits entspricht, können Sie ihn auch direkt verwenden.</para> <para>Das erste Beispiel beschreibt einen Konvertierungsfilter für GIF-Dateien für den Drucker LaserJet III-Si von Hewlett Packard:</para> <programlisting>#!/bin/sh # # hpvf - Konvertiert GIF-Dateien nach HP/PCL, danach wird gedruckt. # Installiert unter: /usr/local/libexec/hpvf PATH=/usr/X11R6/bin:$PATH; export PATH giftopnm | ppmtopgm | pgmtopbm | pbmtolj -resolution 300 \ && exit 0 \ || exit 2</programlisting> <para>Dieser Filter konvertiert eine GIF-Datei in eine portable Anymap, diese in ein portables Graustufenbild, dieses wiederum in eine portable Bitmap, die schließlich in ein LaserJet/PCL-kompatibles Format umgewandelt wird.</para> <para><filename>/etc/printcap</filename> muss für einen Drucker, der diesen Filter nutzen will, folgenden Eintrag enthalten:</para> <programlisting># # /etc/printcap des Rechners orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:sh:sd=<filename class="directory">/var/spool/lpd/teak</filename>:mx#0:\ :if=<filename>/usr/local/libexec/hpif</filename>:\ :vf=<filename>/usr/local/libexec/hpvf</filename>:</programlisting> <para>Das folgende Skript ist ein Konvertierungsfilter, der das Drucken von troff-Daten des groff-Textsatzsystems auf dem &postscript;-Drucker <literal>bamboo</literal> ermöglicht:</para> <programlisting>#!/bin/sh # # pstf - Konvertiert groff's troff-Daten nach PS, dann wird gedruckt. # Installiert unter: /usr/local/libexec/pstf # exec grops | /usr/local/libexec/lprps "$@"</programlisting> <para>Dieses Skript nutzt wiederum <command>lprps</command>, um mit dem Drucker zu kommunizieren. Wäre der Drucker an einem parallelen Port angeschlossen, würde das Skript so aussehen:</para> <programlisting>#!/bin/sh # # pstf - Konvertiert groff's troff-Daten nach PS, danach wird gedruckt. # Installiert unter: /usr/local/libexec/pstf # exec grops</programlisting> <para>Das ist alles. Um den Filter verwenden zu können, müssen Sie ihn allerdings noch in <filename>/etc/printcap</filename> aktivieren:</para> <programlisting>:tf=<filename>/usr/local/libexec/pstf</filename>:</programlisting> <para>Das nächste Skript ist ein FORTRAN-Textfilter für jeden Drucker, der normalen Text direkt drucken kann und der hier für den Drucker <literal>teak</literal> installiert wird:</para> <programlisting>#!/bin/sh # # hprf - FORTRAN-Textfilter für den Drucker LaserJet 3si: # Installiert unter: /usr/local/libexec/hprf # printf "\033&k2G" && fpr && printf "\033&l0H" && exit 0 exit 2 </programlisting> <para>Zusätzlich benötigen wir wiederum einen Eintrag in <filename>/etc/printcap</filename>, um diesen Filter für den Drucker <literal>teak</literal> zu aktivieren:</para> <programlisting>:rf=<filename>/usr/local/libexec/hprf</filename>:</programlisting> <para>Das letzte Beispiel ist etwas komplexer. Es soll ein DVI-Filter für den bereits erwähnten LaserJet-Drucker <literal>teak</literal> installiert werden. Der erste Teil ist einfach: Sie müssen den Pfad des DVI-Filters in <filename>/etc/printcap</filename> eintragen:</para> <programlisting>:df=<filename>/usr/local/libexec/hpdf</filename>:</programlisting> <para>Nun kommt der schwierige Teil: Sie müssen den Filter funktionsfähig machen. Dazu benötigen Sie einen DVI-nach-LaserJet/PCL-Konverter. Glücklicherweise enthält die &os; <link linkend="ports">Ports-Sammlung</link> mit <filename role="package">print/dvi2xx</filename> ein solches Programm. Nach der Installation des Pakets verfügen wir über das Programm <command>dvilj2p</command>, das zur Konvertierung von DVI-Daten in zu den Druckern LaserJet IIp, LaserJet III, sowie LaserJet 2000 kompatible Codes benötigt wird.</para> <para>Durch den Einsatz von <command>dvilj2p</command> wird der Filter <command>hpdf</command> relativ komplex, da <command>dvilj2p</command> nicht von der Standardeingabe lesen kann, sondern als Eingabe einen Dateinamen erwartet. Zusätzlich muss der Dateiname auf <filename>.dvi</filename> enden, daher ist die Verwendung von <filename class="devicefile">/dev/fd/0</filename> als Standardeingabe problematisch. Wir können diese Problem aber umgehen, indem wir einen temporären Dateinamen symbolisch nach <filename class="devicefile">/dev/fd/0</filename> linken. Dadurch wird <command>dvilj2p</command> gezwungen, dennoch von der Standardeingabe zu lesen.</para> <para>Das letzte Problem, das wir noch lösen müssen, ist, dass wir <filename class="directory">/tmp</filename> nicht als temporären Link verwenden können. Symbolische Links gehören dem User sowie der Gruppe <username>bin</username>. Der Filter läuft aber als User <username>daemon</username>. Außerdem ist <filename class="directory">/tmp</filename> durch ein Sticky-Bit gesichert. Daher kann der Filter den Link zwar erzeugen, ein Aufräumen ist aber nicht mehr möglich, weil sich die Eigentümer des Filters und des temporären Verzeichnisses unterscheiden.</para> <para>Daher legt der Filter den symbolischen Link im Arbeitsverzeichnis an, das gleichzeitig als Spooling-Verzeichnis dient (festgelegt durch die Aktivierung der <literal>sd</literal>-Fähigkeit in <filename>/etc/printcap</filename>). Das Arbeitsverzeichnis ist ein idealer Ort für den Filter, insbesondere da dieses (manchmal) sogar über mehr freien Speicherplatz als <filename class="directory">/tmp</filename> verfügt.</para> <para>Mit diesen Informationen sind wir nun in der Lage, den Filter zu entwickeln:</para> <programlisting>#!/bin/sh # # hpdf - DVI-Daten auf einen HP/PCL-Drucker drucken # Installiert unter: /usr/local/libexec/hpdf PATH=/usr/local/bin:$PATH; export PATH # # Eine Funktion zum Aufräumen unserer temporären Dateien. # Diese finden sich im Arbeitsverzeichnis, das wir auch als # Spooling-Verzeichnis für unseren Drucker verwenden werden. # cleanup() { rm -f hpdf$$.dvi } # # Eine Funktion, um fatale Fehler zu behandeln. Dazu die Meldung # ausgeben, danach ein exit 2. Dadurch weiß LPD, dass es # den Auftrag nicht noch einmal drucken soll. # fatal() { echo "$@" 1>&2 cleanup exit 2 } # # Wenn ein Anwender den Auftrag entfernt, sendet LPD ein SIGINT, daher # wollen wir SIGINT und einige andere Signale abfangen (trappen), um # nach der Konvertierung aufräumen zu können. # trap cleanup 1 2 15 # # Bevor wir anfangen, räumen wir noch auf. Sicher ist sicher. # cleanup # # Die DVI-Eingabedatei auf die Standardeingabe linken (die zu druckende # Datei). # ln -s /dev/fd/0 hpdf$$.dvi || fatal "Konnte Symlink nicht anlegen!" # # Umwandeln: LF = CR+LF # printf "\033&k2G" || fatal "Konnte Drucker nicht initialisieren!" # # Konvertieren und drucken. Da der Rückgabewert von dvilj2p # unzuverlässig ist, ignorieren wir ihn einfach. # dvilj2p -M1 -q -e- dfhp$$.dvi # # Aufräumen und beenden. # cleanup exit 0 </programlisting> </sect4> <sect4 id="printing-advanced-autoconv"> <title>Automatische Konvertierung: Eine Alternative zu Konvertierungsfiltern</title> <para>Alle in diesem Abschnitt besprochenen Konvertierungsfilter sind zwar sehr hilfreich, allerdings müssen Sie nach wie vor bei jedem Aufruf von &man.lpr.1; angeben, welchen Filter sie verwenden wollen, was mit der Zeit sicher nervend wird. Schlimmer ist allerdings, dass die Auswahl eines unpassenden Filters dazu führen kann, dass Sie Hunderte Seiten Papier ausdrucken.</para> <para>Statt also Konvertierungsfilter zu installieren, könnten Sie den Textfilter (der ohnehin der Standardfilter ist) verwenden, um den zu druckenden Dateityp zu erkennen und anschließend den korrekten Konvertierungsfilter auszuwählen. Um den Dateityp zu bestimmen, können Sie beispielsweise <command>file</command> verwenden. Leider ist es bei <emphasis>einigen</emphasis> Dateitypen problematisch, diese zu unterscheiden. Daher könnten Sie für diese Dateitypen dennoch einen Konvertierungsfilter installieren.</para> <indexterm><primary>apsfilter</primary></indexterm> <indexterm> <primary>Drucken</primary> <secondary>Filter</secondary> <tertiary>apsfilter</tertiary> </indexterm> <para>Die &os; Ports-Sammlung enthält mit <command>apsfilter</command> (<filename role="package">print/apsfilter</filename>) einen Textfilter, der diese automatische Konvertierung durchführen kann. Er ist in der Lage, normalen Text, &postscript;, DVI und beinahe jede Art von Datei zu erkennen, diese zu konvertieren und auf Ihren Drucker auszugeben.</para> </sect4> </sect3> <sect3 id="printing-advanced-of"> <title>Ausgabefilter</title> <para><application>LPD</application> unterstützt noch eine weitere Filterart, die sogenannten Ausgabefilter. Diese sind – analog zu einem Textfilter – für den Druck von normalem Text ausgelegt, allerdings verfügen sie im Vergleich zu diesen nur über sehr eingeschränkte Fähigkeiten. Wenn Sie einen Ausgabefilter (aber keinen Textfilter) verwenden, dann</para> <itemizedlist> <listitem> <para>startet <application>LPD</application> nur einen Ausgabefilter für den kompletten Druckauftrag, statt für jede Datei des Auftrags einen eigenen Filter zu starten.</para> </listitem> <listitem> <para>kümmert sich <application>LPD</application> nicht darum, den Beginn oder das Ende einer Datei innerhalb des Druckauftrages zu finden.</para> </listitem> <listitem> <para>übergibt <application>LPD</application> weder den Benutzer- noch den Rechnernamen desjenigen, der den Druckauftrag erteilt hat, an den Ausgabefilter, was eine Verrechnung von Druckaufträgen unmöglich macht. Ausgabefilter unterstützen insgesamt nur zwei Argumente:</para> <cmdsynopsis> <command>filter-name</command> <arg choice="plain">-w <replaceable>width</replaceable></arg> <arg choice="plain">-l <replaceable>length</replaceable></arg> </cmdsynopsis> <para><replaceable>width</replaceable> basiert auf der <literal>pw</literal>-Fähigkeit, <replaceable>length</replaceable> hingegen auf der <literal>pl</literal>-Fähigkeit des gewählten Druckers.</para> </listitem> </itemizedlist> <para>Lassen Sie sich von dieser angeblichen Einfachheit eines Ausgabefilters nicht täuschen. Ausgabefilter sind beispielsweise <emphasis>nicht dazu in der Lage</emphasis>, jede Datei eines Druckauftrages auf einer neuen Seite zu drucken. Dazu benötigen Sie einen Textfilter (die im Abschnitt <link linkend="printing-textfilter">Den Textfilter installieren</link> beschrieben werden). Außerdem sind Ausgabefilter in Wirklichkeit <emphasis>komplexer</emphasis>, da sie den gesendeten Bytestrom nicht nur auf Sonderzeichen hin untersuchen müssen, sondern auch die Übertragung von Signalen für <application>LPD</application> übernehmen müssen.</para> <para>Sie <emphasis>benötigen</emphasis> Ausgabefilter aber dann, wenn Sie Deckblätter drucken wollen, da dazu Escape-Sequenzen und Initialisierungsstrings erforderlich sind. (Es ist allerdings <emphasis>nicht möglich</emphasis>, den Druck dieser Deckblätter zu verrechnen, da <application>LPD</application> keine Benutzer- oder Rechnerinformationen an den Ausgabefilter übergibt.)</para> <para><application>LPD</application> kann für den gleichen Drucker sowohl Ausgabefilter als auch Textfilter verwenden. In solchen Fällen verwendet <application>LPD</application> den Ausgabefilter nur für den Druck von Deckblättern (die im Abschnitt <link linkend="printing-advanced-header-pages">Deckblätter</link> näher beschrieben werden). Nach dem Druck des Deckblattes erwartet <application>LPD</application>, dass sich der Ausgabefilter <emphasis>selbst beendet</emphasis>. Dazu werden zwei Bytes an den Ausgabefilter gesendet: ASCII 031, gefolgt von ASCII 001. Wenn ein Ausgabefilter diese zwei Bytes (031, 001) empfängt, sendet er das Signal <literal>SIGSTOP</literal> an sich selbst. Nachdem <application>LPD</application> den Rest des Druckauftrages erledigt hat, wird der Ausgabefilter erneut gestartet, indem ein <literal>SIGCONT</literal> an den Ausgabefilter gesendet wird.</para> <para>Haben Sie nur einen Ausgabefilter, aber <emphasis>keinen</emphasis> Textfilter installiert, dann verwendet <application>LPD</application> den Ausgabefilter auch für den Druck von normalem Text. Wie bereits erwähnt, werden dabei allerdings alle Dateien des Druckauftrags unmittelbar hintereinander gedruckt, Seitenumbrüche oder ein zusätzlicher Papiervorschub sind also nicht möglich. Da dieses Verhalten von Ihnen wahrscheinlich <emphasis>nicht</emphasis> gewünscht wird, werden Sie in fast allen Fällen einen zusätzlichen Textfilter benötigen.</para> <para>Der weiter oben beschriebene Textfilter <command>lpf</command> kann auch als Ausgabefilter verwendet werden. Wenn Sie nur einen funktionierenden Ausgabefilter benötigen, aber nicht den dafür benötigten Code (zur Zeichenerkennung und zum Senden von Signalen) schreiben wollen, sollten Sie sich <command>lpf</command> näher ansehen. Sie können <command>lpf</command> auch in ein Shell-Skript einbinden, um von Ihrem Drucker benötigte Initialisierungscodes zu verarbeiten.</para> </sect3> <sect3 id="printing-advanced-lpf"> <title><command>lpf</command>: Ein Textfilter</title> <para>Der Textfilter (Eingabefilter) <filename>/usr/libexec/lpr/lpf</filename> wird bereits mit &os; geliefert. Er erlaubt das Einrücken der Ausgabe (über <command>lpr <option>-i</option></command>), die Übergabe von Zeichen-Literalen (über <command>lpr <option>-l</option></command>), das Anpassen der Druckposition bei gelöschten Zeichen (<foreignphrase>Backspaces</foreignphrase>) oder Tabulatoren, sowie die Verrechnung gedruckter Seiten. Zusätzlich kann dieser Textfilter auch als Ausgabefilter arbeiten.</para> <para><command>lpf</command> ist für viele verschiedene Druckumgebungen geeignet. Zwar ist dieser Textfilter nicht in der Lage, Initialisierungssequenzen an einen Drucker zu senden, dieses Problem kann allerdings durch das Schreiben und Ausführen eines Shell-Skripts (das diese Funktion übernimmt) und das anschließende Aufrufen von <command>lpf</command> gelöst werden.</para> <indexterm><primary>Seiten verrechnen</primary></indexterm> <indexterm> <primary>verrechnen</primary> <secondary>Druckernutzung</secondary> </indexterm> <para>Damit Sie <command>lpf</command> für die Verrechnung von Druckaufträgen einsetzen können, müssen Sie die korrekten Werte für die <literal>pw</literal>- und <literal>pl</literal>-Fähigkeiten in <filename>/etc/printcap</filename> eintragen. <command>lpf</command> verwendet diese Werte, um festzustellen, wieviel Text auf eine Seite passt und wieviele Seiten im Druckauftrag enthalten sind. Weitere Informationen zur Verrechnung der Druckernutzung enthält der Abschnitt <link linkend="printing-advanced-acct">Die Druckernutzung verrechnen</link>.</para> </sect3> </sect2> <sect2 id="printing-advanced-header-pages"> <title>Deckblätter</title> <para>Wenn Sie <emphasis>viele</emphasis> Benutzer mit verschiedenen Druckern verwalten müssen, sollten Sie <emphasis>Deckblätter</emphasis> als notwendiges Übel akzeptieren.</para> <indexterm> <primary>Bannerseiten</primary> <see>Deckblätter</see> </indexterm> <indexterm><primary>Deckblätter</primary></indexterm> <para>Deckblätter (manchmal auch als <emphasis>Bannerseiten</emphasis> oder <emphasis>burst pages</emphasis> bezeichnet) geben an, wem die Ausgabe eines Druckauftrags gehört. Sie werden normalerweise in großen fetten Buchstaben gedruckt, manchmal sogar mit zusätzlicher Umrandung, damit man sie leichter von den tatsächlichen Seiten eines Druckauftrages unterscheiden kann. Der Nachteil von Deckblättern ist allerdings, dass es sich dabei um eine zusätzliche zu druckende Seite handelt, die in der Regel bereits nach wenigen Minuten wieder im Papierkorb landet. Da aber für jeden Druckauftrag nur ein einziges Deckblatt gedruckt wird, ist der Papierverbrauch in den meisten Fällen tolerierbar.</para> <para>Das <application>LPD</application>-System kann Deckblätter automatisch erzeugen, <emphasis>wenn</emphasis> Ihr Drucker normalen Text direkt drucken kann. Haben Sie hingegen einen &postscript;-Drucker, benötigen Sie ein externes Programm, um die Deckblätter zu generieren (Lesen Sie dazu auch den Abschnitt <link linkend="printing-advanced-header-pages-ps">Deckblätter auf &postscript;-Druckern erzeugen</link>.).</para> <sect3 id="printing-advanced-header-pages-enabling"> <title>Deckblätter aktivieren</title> <para>Im Abschnitt <link linkend="printing-simple">Einfache Drucker-Konfiguration</link> haben wir die Ausgabe von Deckblättern durch die die Angabe der Option <literal>sh</literal> (<foreignphrase>suppress header</foreignphrase>) in <filename>/etc/printcap</filename> deaktiviert. Um die Ausgabe von Deckblättern wieder zu aktivieren, müssen Sie daher die <literal>sh</literal>-Fähigkeit wieder entfernen.</para> <para>Das klingt zu einfach? Wo ist der Haken?</para> <para>Sie haben recht. Es ist <emphasis>möglich</emphasis>, dass Sie einen Ausgabefilter verwenden müssen, um die nötigen Initialisierungsstrings an den Drucker zu senden. Das folgende Beispiel beschreibt einen Ausgabefilter für PCL-kompatible Drucker von Hewlett Packard:</para> <programlisting>#!/bin/sh # # hpof - Ausgabefilter für PCL-kompatible Drucker von Hewlett Packard # Installiert unter: /usr/local/libexec/hpof printf "\033&k2G" || exit 2 exec /usr/libexec/lpr/lpf</programlisting> <para>Geben Sie den Pfad des Ausgabefilters über die <literal>of</literal>-Fähigkeit an. Weitere Informationen finden Sie im Abschnitt <link linkend="printing-advanced-of">Ausgabefilter</link>.</para> <para>Das nächste Beispiel beschreibt die Datei <filename>/etc/printcap</filename> des bereits erwähnten Druckers <literal>teak</literal>. Allerdings sind nun die Ausgabe von Deckblättern sowie der vorhin beschriebene Ausgabefilter enthalten:</para> <programlisting># # /etc/printcap für den Rechner orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:sd=<filename class="directory">/var/spool/lpd/teak</filename>:mx#0:\ :if=<filename>/usr/local/libexec/hpif</filename>:\ :vf=<filename>/usr/local/libexec/hpvf</filename>:\ :of=<filename>/usr/local/libexec/hpof</filename>:</programlisting> <para>Wenn ein Anwender nun einen Druckauftrag an den Drucker <literal>teak</literal> schickt, wird für jeden Druckauftrag ein Deckblatt erstellt. Benötigt ein Anwender keine Deckblätter, kann er die Ausgabe dieser Seiten durch die Verwendung von <command>lpr <option>-h</option></command> unterdrücken. Weitere, für die Ausgabe von Deckblättern interessante &man.lpr.1;-Optionen finden Sie im Abschnitt <link linkend="printing-lpr-options-misc">Deckblattoptionen</link>.</para> <note> <para><application>LPD</application> verwendet ein <foreignphrase>Form Feed</foreignphrase>, um das Deckblatt abzuschließen. Wenn Ihr Drucker ein anderes Zeichen verwendet, um eine Seite auszuwerfen, geben Sie dieses über die <literal>ff</literal>-Fähigkeit in <filename>/etc/printcap</filename> an.</para> </note> </sect3> <sect3 id="printing-advanced-header-pages-controlling"> <title>Deckblätter kontrollieren</title> <para>Haben Sie die Ausgabe von Deckblättern aktiviert, gibt <application>LPD</application> eine ganze Seite in großen Buchstaben aus, die den Anwender, den verwendeten Rechner sowie den Druckauftrag beschreiben. Das folgende Beispiel ist ein Deckblatt für den Druckauftrag <quote>outline</quote>, der von <username>kelly</username> auf dem Rechner <hostid>rose</hostid> erstellt wurde:</para> <screen> k ll ll k l l k l l k k eeee l l y y k k e e l l y y k k eeeeee l l y y kk k e l l y y k k e e l l y yy k k eeee lll lll yyy y y y y yyyy ll t l i t l oooo u u ttttt l ii n nnn eeee o o u u t l i nn n e e o o u u t l i n n eeeeee o o u u t l i n n e o o u uu t t l i n n e e oooo uuu u tt lll iii n n eeee r rrr oooo ssss eeee rr r o o s s e e r o o ss eeeeee r o o ss e r o o s s e e r oooo ssss eeee Job: outline Date: Sun Sep 17 11:04:58 1995</screen> <para><application>LPD</application> fügt ein <foreignphrase>Form Feed</foreignphrase> an diesen Text an, damit der eigentliche Druckauftrag auf einer neuen Seite gestartet wird (es sei denn, Sie haben die <literal>sf</literal>-Fähigkeit (<foreignphrase>suppress form feeds</foreignphrase>) des jeweiligen Druckers in <filename>/etc/printcap</filename> aktiviert).</para> <para>Wenn Sie dies wüschen, kann <application>LPD</application> auch nur ein <emphasis>kurzes Deckblatt</emphasis> ausgeben. Dazu verwenden Sie die Option <literal>sb</literal> (<foreignphrase>short banner</foreignphrase>) in <filename>/etc/printcap</filename>. Dadurch erhalten Sie ein Deckblatt ähnlich dem folgenden:</para> <screen>rose:kelly Job: outline Date: Sun Sep 17 11:07:51 1995</screen> <para>In der Voreinstellung druckt <application>LPD</application> zuerst das Deckblatt und danach den eigentlichen Druckauftrag. Um diese Reihenfolge umzukehren, geben Sie die Option <literal>hl</literal> (<foreignphrase>header last</foreignphrase>) in <filename>/etc/printcap</filename> ans.</para> </sect3> <sect3 id="printing-advanced-header-pages-accounting"> <title>Deckblätter verrechnen</title> <para>Wenn Sie die in <application>LPD</application> eingebaute Funktion zur Erstellung von Deckblättern verwenden, werden Sie auf folgendes Paradigma stoßen: Deckblätter müssen <emphasis>kostenlos</emphasis> sein.</para> <para>Warum ist das so?</para> <para>Weil der Ausgabefilter das einzige externe Programm ist, das zum Zeitpunkt der Erstellung des Deckblatts eine Verrechnung durchführen könnte. Da Ausgabefilter aber weder über <emphasis>Benutzer- noch über Rechnerinformationen</emphasis> verfügen, ist es nicht möglich, einen Druckauftrag einem bestimmten Benutzer zuzuordnen. Da ein Benutzer die Ausgabe von Deckblättern über <command>lpr <option>-h</option></command> unterdrücken kann, ist es auch nicht möglich, die Vorgabe <quote>verrechne eine zusätzliche Seite</quote> in den Text- oder Konvertierungsfilter (die über die zur Verrechnung nötigen Benutzer- und Rechnerinformationen verfügen) aufzunehmen, weil Benutzer sonst für Deckblätter bezahlen müssten, die sie nicht gedruckt haben.</para> <para>Es ist <emphasis>ebenfalls nicht ausreichend</emphasis>, jeden Filter eigene Deckblätter erzeugen zu lassen (und sie dadurch verrechnen zu können). Wollte ein Benutzer durch ein <command>lpr <option>-h</option></command> die Ausgabe eines Deckblattes unterdrücken, würde dieses nun trotzdem verrechnet werden, da <application>LPD</application> keine Informationen über die Verwendung der Option <option>-h</option> an einen Filter weitergibt.</para> <para>Welche Möglichkeiten habe ich nun?</para> <para>Sie können:</para> <itemizedlist> <listitem> <para>Das Paradigma von <application>LPD</application> einfach akzeptieren und die Deckblätter gratis abgeben.</para> </listitem> <listitem> <para>Eine alternatives Drucksystem wie <application>LPRng</application> installieren. Der Abschnitt <link linkend="printing-lpd-alternatives"> Alternativen zum Standard-Drucksystem</link> beschreibt verschiedene Drucksysteme, die <application>LPD</application> ersetzen können.</para> </listitem> <listitem> <para>Schreiben Sie einen <emphasis>intelligenten</emphasis> Ausgabefilter. Normalerweise kümmert sich ein Ausgabefilter nur um die Initialisierung des Druckers oder um eine einfache Zeichenkonvertierung. Außerdem eignet er sich für die Ausgabe von Deckblättern und normalem Text, wenn Sie keinen Text- oder Eingabefilter installiert haben. Haben Sie allerdings einen Textfilter installiert, verwendet <application>LPD</application> Ausgabefilter nur für die Ausgabe von Deckblättern. Ein Ausgabefilter kann den Text des von <application>LPD</application> erzeugten Deckblattes untersuchen, um festzustellen, welcher Benutzer und welcher Rechner den Druckauftrag gestartet hat. Leider weiß der Ausgabefilter auch mit dieser Methode nicht, welche Datei er zur Verrechnung verwenden soll (da der Name dieser Datei durch die <literal>af</literal>-Fähigkeit übergeben wird). Wenn Sie eine Standard-Verrechnungsdatei verwenden, können Sie diese in den Ausgabefilter einbauen. Um den Text des Deckblattes zu untersuchen, verwenden Sie die <literal>sh</literal>-Fähigkeit (<foreignphrase>short header</foreignphrase>) in <filename>/etc/printcap</filename>. Falls Ihnen das zuviel Aufwand ist, freuen sich Ihre Benutzer sicher darüber, wenn Sie ihnen den kostenlosen Druck von Deckblättern erlauben.</para> </listitem> </itemizedlist> </sect3> <sect3 id="printing-advanced-header-pages-ps"> <title>Deckblätter auf &postscript;-Druckern ausgeben</title> <para>In der Regel erzeugt <application>LPD</application> ein Deckblatt mit normalem Text, das für viele verschiedene Drucker geeignet ist. Da &postscript;-Drucker normalen Text aber nicht drucken können, ist die <application>LPD</application>-Funktion zur Erstellung von Deckblättern auf diesen Drucker relativ sinnlos.</para> <para>Es sei denn, jeder Text- und Konvertierungsfilter erzeugt über den Benutzer- und Rechnernamen sein eigenes, für den jeweiligen Drucker geeignetes Deckblatt. Das Problem dieser Methode ist allerdings, dass ein Anwender auch dann ein Deckblatt erhält, wenn er dies über <command>lpr <option>-h</option></command> verhindern wollte.</para> <para>Das folgende Skript benötigt drei Argumente (den Loginnamen des Benutzers, den Rechnernamen und den Namen des Druckauftrages), um daraus ein einfaches &postscript;-Deckblatt zu erzeugen:</para> <programlisting>#!/bin/sh # # make-ps-header - ein PostScript-Deckblatt auf stdout ausgeben # Installiert unter: /sr/local/libexec/make-ps-header # # # Die folgenden Werte sind PostScript-Einheiten (72 pro Zoll). # Passen Sie diese Werte für A4 oder die von Ihnen verwendete # Papiergröße an: # page_width=612 page_height=792 border=72 # # Argumente prüfen # if [ $# -ne 3 ]; then echo "Usage: `basename $0` <user> <host> <job>" 1>&2 exit 1 fi # # Diese Werte in Variablen speichern, damit der PostScript-Code # übersichtlicher wird. # user=$1 host=$2 job=$3 date=`date` # # Sende den PostScript-Code an stdout. # exec cat <<EOF %!PS % % Sicherstellen, dass es keine unerwünschten Wechselwirkungen mit % dem folgenden Druckauftrag gibt. % save % % Ziehe eine fette Umrandung. % $border $border moveto $page_width $border 2 mul sub 0 rlineto 0 $page_height $border 2 mul sub rlineto currentscreen 3 -1 roll pop 100 3 1 roll setscreen $border 2 mul $page_width sub 0 rlineto closepath 0.8 setgray 10 setlinewidth stroke 0 setgray % % Zeige den Benutzernamen groß und fett an. % /Helvetica-Bold findfont 64 scalefont setfont $page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto ($user) show % % Und nun zeige noch die Einzelheiten an. % /Helvetica findfont 14 scalefont setfont /y 200 def [ (Job:) (Host:) (Date:) ] { 200 y moveto show /y y 18 sub def } forall /Helvetica-Bold findfont 14 scalefont setfont /y 200 def [ ($job) ($host) ($date) ] { 270 y moveto show /y y 18 sub def } forall % % Das wars. % restore showpage EOF </programlisting> <para>Nun kann jeder Konvertierungs- oder Textfilter dieses Skript aufrufen, um zuerst das Deckblatt zu erzeugen und danach den Druckauftrag zu drucken. Das nächste Beispiel enthält den bereits beschriebenen DVI-Konvertierungsfilter, der hier um die Funktion zur Erzeugung eines Deckblatts erweitert wurde:</para> <programlisting>#!/bin/sh # # psdf - DVI-nach-PostScript - Druckerfilter # Installiert unter: /usr/local/libexec/psdf # # Wird von lpd aufgerufen, wenn der Benutzer lpr -d verwendet. # orig_args="$@" fail() { echo "$@" 1>&2 exit 2 } while getopts "x:y:n:h:" option; do case $option in x|y) ;; # Ignore n) login=$OPTARG ;; h) host=$OPTARG ;; *) echo "LPD started `basename $0` wrong." 1>&2 exit 2 ;; esac done [ "$login" ] || fail "No login name" [ "$host" ] || fail "No host name" ( /usr/local/libexec/make-ps-header $login $host "DVI File" /usr/local/bin/dvips -f ) | eval /usr/local/libexec/lprps $orig_args</programlisting> <para>Beachten Sie, dass der Filter die Liste der Argumente überprüft, um den Benutzer- und den Rechnernamen zu ermitteln. Dieser Vorgang ist prinzipiell für alle Filter identisch. Der Textfilter benötigt allerdings etwas andere Argumente, die im Abschnitt <link linkend="printing-advanced-filters">Die Funktionsweise von Filtern</link> beschrieben werden.</para> <para>Wie bereits erwähnt, deaktiviert diese Methode leider die <quote>suppress header page</quote>-Option (also die Option <option>-h</option>) von <command>lpr</command>. Benutzer können danach den Ausdruck eines Deckblattes nicht mehr verhindern, da der angepasste Filter zu jedem Druckauftrag automatisch ein Deckblatt erstellt.</para> <para>Damit ein Benutzer bei Bedarf den Ausdruck eines Deckblatts dennoch unterbinden kann, müssen Sie auch hier den im Abschnitt <link linkend="printing-advanced-header-pages-accounting"> Deckblätter verrechnen</link> beschriebenen Trick einsetzen: Schreiben Sie einen Ausgabefilter, der das von LPD erzeugte Deckblatt untersucht und daraus eine &postscript;-Version erzeugt. Wenn der Benutzer den Druckauftrag mit <command>lpr <option>-h</option></command> verschickt, erzeugt <application>LPD</application> kein Deckblatt, was in weiterer Folge auch für Ihren Ausgabefilter gilt. Soll hingegen ein Deckblatt erzeugt werden, liest der Ausgabefilter den von <application>LPD</application> übergebenen Text und erzeugt daraus ein für Ihren &postscript;-Drucker geeignetes Deckblatt.</para> <para>Haben Sie Ihren &postscript;-Drucker über eine serielle Verbindung angeschlossen, können Sie auch <command>lprps</command> verwenden. In diesem Paket ist mit <command>psof</command> auch ein Ausgabefilter enthalten, der die eben beschriebenen Funktionen übernehmen kann. Beachten Sie aber, dass Sie mit <command>psof</command> keine Deckblätter verrechnen können.</para> </sect3> </sect2> <sect2 id="printing-advanced-network-printers"> <title>Drucken über ein Netzwerk</title> <indexterm> <primary>Drucker</primary> <secondary>Netzwerk</secondary> </indexterm> <indexterm><primary>Netzwerkdruck</primary></indexterm> <para>&os; unterstützt das Drucken über ein Netzwerk, also den Versand von Druckaufträgen an einen entfernten Drucker. Man unterscheidet dabei zwei Möglichkeiten:</para> <itemizedlist> <listitem> <para>Den Zugriff auf einen an einem entfernten Rechner angeschlossenen Drucker. Sie konfigurieren dabei auf Ihrem System einen Drucker, der über eine konventionelle serielle oder parallele Verbindung an einem anderen Rechner angeschlossen ist. Danach richten Sie <application>LPD</application> auf dem entfernten System so ein, dass andere Drucker über das Netzwerk auf diesen Drucker zugreifen können. Der Abschnitt <link linkend="printing-advanced-network-rm">Auf entfernten Rechnern installierte Drucker</link> beschreibt, wie Sie dazu vorgehen müssen.</para> </listitem> <listitem> <para>Den Zugriff auf einen direkt an ein Netzwerk angeschlossenen Drucker. Ein solcher Drucker verfügt anstelle (oder zusätzlich zu) einer parallelen oder seriellen Schnittstelle über eine Netzwerkschnittstelle. Ein solcher Drucker kann sich auf zwei Arten verhalten:</para> <itemizedlist> <listitem> <para>Er kann das <application>LPD</application>-Protokoll direkt unterstützen und sogar Druckjobs von entfernten Rechner verwalten. In diesem Fall verhält sich der Drucker wie ein normaler Rechner, auf dem <application>LPD</application> läuft. Lesen Sie den Abschnitt <link linkend="printing-advanced-network-rm"> Auf entfernten Rechnern installierte Drucker</link>, um einen solchen Drucker einzurichten.</para> </listitem> <listitem> <para>Er könnte Verbindungen über ein Netzwerk unterstützen. In diesem Fall <quote>verbinden</quote> Sie den Drucker mit einem Rechner Ihres Netzwerks, der danach für die Verwaltung von Druckaufträgen sowie den tatsächlichen Druck verantwortlich ist. Der Abschnitt <link linkend="printing-advanced-network-net-if">Drucker mit direkter TCP-Schnittstelle</link> enthält Hinweise zur Installation derartiger Drucker.</para> </listitem> </itemizedlist> </listitem> </itemizedlist> <sect3 id="printing-advanced-network-rm"> <title>Auf entfernten Rechnern installierte Drucker</title> <para>Das <application>LPD</application>-Drucksystem unterstützt den Versand von Druckaufträgen an andere Rechner, auf denen entweder <application>LPD</application> läuft oder die zu <application>LPD</application> kompatibel sind. Dadurch können Sie einen Drucker auf einem Rechner installieren und von anderen Rechnern des Netzwerks darauf zugreifen. Außerdem werden Drucker mit direkter TCP-Schnittstelle unterstützt, wenn diese das <application>LPD</application>-Protokoll unterstützen.</para> <para>Um diese Art des Druckens über ein Netzwerk zu aktivieren, installieren Sie zuerst Ihren Drucker auf einem Rechner Ihres Netzwerks, dem sogenannten <emphasis>printer host</emphasis>. Die dazu nötigen Schritte werden im Abschnitt <link linkend="printing-simple"> Einfache Drucker-Konfiguration</link> beschrieben. Falls Sie eine erweiterte Druckerkonfiguration benötigen, sollten Sie auch den Abschnitt <link linkend="printing-advanced">Erweiterte Drucker-Konfiguration</link> lesen. Danach testen Sie, ob der Drucker alle von Ihnen aktivierten <application>LPD</application>-Fähigkeiten unterstützt. Stellen Sie auch sicher, dass Ihr <emphasis>lokales System</emphasis> berechtigt ist, den <application>LPD</application>-Dienst auf dem <emphasis>entfernten System</emphasis> zu nutzen (lesen Sie dazu den Abschnitt <link linkend="printing-advanced-restricting-remote"> Druckaufträge auf entfernten Druckern beschränken</link>).</para> <indexterm> <primary>Drucker</primary> <secondary>Netzwerk</secondary> </indexterm> <indexterm><primary>Netzwerkdrucker</primary></indexterm> <para>Wenn Sie einen Drucker mit einer zu <application>LPD</application> kompatiblen Netzwerkschnittstelle verwenden, handelt es sich beim <emphasis>printer host</emphasis> um den Drucker selbst, und der <emphasis>Druckername</emphasis> ist der von Ihnen für diesen Drucker vorgegebene Name. Lesen Sie die Dokumentation Ihres Druckers und/oder der Netzwerkschnittstelle Ihres Druckers, um dies zu klären.</para> <tip> <para>Wenn Sie einen Hewlett Packard Laserjet-Drucker verwenden, sorgt der Druckername <literal>text</literal> für eine automatische LF-zu-CRLF-Konvertierung. In diesem Fall wird das <filename>hpif</filename>-Skript nicht benötigt.</para> </tip> <para>Danach müssen Sie auf jedem Rechner, der auf diesen Drucker zugreifen soll, einen entsprechenden Eintrag in deren <filename>/etc/printcap</filename> aufnehmen. Dazu werden folgende Informationen benötigt:</para> <orderedlist> <listitem> <para>Der Name des Eintrags. Entspricht in der Regel dem Eintrag auf dem <emphasis>printer host</emphasis>.</para> </listitem> <listitem> <para>Lassen Sie den Eintrag für die <literal>lp</literal>-Fähigkeit leer, schreiben Sie also <literal>:lp=:</literal>.</para> </listitem> <listitem> <para>Erzeugen Sie ein Spooling-Verzeichnis und geben Sie dessen Pfad über die <literal>sd</literal>-Fähigkeit an. <application>LPD</application> speichert Ihre Druckaufträge in diesem Verzeichnis, bevor sie an den Drucker geschickt werden.</para> </listitem> <listitem> <para>Geben Sie den Namen des <emphasis>printer hosts</emphasis> über die <literal>rm</literal>-Fähigkeit an.</para> </listitem> <listitem> <para>Geben Sie den Namen des Druckers (auf dem <emphasis>printer host</emphasis>) über die <literal>rp</literal>-Fähigkeit an.</para> </listitem> </orderedlist> <para>Das ist alles. Sie benötigen weder Konvertierungsfilter, noch Seitengrößen oder sonstige Angaben in Ihrer lokalen <filename>/etc/printcap</filename>.</para> <para>Dazu ein Beispiel. Der Rechner <hostid>rose</hostid> verfügt über zwei Drucker, <literal>bamboo</literal> und <literal>rattan</literal>. Wir wollen nun allen Benutzern des Rechners <hostid>orchid</hostid> erlauben, diese Drucker zu verwenden. Es folgt nun wieder die bereits aus dem Abschnitt <link linkend="printing-advanced-header-pages-enabling"> Deckblätter verwenden</link> bekannte <filename>/etc/printcap</filename> für den Rechner <hostid>orchid</hostid>. Diese enthielt bereits einen Eintrag für den Drucker <literal>teak</literal>. Zusätzlich tragen wir nun die zwei Drucker des Rechners <hostid>rose</hostid> ein:</para> <programlisting># # /etc/printcap für den Rechner orchid - mit zusätzlichen # Einträgen für die (entfernten) Drucker auf dem Rechner rose # # # teak ist ein lokaler Drucker und direkt mit orchid verbunden: # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:sd=<filename class="directory">/var/spool/lpd/teak</filename>:mx#0:\ :if=<filename>/usr/local/libexec/ifhp</filename>:\ :vf=<filename>/usr/local/libexec/vfhp</filename>:\ :of=<filename>/usr/local/libexec/ofhp</filename>: # # rattan ist mit rose verbunden, Druckaufträge für rattan gehen daher # an den Rechner rose: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=<filename class="directory">/var/spool/lpd/rattan</filename>: # # bamboo ist ebenfalls mit rose verbunden: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:</programlisting> <para>Nun müssen wir nur noch die Spooling-Verzeichnisse auf dem Rechner <hostid>orchid</hostid> erzeugen:</para> <screen>&prompt.root; <userinput><command>mkdir <option>-p</option> <filename class="directory">/var/spool/lpd/rattan</filename> <filename class="directory">/var/spool/lpd/bamboo</filename></command></userinput> &prompt.root; <userinput><command>chmod 770 <filename class="directory">/var/spool/lpd/rattan</filename> <filename class="directory">/var/spool/lpd/bamboo</filename></command></userinput> &prompt.root; <userinput><command>chown daemon:daemon <filename class="directory">/var/spool/lpd/rattan</filename> <filename class="directory">/var/spool/lpd/bamboo</filename></command></userinput></screen> <para>Damit können Benutzer des Rechners <hostid>orchid</hostid> die Drucker <literal>rattan</literal> und <literal>bamboo</literal> verwenden. Ein Benutzer gibt auf <hostid>orchid</hostid> beispielsweise ein:</para> <screen>&prompt.user; <userinput><command>lpr <option>-P</option> bamboo <option>-d</option> <filename><replaceable>sushi-review.dvi</replaceable></filename></command></userinput></screen> <para>Die Anwendung <application>LPD</application> auf dem Rechner <hostid>orchid</hostid> kopiert daraufhin den Druckauftrag in das Spooling-Verzeichnis <filename class="directory">/var/spool/lpd/bamboo</filename> und stellt fest, dass es sich um einen DVI-Auftrag handelt. Sobald <hostid>rose</hostid> über genug freien Platz im <literal>bamboo</literal>-Spooling-Verzeichnis verfügt, würden die beiden <application>LPD</application> die Datei auf den Rechner <hostid>rose</hostid> transferieren. Diese Datei verbleibt danach in der Druckerwarteschlange des Rechners <hostid>rose</hostid>, bis der Ausdruck der Datei abgeschlossen ist. Vor dem Ausdruck würde die Datei noch von DVI nach &postscript; konvertiert werden, da es sich bei <literal>bamboo</literal> um einen an den Rechner <hostid>rose</hostid> angeschlossenen &postscript;-Drucker handelt.</para> </sect3> <sect3 id="printing-advanced-network-net-if"> <title>Drucker mit direkter TCP-Schnittstelle</title> <para>Wenn Sie eine Netzwerkkarte für Ihren Drucker kaufen, können Sie zwei verschiedene Versionen wählen: Eine Version, die ein Drucksystem emuliert (die teure Version), oder eine Version, die sich verhält, als wäre der Drucker an eine serielle oder parallele Schnittstelle angeschlossen (die billige Version). Dieser Abschnitt beschreibt die billige Variante. Bevorzugen Sie die teure Variante, sollten Sie den Abschnitt <link linkend="printing-advanced-network-rm">Auf entfernten Rechnern installierte Drucker</link> nochmals lesen.</para> <para>Das Format der Datei <filename>/etc/printcap</filename> erlaubt es Ihnen, anzugeben, welche serielle oder parallele Schnittstelle verwendet werden soll und (falls Sie eine serielle Schnittstelle verwenden) welche Parameter (Baudrate, Flußkontrolle, Behandlung von Tabulatoren, Konvertierung von neuen Zeilen und andere mehr) Sie verwenden wollen. Es gibt allerdings keine Möglichkeit, eine Verbindung zu einem Drucker zu definieren, der einen TCP/IP- oder einem anderem Netzwerkport auf Druckaufträge hin abfragt.</para> <para>Um Daten an einen Netzwerkdrucker zu schicken, müssen Sie daher ein Kommunikationsprogramm entwickeln, das von Text- und Konvertierungsfiltern aufgerufen werden kann. Dazu ein Beispiel. Das Skript <command>netprint</command> übernimmt alle Daten von der Standardeingabe und schickt sie an einen Netzwerkdrucker. <command>netprint</command> erwartet zwei Argumente: Als erstes Argument wird der Hostname des Druckers und als zweites Argument der Port, über den die Verbindung erfolgen soll, übergeben. Dabei handelt sich allerdings um eine Ein-Wege-Kommunikation (von &os; zum Drucker). Viele Netzwerkdrucker unterstützen aber auch eine Zwei-Wege-Kommunikation, deren Vorteile (Abfrage des Druckerstatus, die Verrechnung von Druckaufträgen und andere mehr) Sie vielleicht nutzen wollen.</para> <programlisting>#!/usr/bin/perl # # netprint - Textfilter für einen Netzwerkdrucker # Installiert unter: /usr/local/libexec/netprint # $#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>"; $printer_host = $ARGV[0]; $printer_port = $ARGV[1]; require 'sys/socket.ph'; ($ignore, $ignore, $protocol) = getprotobyname('tcp'); ($ignore, $ignore, $ignore, $ignore, $address) = gethostbyname($printer_host); $sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address); socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol) || die "Can't create TCP/IP stream socket: $!"; connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!"; while (<STDIN>) { print PRINTER; } exit 0; </programlisting> <para>Dieses Skript kann für verschiedene Filter eingesetzt werden. Das folgende Beispiel verwendet den an ein Netzwerk angeschlossenen Zeilendrucker Diablo 750-N. Dieser Drucker empfängt zu druckende Daten auf dem Port 5100. Der Hostname des Druckers lautet <hostid>scrivener</hostid>. Daher sieht der Textfilter für diesen Drucker wie folgt aus:</para> <programlisting>#!/bin/sh # # diablo-if-net - Textfilter für den Diablo-Drucker `scrivener'. # Drucker lauscht auf Port 5100. # Installiert unter: /usr/local/libexec/diablo-if-net # exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100</programlisting> </sect3> </sect2> <sect2 id="printing-advanced-restricting"> <title>Den Druckerzugriff beschränken</title> <indexterm> <primary>Drucker</primary> <secondary>den Zugriff beschränken</secondary> </indexterm> <para>Dieser Abschnitt beschreibt, wie Sie den Druckerzugriff beschränken können. Das <application>LPD</application>-Drucksystem erlaubt Ihnen die Kontrolle darüber, wer lokal oder über ein Netzwerk auf einen Drucker zugreifen darf, ob mehrere Kopien erstellt werden dürfen und wie groß Druckaufträge und Druckerwarteschlangen werden dürfen.</para> <sect3 id="printing-advanced-restricting-copies"> <title>Den Ausdruck von mehreren Kopien verhindern</title> <para>Das <application>LPD</application>-System macht es dem einzelnen Benutzer einfach, mehrere Kopien einer Datei zu drucken. So werden mit <command>lpr <option>-#5</option></command> beispielsweise fünf Kopien jeder Datei des Druckauftrags erstellt. Ob dies gut oder schlecht ist, müssen Sie selbst entscheiden.</para> <para>Wenn Sie der Meinung sind, dass multiple Kopien eine unnötige Beanspruchung Ihres Druckers darstellen, sollten Sie die <option>-#</option>-Opion von &man.lpr.1; deaktivieren, indem Sie die <literal>sc</literal>-Fähigkeit in Ihre <filename>/etc/printcap</filename> aufnehmen. Verwendet ein Benutzer dennoch die Option <option>-#</option>, erhält er daraufhin folgende Meldung:</para> <screen>lpr: multiple copies are not allowed</screen> <para>Wenn Sie den Zugriff auf einen entfernten Drucker (wie in Abschnitt <link linkend="printing-advanced-network-rm">Auf entfernten Rechnern installierte Drucker</link> beschrieben) konfiguriert haben, müssen Sie die <literal>sc</literal>-Fähigkeit auch auf den entfernten Rechnern, die auf Ihren Drucker zugreifen dürfen, in <filename>/etc/printcap</filename> eintragen, damit Benutzer diese Vorgabe nicht durch den Wechsel auf einen anderen Rechner umgehen können.</para> <para>Dazu ein Beispiel. Es handelt sich dabei um die Datei <filename>/etc/printcap</filename> auf dem Rechner <hostid>rose</hostid>. Der Drucker <literal>rattan</literal> soll multiple Kopien zulassen, auf dem Laserdrucker <literal>bamboo</literal> sollen multiple Kopien hingegen nicht erlaubt sein, daher müssen wir für diesen Drucker die <literal>sc</literal>-Fähigkeit aktivieren:</para> <programlisting># # /etc/printcap für den Rechner rose - multiple Kopien auf bamboo verbieten # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:\ :if=<filename>/usr/local/libexec/if-simple</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:sc:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:\ :if=<filename>/usr/local/libexec/psif</filename>:\ :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting> <para>Außerdem müssen wir noch die <literal>sc</literal>-Fähigkeit in der Datei <filename>/etc/printcap</filename> des Rechners <hostid>orchid</hostid> aktivieren. Parallel dazu untersagen wir das Erstellen von multiplen Kopien auf dem Drucker <literal>teak</literal>:</para> <programlisting># # /etc/printcap für den Rechner orchid - lokal machen wir keine multiplen Kopien # Lokaler Drucker teak oder entfernter Drucker bamboo: teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:sd=<filename class="directory">/var/spool/lpd/teak</filename>:mx#0:sc:\ :if=<filename>/usr/local/libexec/ifhp</filename>:\ :vf=<filename>/usr/local/libexec/vfhp</filename>:\ :of=<filename>/usr/local/libexec/ofhp</filename>: rattan|line|diablo|lp|Diablo 630 Line Printer:\ :lp=:rm=rose:rp=rattan:sd=<filename class="directory">/var/spool/lpd/rattan</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :lp=:rm=rose:rp=bamboo:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:sc:</programlisting> <para>Durch die Verwendung der <literal>sc</literal>-Fähigkeit ist zwar die Verwendung von <command>lpr <option>-#</option></command> nicht mehr möglich, ein Benutzer kann aber weiterhin &man.lpr.1; mehrmals hintereinander aufrufen oder eine Datei mehrfach in den gleichen Druckauftrag aufnehmen:</para> <screen>&prompt.user; <userinput>lpr <filename><replaceable>forsale.sign forsale.sign forsale.sign forsale.sign forsale.sign</replaceable></filename></userinput></screen> <para>Auch dieser Mißbrauch Ihres Druckers kann verhindert werden, falls Sie dies wünschen. Diese Maßnahmen werden in diesem Abschnitt allerdings nicht behandelt.</para> </sect3> <sect3 id="printing-advanced-restricting-access"> <title>Den Zugriff auf bestimmte Drucker beschränken</title> <para>Sie können angeben, wer auf welchem Drucker drucken darf, wenn Sie den Gruppenmechanismus von &unix; in Kombination mit der <literal>rg</literal>-Fähigkeit von <filename>/etc/printcap</filename> einsetzen. Weisen Sie dazu alle Benutzer, die auf einen Drucker zugreifen dürfen, einer gemeinsamen Gruppe zu und geben Sie diese Gruppe über die <literal>rg</literal>-Fähigkeit an.</para> <para>Wenn Benutzer, die dieser Gruppe nicht angehören (dies gilt auch für <username>root</username>), werden diese durch die Meldung begrüsst, wenn Sie diesen Drucker verwenden wollen.</para> <screen>lpr: Not a member of the restricted group</screen> <para>Analog zur <literal>sc</literal>-Fähigkeit (<emphasis>suppress multiple copies</emphasis>) müssen Sie die <literal>rg</literal>-Fähigkeit auch auf allen entfernten Rechnern aktivieren, die auf Ihren Drucker zugreifen dürfen (lesen Sie dazu auch den Abschnitt <link linkend="printing-advanced-network-rm">Auf entfernten Rechnern installierte Drucker</link>).</para> <para>Wollen wir beispielsweise allen Benutzern die Verwendung des Druckers <literal>rattan</literal>, aber nur Mitgliedern der Gruppe <groupname>artists</groupname> die Verwendung des Druckers <literal>bamboo</literal> erlauben, passen wir die bereits bekannte <filename>/etc/printcap</filename> des Rechners <hostid>rose</hostid> entsprechend an:</para> <programlisting># # /etc/printcap des Rechners rose - Zugriffsbeschränkung für bamboo # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:\ :if=<filename>/usr/local/libexec/if-simple</filename>: bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:sc:rg=artists:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:\ :if=<filename>/usr/local/libexec/psif</filename>:\ :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting> <para>Die Datei <filename>/etc/printcap</filename> des Rechners <hostid>orchid</hostid> wird dadurch nicht beeinflusst. Jeder Benutzer des Rechners <hostid>orchid</hostid> kann also weiterhin den Drucker <literal>bamboo</literal> verwenden.</para> <note> <para>Für jeden Drucker kann nur eine einzige priviligierte Gruppe erstellt werden.</para> </note> </sect3> <sect3 id="printing-advanced-restricting-sizes"> <title>Die Größe von Druckaufträgen kontrollieren</title> <indexterm><primary>Druckaufträge</primary></indexterm> <para>Wenn Sie viele Benutzer haben, die Ihre Drucker verwenden dürfen, werden Sie wahrscheinlich eine Obergrenze für Dateien angeben wollen, die Benutzer an Ihren Drucker senden dürfen. Dies ist sinnvoll, weil Speicherplatz für Spooling-Verzeichnisse nur begrenzt verfügbar ist und Sie stets sicherstellen müssen, dass auch die Druckaufträge anderer Benutzer verarbeitet werden können.</para> <indexterm> <primary>Druckauftrag</primary> <secondary>kontrollieren</secondary> </indexterm> <para><application>LPD</application> verwendet die <literal>mx</literal>-Fähigkeit, um die maximal erlaubte Größe von Dateien eines Druckauftrags anzugeben. Dieser Wert wird in 1.024 Bytes großen <literal>BUFSIZ</literal>-Blöcken angegeben. Setzen Sie diesen Wert auf Null, gibt es keine Größenbeschränkung. Existiert die <literal>mx</literal>-Fähigkeit hingegen überhaupt nicht, so gilt ein Limit von 1.000 Blöcken.</para> <note> <para>Diese Limits gelten nur für die Größe von <emphasis>Dateien</emphasis> innerhalb eines Druckauftrages, <emphasis>nicht aber</emphasis> für die Gesamtgröße des Druckauftrags.</para> </note> <para><application>LPD</application> lehnt eine Datei auch dann nicht ab, wenn sie das Limit des Druckers überschreitet. Vielmehr wird die Datei bis zum Erreichen des Limits in die Warteschlange geladen, danach wird der Druck gestartet. Der das Limit überschreitende Rest wird hingegen verworfen und nicht gedruckt!</para> <para>Mit diesem Wissen können wir nun Limits für die Drucker <literal>rattan</literal> und <literal>bamboo</literal> definieren. Da &postscript;-Dateien der Gruppe <groupname>artists</groupname> in der Regel sehr groß sind, setzen wir ein Limit von fünf Megabytes. Für den Druck von normalen Text (auf dem Drucker <literal>rattan</literal>) setzen wir hingegen kein Limit:</para> <programlisting># # /etc/printcap für den Rechner rose # # # Kein Größenlimit: # rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:mx#0:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:\ :if=<filename>/usr/local/libexec/if-simple</filename>: # # Ein Limit von 5 Megabyte: # bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:sc:rg=artists:mx#5000:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:\ :if=<filename>/usr/local/libexec/psif</filename>:\ :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting> <para>Auch diese Limits gelten nur für lokale Benutzer. Wenn Sie den Zugriff auf Ihren Drucker auch über ein Netzwerk erlauben wollen, unterliegen die Benutzer dieser Rechner diesen Limits nicht. Daher müssen Sie diese Limits über die <literal>mx</literal>-Fähigkeit auch in der <filename>/etc/printcap</filename> jedes Rechners definieren, der Ihren Drucker verwenden darf. Der Abschnitt <link linkend="printing-advanced-network-rm"> Auf entfernten Rechnern installierte Drucker</link> enthält weitere Informationen zum Drucken über ein Netzwerk.</para> <para>Es gibt eine weitere Möglichkeit, um die Größe von Druckaufträgen von entfernten Rechnern zu beschränken. Lesen Sie dazu den Abschnitt <link linkend="printing-advanced-restricting-remote"> Druckaufträge von entfernten Rechnern beschränken</link>.</para> </sect3> <sect3 id="printing-advanced-restricting-remote"> <title>Druckaufträge von entfernten Rechnern beschränken</title> <para>Das <application>LPD</application>-System bietet mehrere Möglichkeiten, um Druckaufträge zu beschränken, die auf entfernten Rechnern gestartet wurden:</para> <variablelist> <varlistentry> <term>Rechner beschränken</term> <listitem> <para>Sie können festlegen, von welchen entfernten Rechnern ein lokaler <application>LPD</application> Druckaufträge annimmt, indem Sie die Dateien <filename>/etc/hosts.equiv</filename> sowie <filename>/etc/hosts.lpd</filename> entsprechend anpassen. <application>LPD</application> überprüft diese Dateien, um festzustellen, ob ein Druckauftrag von einem Rechner stammt, der in einer dieser Dateien aufgeführt ist. Ist dies nicht der Fall, lehnt <application>LPD</application> den Druckauftrag ab.</para> <para>Der Aufbau dieser Datei ist sehr einfach: Jede Zeile enthält einen einzigen Rechnernamen. Beachten Sie aber, dass <filename>/etc/hosts.equiv</filename> auch vom &man.ruserok.3;-Protokoll benötigt wird und Änderungen dieser Datei auch Programme wie &man.rsh.1; und &man.rcp.1; beeinflussen können.</para> <para>Das folgende Beispiel beschreibt die Datei <filename>/etc/hosts.lpd</filename> auf dem Rechner <hostid>rose</hostid>:</para> <programlisting>orchid violet madrigal.fishbaum.de</programlisting> <para>Durch diese Vorgaben akzeptiert <hostid>rose</hostid> nur noch Druckaufträge von den Rechnern <hostid>orchid</hostid>, <hostid>violet</hostid>, und <hostid role="fqdn">madrigal.fishbaum.de</hostid>. Versucht ein anderer Rechner, auf den <application>LPD</application> von <hostid>rose</hostid> zuzugreifen, wird dieser Druckauftrag abgelehnt werden.</para> </listitem> </varlistentry> <varlistentry> <term>Größenbeschränkungen</term> <listitem> <para>Sie können festlegen, wieviel Speicherplatz auf dem Dateisystem, in dem das Spooling-Verzeichnis liegt, mindestens frei sein muss. Dazu erzeugen Sie im Spooling-Verzeichnis Ihres lokalen Druckers die Datei <filename>minfree</filename>. In dieser Datei geben Sie an, wieviele 512 Byte große Blöcke auf Ihrer Platte frei sein müssen, damit ein Druckauftrag von einem entfernten Rechner akzeptiert wird.</para> <para>Durch diese Vorgabe können Sie sicherstellen, dass Benutzer von entfernten Rechnern Ihr Dateisystem nicht <quote>zumüllen</quote>. Außerdem können Sie damit lokale Benutzer bevorzugen, da diese auch dann noch Druckaufträge erteilen dürfen, wenn der verfügbare Plattenplatz unter das in der Datei <filename>minfree</filename> definierte Limit gefallen ist.</para> <para>Legen wir nun die Datei <filename>minfree</filename> für den Drucker <literal>bamboo</literal> an. Zuerst untersuchen wir <filename>/etc/printcap</filename>, um das Spooling-Verzeichnis für diesen Drucker zu finden. Das folgende Beispiel zeigt den Eintrag für den Drucker <literal>bamboo</literal>:</para> <programlisting>bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\ :sh:sd=<filename class="directory">/var/spool/lpd/bamboo</filename>:sc:rg=artists:mx#5000:\ :lp=<filename class="devicefile">/dev/ttyu5</filename>:ms#-parenb cs8 clocal crtscts:rw:mx#5000:\ :if=<filename>/usr/local/libexec/psif</filename>:\ :df=<filename>/usr/local/libexec/psdf</filename>:</programlisting> <para>Das Spooling-Verzeichnis wird über die <literal>sd</literal>-Fähigkeit festgelegt. Wir wollen, dass mindestens drei Megabyte (also 6144 Blöcke) freier Plattenplatz vorhanden sein müssen, damit <application>LPD</application> einen Druckauftrag von einem entfernten Rechner akzeptiert:</para> <screen>&prompt.root; <userinput><command>echo 6144 > <filename>/var/spool/lpd/bamboo/minfree</filename></command></userinput></screen> </listitem> </varlistentry> <varlistentry> <term>Benutzer beschränken</term> <listitem> <para>Sie können auch festlegen, welche entfernten Benutzer Ihren lokalen Drucker verwenden dürfen, indem Sie die <literal>rs</literal>-Fähigkeit in <filename>/etc/printcap</filename> definieren. Wenn für den Eintrag eines lokalen Druckers die <literal>rs</literal>-Fähigkeit definiert ist, akzeptiert <application>LPD</application> Druckaufträge von entfernten Rechnern nur dann, <emphasis>wenn</emphasis> der Benutzer, der den Druckauftrag gesendet hat, auch über ein gleichnamiges Benutzerkonto auf dem lokalen Rechner verfügt. Ist dies nicht der Fall, lehnt <application>LPD</application> den Druckauftrag ab.</para> <para>Diese Fähigkeit ist besonders in Umgebungen nützlich, in denen beispielsweise verschiedene Abteilungen ein gemeinsames Netzwerk teilen, wobei einige Benutzer zu mehreren Abteilungen gehören. Haben diese Benutzer auch ein Benutzerkonto auf Ihrem System, so können sie Ihren Drucker auch von ihrer eigenen Abteilung aus nutzen. Wollen Sie zwar den Zugriff auf Ihren Drucker, <emphasis>nicht aber</emphasis> den Zugriff auf Ihre übrigen Ressourcen erlauben, können Sie für diese Benutzer einen sogenannten <quote>Token-Account</quote> ohne Heimatverzeichnis und mit einer nutzlosen Shell wie <filename>/usr/bin/false</filename> erstellen.</para> </listitem> </varlistentry> </variablelist> </sect3> </sect2> <sect2 id="printing-advanced-acct"> <title>Die Druckernutzung verrechnen</title> <indexterm> <primary>Drucker</primary> <secondary>verrechnen</secondary> </indexterm> <para>Sie wollen die Nutzung Ihrer Drucker kostenpflichtig machen? Warum auch nicht? Papier und Tinte kosten Geld. Auch eine regelmäßige Wartung muss bezahlt werden. Nachdem Sie einen Preis festgelegt haben, den Sie für jede gedruckte Seite verrechnen wollen, stellt sich die Frage, wie Sie die Verrechnung der Druckkosten technisch umsetzen können.</para> <para>Die schlechte Nachricht ist, dass das <application>LPD</application>-System dabei wenig hilfreich ist. Die Verrechnung von Druckaufträgen hängt stark vom verwendeten Drucker, den zu druckenden Dateiformaten und <emphasis>Ihren</emphasis> Anforderungen an die Verrechnung der Druckernutzung ab.</para> <para>Um die Verrechnung der Druckernutzung zu implementieren, müssen Sie sowohl Ihre Textfilter (um den Druck von normalem Text abzurechnen) als auch Ihre Konvertierungsfilter (um den Druck sonstiger Formate abzurechnen) entsprechend anpassen, damit diese die Zahl der gedruckten Seiten ermitteln können. Leider können Sie dazu nicht einen einfachen Ausgabefilter verwenden, da diese die Verrechnung von Druckaufträgen nicht unterstützen. Weitere Informationen zu den verschiedenen Filterarten finden Sie im Abschnitt <link linkend="printing-advanced-filter-intro">Filter</link>.</para> <para>Prinzipiell gibt es zwei Möglichkeiten, wie Sie diese Verrechnung umsetzen können:</para> <itemizedlist> <listitem> <para>Die <emphasis>periodische Verrechnung</emphasis> wird häufiger verwendet, da sie einfacher zu implementieren ist. Wenn ein Druckauftrag ausgeführt wird, schreibt der Filter den Benutzer, den verwendeten Rechner sowie die Anzahl der gedruckten Seiten in eine Verrechnungsdatei. Nach einem zu definierenden Zeitraum werden diese Dateien ausgewertet, die Gesamtzahl der von einem Benutzer gedruckten Seiten bestimmt und dem jeweiligen Benutzer verrechnet. Danach werden alle Protokolldateien zurückgesetzt, und die Protokollierung beginnt von Neuem.</para> </listitem> <listitem> <para>Die <emphasis>unmittelbare Verrechnung</emphasis> wird nur selten eingesetzt, das sie schwieriger zu implementieren ist. Bei dieser Methode wird der Druckauftrag verrechnet, sobald der Drucker verwendet wird. Dadurch können Sie beispielsweise verhindern, dass ein Benutzer seine erlaubte <quote>Druckquote</quote> überschreitet. Zusätzlich können Sie es Ihren Benutzern erlauben, deren Druckquote abzufragen oder anzupassen. Allerdings benötigen Sie eine Datenbank, um Benutzer und deren Quoten verwalten zu können.</para> </listitem> </itemizedlist> <para>Das <application>LPD</application>-Drucksystem unterstützt beide Methoden. Allerdings müssen Sie die benötigen Filter sowie den zur Verrechnung nötigen Code selbst bereitstellen. Der Vorteil dabei ist allerdings, dass Sie in der Wahl Ihrer Verrechnungsmethode äußerst flexibel sind. So können Sie sich etwa für die periodische oder die unmittelbare Verrechnung entscheiden. Sie können festlegen, welche Informationen Sie erfassen wollen: Benutzernamen, Rechnernamen, die Art der Druckaufträge, die Anzahl der gedruckten Seiten, den Papierverbrauch, den Zeitaufwand für die Bearbeitung eines Druckauftrages und viele andere mehr. Dazu müssen Sie Ihre Filter entsprechend anpassen, damit diese Informationen erfassst und gespeichert werden.</para> <sect3> <title>Kurzanleitung für die Implementierung der Druckerverrechnung</title> <para>&os; bietet Ihnen zwei Programme, um eine periodische Verrechnung rasch zu implementieren. Dabei handelt es sich um den im Abschnitt <link linkend="printing-advanced-lpf">lpf: Ein Textfilter</link> behandelten Textfilter sowie um &man.pac.8;, ein Programm, mit dem Sie Einträge aus Verrechnungsdateien auslesen und aufsummieren können.</para> <para>Wie bereits im Abschnitt <link linkend="printing-advanced-filters">Filter</link> erwähnt, startet <application>LPD</application> den Text- oder Konvertierungsfilter mit dem Namen der Verrechnungsdatei als Argument. Dadurch weiß der Filter, in welche Datei er einen Verrechnungseintrag schreiben soll. Der Name dieser Datei wird über die <literal>af</literal>-Fähigkeit in <filename>/etc/printcap</filename> festgelegt. Falls die Datei nicht über einen absoluten Pfad angegeben wird, handelt es sich um einen Pfad relativ zum Spooling-Verzeichnis.</para> <para><application>LPD</application> startet <command>lpf</command> mit den Argumenten <emphasis>page width und page length</emphasis>, die über die <literal>pw</literal>- und <literal>pl</literal>-Fähigkeit definiert werden. Das Kommando <command>lpf</command> verwendet diese Argumente danach, um den Papierverbrauch zu bestimmen. Nachdem die Datei an den Drucker geschickt wurde, wird ein Verrechnungseintrag in die Verrechnungsdatei geschrieben. Ein solcher Eintrag sieht dabei ähnlich den folgenden aus:</para> <programlisting>2.00 rose:andy 3.00 rose:kelly 3.00 orchid:mary 5.00 orchid:mary 2.00 orchid:zhang</programlisting> <para>Sie sollten für jeden Drucker eine eigene Verrechnungsdatei verwenden, da <command>lpf</command> die Verrechnungsdatei nicht sperren kann. Sind also gleichzeitig zwei <command>lpf</command>-Instanzen aktiv, kann es dazu kommen, dass Ihre Verrechnungsdatei zerstört wird, wenn beide Instanzen gleichzeitig in die gleiche Datei schreiben. Damit für jeden Drucker eine eigene Verrechnungsdatei angelegt wird, fügen Sie den Eintrag <literal>af=acct</literal> in <filename>/etc/printcap</filename> ein. Dadurch wird für jeden Drucker eine separate Verrechnungsdatei mit dem Namen <filename>acct</filename> im Spooling-Verzeichnis des jeweiligen Druckers erzeugt.</para> <para>Wenn Sie Ihre Daten erfasst haben und die entstandenen Kosten Ihren Benutzern verrechnen wollen, starten Sie &man.pac.8;. Dazu wechseln Sie in das Spooling-Verzeichnis des auszuwertenden Druckers und geben <command>pac</command> ein. Dadurch erhalten Sie eine Ausgabe ähnlich der folgenden:</para> <screen> Login pages/feet runs price orchid:kelly 5.00 1 $ 0.10 orchid:mary 31.00 3 $ 0.62 orchid:zhang 9.00 1 $ 0.18 rose:andy 2.00 1 $ 0.04 rose:kelly 177.00 104 $ 3.54 rose:mary 87.00 32 $ 1.74 rose:root 26.00 12 $ 0.52 total 337.00 154 $ 6.74</screen> <para>Folgende Argumente können an &man.pac.8; übergeben werden:</para> <variablelist> <varlistentry> <term><option>-P<replaceable>Drucker</replaceable></option></term> <listitem> <para>Gibt an, welcher <replaceable>Drucker</replaceable> ausgewertet werden soll. Diese Option setzt voraus, dass für die <literal>af</literal>-Fähigkeit in <filename>/etc/printcap</filename> ein absoluter Pfad angegeben wurde.</para> </listitem> </varlistentry> <varlistentry> <term><option>-c</option></term> <listitem> <para>Sortiert die Ausgabe nach den verursachten Kosten anstelle einer alphabetischen Sortierung der Benutzernamen.</para> </listitem> </varlistentry> <varlistentry> <term><option>-m</option></term> <listitem> <para>Ignoriert den Rechnernamen in Verrechnungsdateien. Ist diese Option gesetzt, ist der Benutzer <username>smith</username> auf dem Rechner <hostid>alpha</hostid> mit dem Benutzer <username>smith</username> auf dem Rechner <hostid>gamma</hostid> identisch. Ist diese Option nicht gesetzt, handelt es sich um unterschiedliche Benutzer.</para> </listitem> </varlistentry> <varlistentry> <term><option>-p<replaceable>Preis</replaceable></option></term> <listitem> <para>Berechnet die entstandenen Kosten aus dem <replaceable>Preis</replaceable> in Dollar pro Seite statt aus dem über die <literal>pc</literal>-Fähigkeit in <filename>/etc/printcap</filename> definierten Preis. In der Voreinstellung sind dies zwei Cent pro Seite. Sie können aber auch einen eigenen <replaceable>Preis</replaceable> in Form einer Gleitkommazahl angeben.</para> </listitem> </varlistentry> <varlistentry> <term><option>-r</option></term> <listitem> <para>Die Sortierreihenfolge umkehren.</para> </listitem> </varlistentry> <varlistentry> <term><option>-s</option></term> <listitem> <para>Die Verrechnungsdatei in einer neuen Datei aufsummieren und die originale Verrechnungsdatei zurücksetzen.</para> </listitem> </varlistentry> <varlistentry> <term><replaceable>name</replaceable> <replaceable>…</replaceable></term> <listitem> <para>Verrechnungsinformationen nur für die angegebenen Benutzernamen ausgeben.</para> </listitem> </varlistentry> </variablelist> <para>In der Voreinstellung gibt &man.pac.8; aus, wieviele Seiten von welchem Benutzer auf welchem Rechner gedruckt wurden. Wenn Rechnernamen für Sie uninteressant sind (weil sich Benutzer beispielsweise auf jedem Rechner anmelden können), sollten Sie <command>pac <option>-m</option></command> verwenden, um die folgende Ausgabe zu erhalten:</para> <screen> Login pages/feet runs price andy 2.00 1 $ 0.04 kelly 182.00 105 $ 3.64 mary 118.00 35 $ 2.36 root 26.00 12 $ 0.52 zhang 9.00 1 $ 0.18 total 337.00 154 $ 6.74</screen> <para>Um den zu verrechnenden Betrag zu ermitteln, verwendet &man.pac.8; die <literal>pc</literal>-Fähigkeit von <filename>/etc/printcap</filename> (Voreinstellung 200, dieser Wert entspricht 2 Cents). Geben Sie hier (als Hundertfaches des tatsächlichen Wertes) den Preis pro Seite an, den Sie verrechnen wollen. Sie können diesen Wert überschreiben, wenn Sie &man.pac.8; mit der Option <option>-p</option> ausführen. Beachten Sie dabei aber, dass Sie in diesem Fall die Einheiten in Dollar angeben, und nicht als Hundertfaches des tatsächlichen Cent-Betrages. So steht</para> <screen>&prompt.root; <userinput><command>pac <option>-p1.50</option></command></userinput></screen> <para>beispielsweise für einen Preis von einem Dollar und fünfzig Cent pro Seite.</para> <para>Der Aufruf von <command>pac <option>-s</option></command> führt schließlich dazu, dass die aufsummierten Informationen in einer eigenen Auswertedatei gespeichert werden. Diese hat den gleichen Namen wie die Verrechnungsdatei, es wird lediglich ein <literal>_sum</literal> an den Dateinamen angehängt. Danach wird die Verrechnungsdatei zurückgesetzt. Wenn Sie &man.pac.8; erneut aufrufen, wird die Auswertedatei eingelesen, um die Startbeträge zu erhalten, alle weiteren Informationen stammen danach aus der normalen Verrechnungsdatei.</para> </sect3> <sect3> <title>Wie kann man die Anzahl der gedruckten Seiten ermitteln?</title> <para>Um die Druckernutzung auch nur annähernd genau verrechnen zu können, müssen Sie ermitteln, wieviel Papier ein Druckauftrag verbraucht. Die Bestimmung dieses Wertes ist das zentrale Problem, das Sie lösen müssen, wenn Sie Druckaufträge kostenpflichtig machen wollen.</para> <para>Normaler Text stellt in der Regel kein Problem dar: Sie zählen dazu nur die Zeilen des Druckauftrages und dividieren diesen Wert durch die Anzahl der Zeilen pro Seite, die Ihr Drucker bietet. Allerdings dürfen Sie dabei nicht vergessen, dass gelöschte Zeichen (<foreignphrase>Backspaces</foreignphrase>) Zeilen überschreiben. Außerdem können sich lange logische Zeilen (im Druckauftrag) über mehrere physikalische Zeilen (am Ausdruck) erstrecken.</para> <para>Der im Abschnitt <link linkend="printing-advanced-lpf">lpf: Ein Textfilter</link> vorgestellte Textfilter <command>lpf</command> berücksichtigt diese Besonderheiten. Wenn Sie einen eigenen Textfilter für die Verrechnung der Druckernutzung schreiben wollen, sollten Sie sich daher den Quellcode von <command>lpf</command> näher ansehen.</para> <para>Aber was ist mit anderen Dateiformaten?</para> <para>Für die DVI-nach-LaserJet- oder für die DVI-nach-&postscript;-Konvertierung können Sie die Protokolldateien von <command>dvilj</command> oder <command>dvips</command> auslesen, um festzustellen, wieviele Seiten konvertiert wurden. Die gleiche Methode könnte auch mit anderen Dateitypen funktionieren.</para> <para>Alle diese Methoden haben aber das Problem, dass ein Drucker möglicherweise nicht alle Seiten des Druckauftrages drucken kann. So könnte es etwa zu einem Papierstau kommen, der Toner könnte zu Ende gehen oder es könnte ein Druckerdefekt auftreten – trotzdem würden alle Seiten des Druckauftrages verrechnet werden.</para> <para>Was kann man dagegen tun?</para> <para>Es gibt nur eine einzige <emphasis>sichere</emphasis> Methode, um die Druckernutzung <emphasis>exakt</emphasis> zu bestimmen. Besorgen Sie sich einen Drucker, der das verbrauchte Papier protokolliert und verbinden Sie ihn über eine serielle oder eine Netzwerkverbindung. Nahezu alle &postscript;-Drucker, aber auch viele andere Modelle und Druckertypen (beispielsweise Laserdrucker von Imagen) sind dazu in der Lage. Passen Sie die Filter für diese Drucker entsprechend an, damit diese nach jedem Druckauftrag die Anzahl der gedruckten Seiten ermitteln und verrechnen Sie Druckaufträge <emphasis>ausschließlich</emphasis> über diesen Wert. Danach müssen Sie sich um die Anzahl der gedruckten Zeilen oder um mögliche Druckerprobleme nie mehr kümmern.</para> <para>Sie können aber auch großzügig sein und alle Ausdrucke kostenlos abgeben.</para> </sect3> </sect2> </sect1> <sect1 id="printing-using"> <sect1info> <authorgroup> <author> <firstname>Johann</firstname> <surname>Kois</surname> <contrib>Übersetzt von </contrib> </author> </authorgroup> </sect1info> <title>Drucker verwenden</title> <indexterm> <primary>Drucker</primary> <secondary>verwenden</secondary> </indexterm> <para>Dieser Abschnitt beschreibt, wie Sie einen unter &os; konfigurierten Drucker verwenden können. Die folgende Liste bietet einen Überblick über wichtige Anwenderbefehle:</para> <variablelist> <varlistentry> <term>&man.lpr.1;</term> <listitem> <para>Einen Druckauftrag drucken</para> </listitem> </varlistentry> <varlistentry> <term>&man.lpq.1;</term> <listitem> <para>Eine Druckerwarteschlange prüfen</para> </listitem> </varlistentry> <varlistentry> <term>&man.lprm.1;</term> <listitem> <para>Einen Druckauftrag aus einer Warteschlange entfernen (stornieren)</para> </listitem> </varlistentry> </variablelist> <para>Zusätzlich existiert mit &man.lpc.8; ein Befehl zur zur Steuerung von Druckern und Druckerwarteschlangen, der im Abschnitt <link linkend="printing-lpc">Drucker verwalten</link> näher beschrieben wird.</para> <para>Jeder der drei Befehle &man.lpr.1;, &man.lprm.1;, sowie &man.lpq.1; akzeptiert die Option <option>-P <replaceable>printer-name</replaceable></option>, mit der Sie den zu verwendenden Drucker (der dazu in <filename>/etc/printcap</filename> definiert sein muss) festlegen. Dadurch sind Sie in der Lage, Druckaufträge zu erstellen, zu stornieren, oder den Status Ihrer Druckaufträge zu überprüfen. Verwenden Sie die Option <option>-P</option> nicht, wird der in der Umgebungsvariable <envar>PRINTER</envar> definierte Drucker verwendet. Existiert diese Variable nicht, greifen diese Befehle auf den Drucker <literal>lp</literal> zurück.</para> <para>Im Folgenden steht der Begriff <emphasis>Standarddrucker</emphasis> daher für den über die Umgebungsvariable <envar>PRINTER</envar> definierten Drucker, oder, falls diese Variable nicht existiert, für den Drucker <literal>lp</literal>.</para> <sect2 id="printing-lpr"> <title>Druckaufträge erstellen</title> <para>Um eine Datei zu drucken, geben Sie folgenden Befehl ein:</para> <screen>&prompt.user; <userinput><command>lpr <filename><replaceable>filename</replaceable></filename> <replaceable>...</replaceable></command></userinput></screen> <indexterm><primary>printing</primary></indexterm> <para>Dadurch wird jede angegebene Datei an den Standarddrucker geschickt. Wenn Sie keine Datei angeben, liest &man.lpr.1; die zu druckenden Daten von der Standardeingabe. Um beispielsweise einige wichtige Systemdateien zu drucken, geben Sie folgenden Befehl ein:</para> <screen>&prompt.user; <userinput><command>lpr <filename>/etc/host.conf</filename> <filename>/etc/hosts.equiv</filename></command></userinput></screen> <para>Um einen bestimmten Drucker auszuwählen, verwenden Sie:</para> <screen>&prompt.user; <userinput><command>lpr <option>-P</option> <replaceable>printer-name</replaceable> <filename><replaceable>filename</replaceable></filename> <replaceable>...</replaceable></command></userinput></screen> <para>Das folgende Beispiel gibt eine ausführliche Liste aller im Arbeitsverzeichnis enthaltenen Dateien auf den Drucker <literal>rattan</literal> aus:</para> <screen>&prompt.user; <userinput><command>ls <option>-l</option> | lpr <option>-P</option> rattan</command></userinput></screen> <para>Da keine Dateien an &man.lpr.1; übergeben werden, liest <command>lpr</command> die zu druckenden Daten von der Standardeingabe, in unserem Fall also die Ausgabe des Befehls <command>ls <option>-l</option></command>.</para> <para>&man.lpr.1; akzeptiert auch verschiedene Optionen zur Formatierung und Konvertierung von Dateien, zur Erzeugung von multiplen Ausdrucken und so weiter. Lesen Sie dazu den Abschnitt <link linkend="printing-lpr-options">Druckoptionen</link>.</para> </sect2> <sect2 id="printing-lpq"> <title>Druckaufträge verwalten</title> <indexterm><primary>Druckauftrag</primary></indexterm> <para>Wenn Sie &man.lpr.1; verwenden, werden alle zu druckenden Daten in ein Paket, den sogenannten <quote>Druckauftrag</quote>, gepackt und an <application>LPD</application> geschickt. Jeder Drucker verfügt über eine Druckerwarteschlange, in der Ihre Druckaufträge gemeinsam mit denen anderer Benutzer verbleiben, bis sie gedruckt werden können. Zuerst eintreffende Druckaufträge werden dabei auch zuerst gedruckt.</para> <para>Um die Druckerwarteschlange des Standarddruckers anzuzeigen, verwenden Sie &man.lpq.1;. Wollen Sie einen anderen Drucker abfragen, müssen Sie die Option <option>-P</option> verwenden. Der Befehl <screen>&prompt.user; <userinput><command>lpq <option>-P</option> bamboo</command></userinput></screen> zeigt so die Druckerwarteschlange des Druckers <literal>bamboo</literal> an. Dieser Befehl liefert eine Ausgabe ähnlich der folgenden:</para> <screen>bamboo is ready and printing Rank Owner Job Files Total Size active kelly 9 /etc/host.conf, /etc/hosts.equiv 88 bytes 2nd kelly 10 (standard input) 1635 bytes 3rd mary 11 ... 78519 bytes</screen> <para>Derzeit enthält die Warteschlange von <literal>bamboo</literal> drei Druckaufträge. Dem ersten Auftrag, der vom Benutzer kelly erstellt wurde, wurde die <quote>Auftragsnummer (job number)</quote> 9 zugewiesen. Analog erhält jeder Druckerauftrag eine eindeutige Nummer zugewiesen. Diese Nummern sind nur dann von Bedeutung, wenn Sie einen Druckauftrag stornieren wollen. Der Abschnitt <link linkend="printing-lprm">Druckaufträge stornieren</link> beschreibt, wie Sie dazu vorgehen.</para> <para>Der Auftrag mit der Nummer 9 besteht aus zwei Dateien, mehrere an &man.lpr.1; übergebene Dateien werden also als Teil eines (gemeinsamen) Druckauftrags betrachtet. Dieser Druckauftrag ist derzeit aktiv (beachten Sie den Status <literal>active</literal> in der Spalte <quote>Rank</quote>), wird also gerade gedruckt. Der zweite Auftrag besteht aus Daten, die von der Standardeingabe an &man.lpr.1; übergeben wurden. Der dritte Auftrag wurde vom Benutzer <username>mary</username> erstellt. Er ist sehr viel größer als die anderen Aufträge. Da der Pfad der zu druckenden Datei aufgrund seiner Länge nicht in der Spalte <quote>Files</quote> Platz hat, werden von &man.lpq.1; nur drei Punkte angezeigt.</para> <para>Die erste Zeile der Ausgabe von &man.lpq.1; ist ebenfalls sehr nützlich: Sie beschreibt den momentanen Druckerstatus (oder zumindest, was <application>LPD</application> denkt, dass der Drucker gerade macht).</para> <para>&man.lpq.1; unterstützt auch die Option <option>-l</option> zur Erstellung einer ausführlicheren Ausgabe. Die Eingabe von <command>lpq <option>-l</option></command> erzeugt für unser obiges Beispiel die folgende Ausgabe:</para> <screen>waiting for bamboo to become ready (offline ?) kelly: 1st [job 009rose] /etc/host.conf 73 bytes /etc/hosts.equiv 15 bytes kelly: 2nd [job 010rose] (standard input) 1635 bytes mary: 3rd [job 011rose] /home/orchid/mary/research/venus/alpha-regio/mapping 78519 bytes</screen> </sect2> <sect2 id="printing-lprm"> <title>Druckaufträge stornieren</title> <para>Mit &man.lprm.1; können Sie einen Druckauftrag stornieren. Häufig ist &man.lprm.1; auch noch in der Lage, einen bereits aktiven Auftrag abzubrechen, allerdings wird dabei in der Regel trotzdem ein Teil des Auftrages oder der gesamte Auftrag gedruckt.</para> <para>Um einen Druckauftrag auf dem Standarddrucker zu stornieren, müssen Sie zuerst die Auftragsnummer über &man.lpq.1; ermitteln. Danach geben Sie Folgendes ein:</para> <screen>&prompt.user; <userinput><command>lprm <replaceable>Job-Nummer</replaceable></command></userinput></screen> <para>Um einen Druckauftrag eines anderen Druckers zu stornieren, benötigen Sie wiederum die Option <option>-P</option>. Der folgende Befehl entfernt den Druckauftrag mit der Nummer 10 aus der Warteschlange des Druckers <literal>bamboo</literal>:</para> <screen>&prompt.user; <userinput><command>lprm <option>-P</option> bamboo 10</command></userinput></screen> <para>&man.lprm.1; unterstützt verschiedene Kurzbefehle:</para> <variablelist> <varlistentry> <term>lprm -</term> <listitem> <para>Entfernt alle Druckaufträge (des Standarddruckers), die von Ihnen erstellt wurden.</para> </listitem> </varlistentry> <varlistentry> <term>lprm <replaceable>user</replaceable></term> <listitem> <para>Entfernt alle Druckaufträge (des Standarddruckers), die vom Benutzer <replaceable>user</replaceable> erstellt wurden. Der Superuser kann im Gegensatz zu einem normalen Benutzer auch Aufträge anderer Benutzer entfernen.</para> </listitem> </varlistentry> <varlistentry> <term>lprm</term> <listitem> <para>Wenn Sie weder eine Auftragsnummer, einen Benutzernamen, noch die Option <option>-</option> angeben, entfernt &man.lprm.1; den aktiven Druckauftrag auf dem Standarddrucker, falls dieser Auftrag von Ihnen erstellt wurde. Der Superuser kann hingegen jeden aktiven Druckauftrag abbrechen.</para> </listitem> </varlistentry> </variablelist> <para>Verwenden Sie zusätzlich die Option <option>-P</option> zu den eben beschriebenen Kurzbefehlen, wenn Sie diese auf einen anderen Drucker als den Standarddrucker anwenden wollen. So entfernt der folgende Befehl beispielsweise alle Druckaufträge des aktuellen Benutzers aus der Druckerwarteschlange des Druckers <literal>rattan</literal>:</para> <screen>&prompt.user; <userinput><command>lprm <option>-P</option> rattan -</command></userinput></screen> <note> <para>Wenn Sie in einer Netzwerkumgebung arbeiten, erlaubt es &man.lprm.1; Ihnen nur, Druckaufträge auf dem Rechner zu stornieren, auf dem sie erstellt wurden. Dies gilt selbst dann, wenn der gleiche Drucker auch auf anderen Rechnern des Netzwerks verfügbar ist. Die folgende Befehlsfolge veranschaulicht diesen Umstand:</para> <screen>&prompt.user; <userinput><command>lpr <option>-P</option> rattan <filename><replaceable>myfile</replaceable></filename></command></userinput> &prompt.user; <userinput><command>rlogin orchid</command></userinput> &prompt.user; <userinput><command>lpq <option>-P</option> rattan</command></userinput> Rank Owner Job Files Total Size active seeyan 12 ... 49123 bytes 2nd kelly 13 myfile 12 bytes &prompt.user; <userinput><command>lprm <option>-P</option> rattan 13</command></userinput> rose: Permission denied &prompt.user; <userinput><command>logout</command></userinput> &prompt.user; <userinput><command>lprm <option>-P</option> rattan 13</command></userinput> dfA013rose dequeued cfA013rose dequeued </screen> </note> </sect2> <sect2 id="printing-lpr-options"> <title>Abseits von normalem Text: Druckoptionen</title> <para>&man.lpr.1; unterstützt verschiedene Optionen zur Formatierung von Text, zur Konvertierung von Grafik- und anderen Dateiformaten, zur Erzeugung von multiplen Kopien, zur Verwaltung von Druckaufträgen und andere mehr. Dieser Abschnitt beschreibt einige dieser Optionen.</para> <sect3 id="printing-lpr-options-format"> <title>Formatierungs- und Konvertierungsoptionen</title> <para>Die folgenden &man.lpr.1;-Optionen kontrollieren die Formatierung von in einem Druckauftrag enthaltenen Dateien. Verwenden Sie diese Optionen, wenn Ihr Druckauftrag keinen normalen Text enthält, oder wenn Sie normalen Text mit &man.pr.1; formatieren wollen.</para> <indexterm><primary>&tex;</primary></indexterm> <para>Der folgende Befehl druckt so beispielsweise eine DVI-Datei (des &tex;-Satzsystems) namens <filename><replaceable>fish-report.dvi</replaceable></filename> auf dem Drucker <literal>bamboo</literal>:</para> <screen>&prompt.user; <userinput><command>lpr <option>-P</option> bamboo -d <filename><replaceable>fish-report.dvi</replaceable></filename></command></userinput></screen> <para>Diese Optionen gelten für jede Datei des Druckauftrags, daher ist es nicht möglich beispielsweise DVI- und ditroff-Dateien über den gleichen Druckauftrag zu drucken. Sie müssen diese Dateien vielmehr über getrennte Druckaufträge drucken, wobei Sie jeweils geeignete Konvertierungsoptionen verwenden.</para> <note> <para>Alle Optionen mit Ausnahme von <option>-p</option> und <option>-T</option> setzen einen installierten und für den jeweiligen Drucker konfigurierten Konvertierungsfilter voraus. So benötigt die Option <option>-d</option> den DVI-Konvertierungsfilter. Diese Filter werden im Abschnitt <link linkend="printing-advanced-convfilters"> Konvertierungsfilter</link> ausführlich beschrieben.</para> </note> <variablelist> <varlistentry> <term><option>-c</option></term> <listitem> <para>Druckt cifplot-Dateien.</para> </listitem> </varlistentry> <varlistentry> <term><option>-d</option></term> <listitem> <para>Druckt DVI-Dateien.</para> </listitem> </varlistentry> <varlistentry> <term><option>-f</option></term> <listitem> <para>Druckt FORTRAN-Textdateien.</para> </listitem> </varlistentry> <varlistentry> <term><option>-g</option></term> <listitem> <para>Druckt Plot-Daten.</para> </listitem> </varlistentry> <varlistentry> <term><option>-i <replaceable>anzahl</replaceable></option></term> <listitem> <para>Rückt die Ausgabe um <replaceable>anzahl</replaceable> Spalten ein, lassen Sie <replaceable>anzahl</replaceable> weg, wird der Text um 8 Spalten eingerückt. Beachten Sie aber, dass diese Option nicht mit allen Konvertierungsfiltern funktioniert.</para> <note> <para>Zwischen der Option <option>-i</option> und der der Zahl darf dabei kein Leerzeichen stehen.</para> </note> </listitem> </varlistentry> <varlistentry> <term><option>-l</option></term> <listitem> <para>Druckt Text inklusive vorhandener Steuerzeichen.</para> </listitem> </varlistentry> <varlistentry> <term><option>-n</option></term> <listitem> <para>Druckt ditroff-Dateien (geräteunabhängiges troff).</para> </listitem> </varlistentry> <varlistentry> <term>-p</term> <listitem> <para>Formatiert normalen Text mit &man.pr.1;, bevor der Ausdruck erfolgt.</para> </listitem> </varlistentry> <varlistentry> <term><option>-T <replaceable>titel</replaceable></option></term> <listitem> <para>Verwende <replaceable>titel</replaceable> auf dem &man.pr.1;-Deckblatt anstelle des Dateinamens. Diese Option ist nur wirksam, wenn sie gemeinsam mit der Option <option>-p</option> verwendet.</para> </listitem> </varlistentry> <varlistentry> <term><option>-t</option></term> <listitem> <para>Druckt troff-Daten.</para> </listitem> </varlistentry> <varlistentry> <term><option>-v</option></term> <listitem> <para>Druckt Rasterdaten.</para> </listitem> </varlistentry> </variablelist> <para>Dazu ein Beispiel. Der folgende Befehl druckt eine formatierte Version der Manualpage zu &man.ls.1; auf den Standarddrucker:</para> <screen>&prompt.user; <userinput><command>zcat <filename>/usr/share/man/man1/ls.1.gz</filename> | troff <option>-t</option> -man | lpr <option>-t</option></command></userinput></screen> <para>&man.zcat.1; dekomprimiert den Quellcode der Manualpage &man.ls.1; und reicht ihn an &man.troff.1; weiter, das ihn formatiert und daraus GNU troff-Daten erzeugt. Diese werden wiederum an &man.lpr.1; weitergereicht, das den Druckauftrag schließlich an <application>LPD</application> übergibt. Da die Option <option>-t</option> von &man.lpr.1; verwendet wurde, konvertiert das Drucksystem die GNU troff-Daten zuvor in ein Format, das der Standarddrucker verstehen und ausgeben kann.</para> </sect3> <sect3 id="printing-lpr-options-job-handling"> <title>Druckaufträge verwalten</title> <para>Die folgenden Optionen von &man.lpr.1; weisen <application>LPD</application> an, den Druckauftrag auf verschiedene Art und Weise zu behandeln:</para> <variablelist> <varlistentry> <term>-# <replaceable>anzahl</replaceable></term> <listitem> <para>Erzeugt <replaceable>anzahl</replaceable> Ausdrucke jeder im Druckauftrag enthaltenen Datei anstelle eines einzigen Exemplars. Diese Option kann von einem Administrator deaktiviert werden, um die Beanspruchung des Druckers zu verringern. Lesen Sie den Abschnitt <link linkend="printing-advanced-restricting-copies"> Den Ausdruck von mehreren Kopien verhindern</link>, wenn Sie diese Funktion benötigen.</para> <para>Das folgende Beispiel druckt drei Kopien der Datei <filename><replaceable>parser.c</replaceable></filename>, gefolgt von drei Kopien von <filename><replaceable>parser.h</replaceable></filename> auf den Standarddrucker:</para> <screen>&prompt.user; <userinput><command>lpr <option>-#3</option> <filename><replaceable>parser.c parser.h</replaceable></filename></command></userinput></screen> </listitem> </varlistentry> <varlistentry> <term>-m</term> <listitem> <para>Verschickt eine E-Mail, nachdem der Druckauftrag beendet wurde. Verwenden Sie diese Option, sendet <application>LPD</application> Ihnen eine E-Mail, wenn es die Bearbeitung Ihres Druckauftrages abgeschlossen hat. Diese Nachricht enthält Informationen darüber, ob Ihr Auftrag erfolgreich erledigt wurde oder ob ein Fehler auftrat. Ist dies der Fall, wird meist noch angegeben, welcher Fehler auftrat.</para> </listitem> </varlistentry> <varlistentry> <term>-s</term> <listitem> <para>Kopiert die Dateien nicht in das Spooling-Verzeichnis, sondern verlinkt stattdessen symbolisch auf diese Dateien.</para> <para>Wenn Sie einen umfangreichen Druckauftrag erstellen, werden Sie diese Option wahrscheinlich verwenden wollen. Einerseits sparen Sie dadurch Speicherplatz im Spooling-Verzeichnis (im schlimmsten Fall könnte Ihr Druckauftrag ansonsten das Dateisystem des Spooling-Verzeichnis zum Überlaufen bringen), andererseits sparen Sie dadurch auch Zeit, weil <application>LPD</application> die in Ihrem Druckauftrag enthaltenen Dateien nicht in das Spooling-Verzeichnis kopieren muss.</para> <para>Da <application>LPD</application> in diesem Fall die Originaldateien verwendet, muss sichergestellt sein, dass diese nicht verändert werden, bevor der Ausdruck abgeschlossen ist.</para> <note> <para>Wenn Sie auf einen entfernten Drucker drucken, muss <application>LPD</application> die Dateien dennoch vom lokalen auf den entfernten Rechner kopieren. In diesem Fall spart die Option <option>-s</option> Speicherplatz lediglich im lokalen Spooling-Verzeichnis, nicht aber im entfernten. Dennoch ist diese Option auch in diesem Fall nützlich.</para> </note> </listitem> </varlistentry> <varlistentry> <term>-r</term> <listitem> <para>Löscht die im Druckauftrag enthaltenen Dateien, nachdem sie in das Spooling-Verzeichnis kopiert oder unter Verwendung der Option <option>-s</option> gedruckt werden. Verwenden Sie diese Option daher nur mit äußerster Vorsicht!</para> </listitem> </varlistentry> </variablelist> </sect3> <sect3 id="printing-lpr-options-misc"> <title>Deckblatt-Optionen</title> <para>Die folgenden &man.lpr.1;-Optionen passen den Text an, der auf einem Deckblatt eines Druckauftrages ausgegeben wird. Wird die Ausgabe von Deckblättern auf dem Zieldrucker unterdrückt, bleiben diese Optionen wirkungslos. Lesen Sie den Abschnitt <link linkend="printing-advanced-header-pages">Deckblätter</link>, wenn Sie diese Funktion benötigen.</para> <variablelist> <varlistentry> <term>-C <replaceable>text</replaceable></term> <listitem> <para>Ersetzt den Rechnernamen auf dem Deckblatt durch <replaceable>text</replaceable>. Der Rechnername ist dabei in der Regel der Name des Rechners, auf dem der Druckauftrag erstellt wurde.</para> </listitem> </varlistentry> <varlistentry> <term>-J <replaceable>text</replaceable></term> <listitem> <para>Ersetzt den Namen des Druckauftrages auf dem Deckblatt durch <replaceable>text</replaceable>. Der Name des Druckauftrages entspricht in der Regel dem Namen der ersten Datei des Druckauftrages oder <filename>stdin</filename>, wenn Sie die Standardeingabe an den Drucker weiterleiten.</para> </listitem> </varlistentry> <varlistentry> <term>-h</term> <listitem> <para>Verhindert den Ausdruck von Deckblättern.</para> <note> <para>Ob diese Option funktioniert, hängt von der Art und Weise ab, wie Deckblätter auf Ihrem System erzeugt werden. Lesen Sie den Abschnitt <link linkend="printing-advanced-header-pages"> Deckblätter</link> für weitere Informationen.</para> </note> </listitem> </varlistentry> </variablelist> </sect3> </sect2> <sect2 id="printing-lpc"> <title>Drucker verwalten</title> <para>Als Administrator Ihres Systems ist es Ihre Aufgabe, Drucker zu installieren, zu konfigurieren und zu testen. Um mit Ihrem Drucker zu kommunizieren, können Sie &man.lpc.8; verwenden. Dadurch sind Sie in der Lage,</para> <itemizedlist> <listitem> <para>Ihre Drucker zu starten und zu beenden.</para> </listitem> <listitem> <para>Die Warteschlangen Ihrer Drucker zu aktivieren und zu deaktivieren.</para> </listitem> <listitem> <para>Die Reihenfolge der Druckaufträge zu ändern.</para> </listitem> </itemizedlist> <para>Am Anfang dieses Abschnitts steht die Erklärung einiger Begriffe. Wenn ein Drucker <emphasis>beendet</emphasis> ist, wird der Inhalt seiner Warteschlange nicht gedruckt. Druckaufträge können zwar weiterhin erstellt werden, diese verbleiben aber solange in der Warteschlange, bis der Drucker wieder <emphasis>gestartet</emphasis> oder die Warteschlange gelöscht wird.</para> <para>Ist eine Warteschlange <emphasis>deaktiviert</emphasis>, kann (mit Ausnahme von <username>root</username>) kein Benutzer mehr einen Druckauftrag erteilen. Ist die Warteschlange hingegen <emphasis>aktiviert</emphasis>, können Druckaufträge erteilt werden. Ist ein Drucker zwar <emphasis>gestartet</emphasis>, die Warteschlange hingegen <emphasis>deaktiviert</emphasis>, werden dennoch alle noch in der Warteschlange vorhandenen Druckaufträge gedruckt.</para> <para>Im Allgemeinen benötigen Sie <username>root</username>-Rechte, um &man.lpc.8; einsetzen zu können. Als normaler Benutzer erlaubt es Ihnen &man.lpc.8; lediglich, den Druckstatus abzufragen und einen hängenden Drucker neu zu starten.</para> <para>Es folgt nun eine Zusammenfassung der Befehle von &man.lpc.8;. Die meisten dieser Befehle benötigen das Argument <replaceable>printer-name</replaceable>, mit dem Sie angeben, auf welchen Drucker der Befehl angewendet werden soll. Wenn Sie für <replaceable>printer-name</replaceable> <literal>all</literal> angeben, wird der Befehl auf alle in <filename>/etc/printcap</filename> definierten Drucker angewendet.</para> <variablelist> <varlistentry> <term><command>abort <replaceable>printer-name</replaceable></command></term> <listitem> <para>Bricht den aktuellen Druckauftrag ab und beendet den Drucker. Solange die Warteschlange aktiviert ist, können allerdings weiterhin Druckaufträge erteilt werden.</para> </listitem> </varlistentry> <varlistentry> <term><command>clean <replaceable>printer-name</replaceable></command></term> <listitem> <para>Entfernt veraltete Dateien aus dem Spooling-Verzeichnis des Druckers, da diese manchmal nicht vollständig von <application>LPD</application> entfernt werden können. Dies ist insbesondere dann der Fall, wenn während der Bearbeitung des Druckauftrages Fehler auftraten. Dieser Befehl sucht dabei nach Dateien, die nicht in das Spooling-Verzeichnis gehören und entfernt diese.</para> </listitem> </varlistentry> <varlistentry> <term><command>disable <replaceable>printer-name</replaceable></command></term> <listitem> <para>Deaktiviert die Annahme neuer Druckaufträge. Solange der Drucker nicht beendet wird, werden weiterhin alle in der Warteschlange enthaltenen Auftrage bearbeitet und gedruckt. <username>root</username> kann jederzeit Druckaufträge erstellen, selbst dann, wenn die Druckerwarteschlange deaktiviert ist.</para> <para>Dieser Befehl ist besonders nützlich, wenn Sie einen neuen Drucker testen müssen oder einen neuen Filter installiert haben. Dazu deaktivieren Sie die Warteschlange des Druckers und erstellen Ihre Druckaufträge als <username>root</username>. Andere Benutzer können erst dann einen Druckauftrag erstellen, wenn Sie Ihre Tests abgeschlossen haben und die Druckerwarteschlange mit <command>enable</command> wieder reaktivieren.</para> </listitem> </varlistentry> <varlistentry> <term><command>down <replaceable>printer-name</replaceable> <replaceable>nachricht</replaceable></command></term> <listitem> <para>Beendet einen Drucker. Äquivalent zu <command>disable</command>, gefolgt von <command>stop</command>. Die von Ihnen definierte <replaceable>nachricht</replaceable> wird als Druckerstatus angezeigt, wenn ein Benutzer die Warteschlange des Druckers mit &man.lpq.1; oder mit <command>lpc status</command> abfragt.</para> </listitem> </varlistentry> <varlistentry> <term><command>enable <replaceable>printer-name</replaceable></command></term> <listitem> <para>Aktiviert die Warteschlange eines Druckers. Erteilte Druckaufträge können zwar erteilt werden, diese werden aber nur dann gedruckt, wenn der Drucker auch gestartet ist.</para> </listitem> </varlistentry> <varlistentry> <term><command>help <replaceable>command-name</replaceable></command></term> <listitem> <para>Ausgaben von hilfreichen Informationen zu <replaceable>command-name</replaceable>. Wird kein <replaceable>command-name</replaceable> angegeben, wird die Liste der verfügbaren Befehle ausgegeben.</para> </listitem> </varlistentry> <varlistentry> <term><command>restart <replaceable>printer-name</replaceable></command></term> <listitem> <para>Startet den Drucker. Normale Benutzer können diesen Befehl verwenden, um einen hängenden <application>LPD</application> zu reaktivieren, sie sind allerdings nicht berechtigt, einen Drucker zu starten, der mit <command>stop</command> oder <command>down</command> beendet wurde. Dieser Befehl ist äquivalent zu <command>abort</command>, gefolgt von <command>start</command>.</para> </listitem> </varlistentry> <varlistentry> <term><command>start <replaceable>printer-name</replaceable></command></term> <listitem> <para>Startet den Drucker, um die in der Warteschlange enthaltenen Aufträge zu drucken.</para> </listitem> </varlistentry> <varlistentry> <term><command>stop <replaceable>printer-name</replaceable></command></term> <listitem> <para>Beendet den Drucker. Der Drucker beendet den aktiven Druckauftrag noch, danach wird kein weiterer in der Warteschlange enthaltener Auftrag gedruckt. Obwohl der Drucker beendet wurde, können weiterhin Druckaufträge erteilt werden, solange die Warteschlange nicht deaktiviert wurde.</para> </listitem> </varlistentry> <varlistentry> <term><command>topq <replaceable>printer-name</replaceable> <replaceable>job-or-username</replaceable></command></term> <listitem> <para>Sortiert die Druckerwarteschlange des Druckers <replaceable>printer-name</replaceable> um, wobei der Auftrag mit der angegebenen <replaceable>Auftragsnummer</replaceable>, oder Druckaufträge, die von <replaceable>username</replaceable> erstellt wurden, an den Beginn der Warteschlange gesetzt werden. Für diesen Befehl kann die Option <literal>all</literal> nicht als <replaceable>printer-name</replaceable> verwendet werden.</para> </listitem> </varlistentry> <varlistentry> <term><command>up <replaceable>printer-name</replaceable></command></term> <listitem> <para>Startet einen Drucker. Das Gegenstück zu <command>down</command>. Äquivalent zu <command>start</command>, gefolgt von <command>enable</command>.</para> </listitem> </varlistentry> </variablelist> <para>&man.lpc.8; akzeptiert diese Befehle direkt auf der Kommandozeile. Geben Sie keinen Befehl ein, wird &man.lpc.8; im interaktiven Modus gestartet. In diesem Modus können Sie solange Befehle eingeben, bis Sie <command>exit</command> oder <command>quit</command> eingeben.</para> </sect2> </sect1> <sect1 id="printing-lpd-alternatives"> <title>Alternativen zum <application>LPD</application>-Drucksystem</title> <para>Wenn Sie dieses Kapitel bis hierher gelesen haben, wissen Sie so gut wie alles über <application>LPD</application>, das Standarddrucksystem von &os;. Wahrscheinlich sind Ihnen bereits einige Unzulänglichkeiten dieses Systems aufgefallen, und Sie fragen sich nun, welche anderen Drucksysteme es für &os; gibt.</para> <variablelist> <varlistentry> <term>LPRng</term> <listitem> <indexterm><primary>LPRng</primary></indexterm> <para><application>LPRng</application> steht für <quote>LPR: the Next Generation</quote>. Dabei handelt es sich um eine von Grund auf neu geschriebene Version von PLP. LPRng wurde von Patrick Powell und Justin Mason, dem Hauptmaintainer von PLP, entwickelt. Die offizielle Webseite von <application>LPRng</application> ist unter <ulink url="http://www.lprng.org/"></ulink> zu finden.</para> </listitem> </varlistentry> <varlistentry> <term>CUPS</term> <listitem> <indexterm><primary>CUPS</primary></indexterm> <para><application>CUPS</application>, das <foreignphrase>Common UNIX Printing System</foreignphrase>, stellt eine portable Abstraktionsschicht dar, die das Drucken auf allen &unix;-artigen Betriebsystemen ermöglicht. <application>CUPS</application> wurde von Easy Software entwickelt, um &unix;-Herstellern und -Benutzern eine einheitliche Standardlösung für den Druck von Dokumenten zu bieten.</para> <para><application>CUPS</application> verwendet das Internet Printing Protocol (<acronym>IPP</acronym>), um Druckaufträge und -warteschlangen zu verwalten. Zusätzlich werden die Protokolle <foreignphrase>Line Printer Daemon</foreignphrase> (<acronym>LPD</acronym>), <foreignphrase>Server Message Block</foreignphrase> (<acronym>SMB</acronym>), und <foreignphrase>AppSocket/JetDirect</foreignphrase>), unterstützt, wenn auch nur mit eingeschränkter Funktionalität. Ausserdem ermöglicht <application>CUPS</application> das Auffinden von Netzwerkdruckern sowie die Verwendung auf <foreignphrase>PostScript Printer Description</foreignphrase> (<acronym>PPD</acronym>) basierender Druckoptionen.</para> <para>Die offizielle Webseite von <application>CUPS</application> ist <ulink url="http://www.cups.org/"></ulink>.</para> </listitem> </varlistentry> <varlistentry> <term>HPLIP</term> <listitem> <indexterm><primary>HPLIP</primary></indexterm> <para><application>HPLIP</application>, das HP &linux; Imaging and Printing System, ist eine von HP entwickelte Sammlung von Programmen, die Unterstützung für das drucken, scannen und faxen bei HP-Geräten bieten. Diese Programm-Sammlung verwendet <application>CUPS</application> als Grundlage für einige seiner Druck-Eigenschaften.</para> <para>Die Hauptseite für <application>HPLIP</application> ist <ulink url="http://hplipopensource.com/hplip-web/index.html"></ulink>.</para> </listitem> </varlistentry> </variablelist> </sect1> <sect1 id="printing-troubleshooting"> <title>Problembehandlung</title> <para>Wenn Sie eine einfache Testseite mit &man.lptest.1; gedruckt haben, könnte eines der folgenden Probleme aufgetreten sein:</para> <variablelist> <varlistentry> <term>Der Druck hat erst mit einer gewissen Verzögerung geklappt oder das bedruckte Blatt verblieb im Drucker, so als wäre der Druckvorgang noch nicht abgeschlossen.</term> <listitem> <para>Die Testseite wurde zwar gedruckt, danach tat sich allerdings nichts mehr. Vielleicht mussten Sie sogar eine Taste Ihres Druckers, etwa PRINT REMAINING oder FORM FEED drücken, damit der Druckvorgang fortgesetzt wurde.</para> <para>Wenn das der Fall ist, hat der Drucker vermutlich vor dem eigentlichen Drucken gewartet, ob noch weitere Daten für Ihren Druckauftrag gesendet werden. Um dieses Problem zu beheben, können Sie den Textfilter anweisen, ein <foreignphrase>Form Feed</foreignphrase> -Zeichen (oder ein anderes entsprechendes Zeichen) an den Drucker zu senden. Dies reicht für gewöhnlich aus, um den Drucker zum Druck des noch im internen Puffer verbliebenen Textes zu bewegen. Dadurch kann auch sichergestellt werden, dass jeder neue Druckauftrag auf einer neuen Seite beginnt.</para> <para>Der folgende Ersatz für das Shell-Skript <filename>/usr/local/libexec/if-simple</filename> gibt ein <quote>Form Feed</quote> aus, nachdem der Auftrag an den Drucker geschickt wurde:</para> <programlisting>#!/bin/sh # # if-simple - Einfacher Eingabefilter für lpd # Installiert unter /usr/local/libexec/if-simple # # Kopiert stdin einfach nach stdout. Ignoriert alle Filter-Argumente. # Schreibt ein Form-Feed-Zeichen (\f) nach dem Ende des Druckauftrages. /bin/cat && printf "\f" && exit 0 exit 2</programlisting> </listitem> </varlistentry> <varlistentry> <term>Der Drucker erzeugte einen <quote>Treppeneffekt</quote> (<foreignphrase>staircase effect</foreignphrase>).</term> <listitem> <para>Sie haben einen Ausdruck ähnlich dem folgenden erhalten:</para> <screen>!"#$%&'()*+,-./01234 "#$%&'()*+,-./012345 #$%&'()*+,-./0123456</screen> <indexterm><primary>MS-DOS</primary></indexterm> <indexterm><primary>OS/2</primary></indexterm> <indexterm><primary>ASCII</primary></indexterm> <para>Sie sind zu einem weiteren Opfer des <emphasis>Treppeneffekts</emphasis> geworden. Verursacht wird dieser Effekt durch unterschiedliche Ansichten darüber, welche Zeichen den Beginn einer neuen Zeile anzeigen sollen. &unix;-ähnliche Betriebssysteme verwenden dafür ein einzelnes Zeichen: ASCII-Code 10, auch als <foreignphrase>Line Feed</foreignphrase> (LF) bekannt. &ms-dos;, &os2; und andere Betriebssysteme verwenden stattdessen ein Zeichenpaar: ASCII-Code 10 <emphasis>und</emphasis> ASCII-Code 13, <foreignphrase>Carriage Return</foreignphrase> (CR). Viele Drucker verwenden in der Voreinstellung die Konvention von &ms-dos;, um Zeilenumbrüche darzustellen.</para> <para>Wenn Sie unter &os; drucken, wird nur das Zeichen <foreignphrase>Line Feed</foreignphrase> verwendet. Der Drucker erkennt dieses Zeichen und erweitert den Druckbereich um eine Zeile, verbleibt zum Druck des nächsten Zeichens aber in derselben horizontalen Position. Das ist der Grund für die Verwendung des <foreignphrase>Carriage Return</foreignphrase>: Es setzt die Position für das folgende Zeichen auf den linken Rand der Seite.</para> <para>&os; erwartet von einem Drucker das folgende Verhalten:</para> <informaltable frame="none" pgwide="1"> <tgroup cols="2"> <tbody> <row> <entry>Drucker empfängt CR</entry> <entry>Drucker druckt CR</entry> </row> <row> <entry>Drucker empfängt LF</entry> <entry>Drucker druckt CR + LF</entry> </row> </tbody> </tgroup> </informaltable> <para>Es gibt mehrere Möglichkeiten, dieses Verhalten zu erreichen:</para> <itemizedlist> <listitem> <para>Verändern Sie die Konfiguration Ihres Druckers, um die Interpretation dieser Zeichen zu verändern. Lesen Sie Ihr Druckerhandbuch, wenn Sie nicht wissen, was Sie dazu tun müssen.</para> <note> <para>Wenn Sie auf Ihrem Rechner neben &os; noch andere Betriebssysteme verwenden, müssen Sie Ihren Drucker möglicherweise anschließend <emphasis>erneut konfigurieren</emphasis>, damit die Zeichen CR und LF unter diesen Systemen korrekt interpretiert werden. Ist dies bei Ihnen der Fall, werden Sie wohl eine der folgenden Lösungen bevorzugen.</para> </note> </listitem> <listitem> <para>Lassen Sie LF durch den Treiber der seriellen Schnittstelle automatisch in CR+LF konvertieren. Selbstverständlich funktioniert dies nur mit Druckern, die an einer seriellen Schnittstelle angeschlossen sind. Um diese Möglichkeit zu nutzen, müssen Sie die <literal>ms#</literal>-Fähigkeit verwenden und in <filename>/etc/printcap</filename> den <literal>onlcr</literal>-Modus für den Drucker aktivieren.</para> </listitem> <listitem> <para>Senden Sie eine <emphasis>Escape-Sequenz</emphasis> an den Drucker, damit das Zeichen LF zeitweilig anders behandelt wird. Suchen Sie im Handbuch Ihres Druckers nach den von Ihrem Drucker unterstützten Escape-Sequenzen. Wenn Sie eine entsprechenden Escape-Sequenz finden, müssen Sie den Textfilter so anpassen, dass zuerst die Escape-Sequenz und anschließend der Druckauftrag gesendet wird.</para> <indexterm><primary>PCL</primary></indexterm> <para>Es folgt nun ein Bespieltextfilter für einen Drucker, der die Hewlett Packard PCL Escape-Sequenzen versteht. Dieser Filter veranlasst den Drucker, LF-Zeichen als Folgen von LF+CR aufzufassen. Anschließend wird der Druckauftrag gesendet. Als Abschluss wird ein <foreignphrase>Form Feed</foreignphrase> gesendet, um die letzte Seite des Druckauftrags auszuwerfen. Dieses Beispiel sollte mit nahezu allen Druckern von Hewlett Packard funktionieren.</para> <programlisting>#!/bin/sh # # hpif - Einfacher Text-Eingabefilter für lpd für auf HP-PCL basierende Drucker # Installiert unter /usr/local/libexec/hpif # # Kopiert stdin einfach nach stdout. Ignoriert alle Filterargumente. # Weist den Drucker an LF als CR+LF zu interpretieren. # Wirft die Seite nach dem Drucken aus. printf "\033&k2G" && cat && printf "\033&l0H" && exit 0 exit 2</programlisting> <para>Das nächste Beispiel aus <filename>/etc/printcap</filename> beschreibt den Rechner <hostid>orchid</hostid>, an dessen Parallelport ein Drucker angeschlossen ist. Es handelt sich dabei um einen Hewlett Packard LaserJet 3Si, der den Namen <literal>teak</literal> verwendet. Als Textfilter wird das Skript aus dem letzten Beispiel verwendet:</para> <programlisting># # /etc/printcap für den Rechner orchid # teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:sh:sd=<filename class="directory">/var/spool/lpd/teak</filename>:mx#0:\ :if=<filename>/usr/local/libexec/hpif</filename>:</programlisting> </listitem> </itemizedlist> </listitem> </varlistentry> <varlistentry> <term>Alle Zeilen wurden in die gleiche Zeile gedruckt.</term> <listitem> <para>Der Drucker hat niemals eine neue Zeile begonnen. Alle Zeilen des Textes wurden in eine einzige Zeile gedruckt.</para> <para>Dieses Problem ist das <quote>Gegenteil</quote> des oben beschriebenen Treppeneffekts und kommt wesentlich seltener vor. Die von &os; zum Abschluss einer Zeile benutzten LF-Zeichen werden als CR-Zeichen interpretiert. Dadurch wird die Druckposition zwar auf den linken Rand der Seite, aber nicht um eine Zeile nach unten gesetzt.</para> <para>Konfigurieren Sie Ihren Drucker, um die folgende Interpretation der Zeichen LF und CR zu erzwingen:</para> <informaltable frame="none" pgwide="1"> <tgroup cols="2"> <thead> <row> <entry>Drucker empfängt</entry> <entry>Drucker druckt</entry> </row> </thead> <tbody> <row> <entry>CR</entry> <entry>CR</entry> </row> <row> <entry>LF</entry> <entry>CR + LF</entry> </row> </tbody> </tgroup> </informaltable> </listitem> </varlistentry> <varlistentry> <term>Manche Zeichen wurden nicht gedruckt.</term> <listitem> <para>Der Drucker hat in jeder Zeile einige Zeichen nicht gedruckt. Vielleicht ist das Problem auch während des Druckens schlimmer geworden, und der Drucker hat immer mehr Zeichen nicht gedruckt.</para> <para>Dieses Problem entsteht, weil der Drucker mit der Geschwindigkeit, mit der die Daten über die serielle Schnittstelle (an einer parallelen Schnittstelle sollte das Problem nicht auftreten) eintreffen, nicht mithalten kann. Es gibt zwei Möglichkeiten, dieses Problem zu lösen:</para> <itemizedlist> <listitem> <para>Wenn der Drucker die Flusskontrolle mit XON/XOFF unterstützt, können Sie in der <literal>ms#</literal>-Fähigkeit den <literal>ixon</literal>-Modus aktivieren.</para> </listitem> <listitem> <para>Unterstützt der Drucker die Anfrage zum Senden/Löschen des Sende-Hardware-Handshakes (allgemein bekannt als <literal>RTS/CTS</literal>, dann sollten Sie den <literal>crtscts</literal>-Modus in der <literal>ms#</literal>-Fähigkeit aktivieren. Stellen Sie aber sicher, dass das verwendete Druckerkabel auch für die Hardware-Flusskontrolle geeignet ist.</para> </listitem> </itemizedlist> </listitem> </varlistentry> <varlistentry> <term>Es wurden nur wirre Zeichen gedruckt.</term> <listitem> <para>Anstelle des gewünschten Textes wurden nur zufällige Zeichen gedruckt.</para> <para>Dieses Problem wird ebenfalls durch falsche Konfigurationsparameter im Zusammenhang mit einem seriellen Drucker verursacht. Kontrollieren Sie die bps-Rate in der <literal>br</literal>-Fähigkeit und die Paritätseinstellung (<foreignphrase>Parity</foreignphrase>) in der <literal>ms#</literal>-Fähigkeit. Überprüfen Sie außerdem, ob der Drucker auch tatsächlich die gleichen Einstellungen verwendet, die in <filename>/etc/printcap</filename> definiert wurden.</para> </listitem> </varlistentry> <varlistentry> <term>Der Drucker hat überhaupt nicht reagiert.</term> <listitem> <para>Wenn gar nichts passiert ist, dann liegt das vermutlich an &os; und nicht am Drucker. Aktivieren Sie die Protokollierung (<literal>lf</literal>-Fähigkeit) für den entsprechenden Drucker in der Datei <filename>/etc/printcap</filename>. Es folgt nun ein Beispieleintrag für den Drucker <literal>rattan</literal>, bei dem die <literal>lf</literal>-Fähigkeit aktiviert wurde.</para> <programlisting>rattan|line|diablo|lp|Diablo 630 Line Printer:\ :sh:sd=<filename class="directory">/var/spool/lpd/rattan</filename>:\ :lp=<filename class="devicefile">/dev/lpt0</filename>:\ :if=<filename>/usr/local/libexec/if-simple</filename>:\ :lf=<filename>/var/log/rattan.log</filename></programlisting> <para>Versuchen Sie jetzt noch einmal zu drucken. Überprüfen Sie die Protokolldatei (in unserem Beispiel <filename>/var/log/rattan.log</filename>) auf etwaige Fehlermeldungen. Versuchen Sie aufgrund dieser Meldungen, das Problem zu beheben.</para> <para>Wenn Sie keine Protokolldatei festlegen, verwendet <application>LPD</application> in der Voreinstellung <filename class="devicefile">/dev/console</filename> für die Ausgabe der Fehlermeldungen.</para> </listitem> </varlistentry> </variablelist> </sect1> </chapter>