1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
|
---
title: Kapitel 9. Drucken
part: Part II. Common Tasks
prev: books/handbook/kernelconfig
next: books/handbook/linuxemu
---
[[printing]]
= Drucken
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:source-highlighter: rouge
:experimental:
:skip-front-matter:
:table-caption: Tabelle
:figure-caption: Abbildung
:example-caption: Beispiel
:xrefstyle: basic
:relfileprefix: ../
:outfilesuffix:
:sectnumoffset: 9
ifeval::["{backend}" == "html5"]
:imagesdir: ../../../images/books/handbook/printing/
endif::[]
ifeval::["{backend}" == "pdf"]
:imagesdir: ../../../../static/images/books/handbook/printing/
endif::[]
ifeval::["{backend}" == "epub3"]
:imagesdir: ../../../../static/images/books/handbook/printing/
endif::[]
include::shared/authors.adoc[]
include::shared/releases.adoc[]
include::shared/de/mailing-lists.adoc[]
include::shared/de/teams.adoc[]
include::shared/de/urls.adoc[]
toc::[]
Trotz vieler Versuche es zu vermeiden, ist der Druck von Informationen auf Papier immer noch eine wichtige Funktion. Drucken hat zwei grundlegende Komponenten. Die Daten müssen an den Drucker gesendet werden, und zwar in einer Form, die der Drucker verstehen kann.
[[printing-quick-start]]
== Schnellstart
Die grundlegende Druckfunktion kann schnell eingerichtet werden. Der Drucker muss lediglich fähig sein, normalen ASCII-Text zu drucken. Informationen zum Druck von anderen Dateien finden Sie in <<printing-lpd-filters>>.
[.procedure]
****
. Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge:
+
[source,shell]
....
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
....
. Erstellen Sie als `root` die Datei [.filename]#/etc/printcap# mit folgendem Inhalt:
+
[.programlisting]
....
lp:\
:lp=/dev/unlpt0:\ <.>
:sh:\
:mx#0:\
:sd=/var/spool/lpd/lp:\
:lf=/var/log/lpd-errs:
....
+
<.> Diese Zeile ist für einen Drucker, der an einem USB-Port angeschlossen ist.Für einen Drucker, der am parallelen oder "Drucker"-Port angeschlossen ist, verwenden Sie:Für einen Netzwerkdrucker verwenden Sie:Ersetzen Sie _network-printer-name_ durch den DNS-Namen des Netzwerkdruckers.
. Aktivieren Sie `lpd` beim Systemstart, indem Sie folgende Zeile in [.filename]#/etc/rc.conf# hinzufügen:
+
[.programlisting]
....
lpd_enable="YES"
....
+
Starten Sie den Dienst:
+
[source,shell]
....
# service lpd start
Starting lpd.
....
+
Drucken Sie eine Testseite:
+
[source,shell]
....
# printf "1. Der Drucker kann drucken.\n2. Dies ist die zweite Zeile.\n" | lpr
....
+
[TIP]
====
Wenn die beiden Zeilen nicht am linken Rand starten und Sie einen "Treppeneffekt" beobachten, lesen Sie <<printing-lpd-filters-stairstep>>.
====
+
Mit `lpr` können nun Textdateien gedruckt werden. Geben Sie den Dateinamen auf der Kommandozeile an oder lassen Sie `lpr` von einer Pipe lesen.
+
[source,shell]
....
% lpr textfile.txt
% ls -lh | lpr
....
****
[[printing-connections]]
== Druckerverbindungen
Es gibt eine Vielzahl von Möglichkeiten, einen Drucker mit einem Rechner zu verbinden. Kleine Desktop-Drucker werden in der Regel mit dem USB-Anschluss verbunden, ältere Modelle nutzen oft die parallele Schnittstelle. Einige Drucker sind direkt mit einem Netzwerk verbunden, damit sie leichter von mehreren Rechnern benutzt werden können. Nur noch wenige Drucker verwenden einen seriellen Anschluss.
FreeBSD unterstützt die folgenden Arten von Druckern:
[[printing-connections-usb]]
USB::
USB-Drucker können mit einem freien USB-Anschluss des Rechners verbunden werden.
+
Wenn FreeBSD einen USB-Drucker erkennt, werden zwei Gerätenamen erstellt: [.filename]#/dev/ulpt0# und [.filename]#/dev/unlpt0#. Beide Geräte leiten die Daten an den Drucker weiter. Nach jedem Druckauftrag wird der USB-Anschluss von [.filename]#ultp0# zurückgesetzt. Das Zurücksetzen kann bei einigen Druckern Probleme verursachen, daher wird in der Regel stattdessen [.filename]#unlpt0# verwendet, das den Anschluss nicht zurücksetzt.
[[printing-connections-parallel]]
Prallel (IEEE-1284)::
Die parallele Schnittstelle ist [.filename]#/dev/lpt0#. Der Gerätename erscheint unabhängig davon, ob ein Drucker angeschlossen ist oder nicht. Eine automatische Erkennung findet nicht statt.
+
Die Hersteller haben sich weitgehend von diesem älteren Anschluss verabschiedet und auch viele Rechner haben keine parallele Schnittstelle mehr. Es existieren jedoch Adapter, um einen parallelen Drucker an einem USB-Port anzuschließen. Der Drucker wird dann wie ein USB-Drucker behandelt. Es können auch _Printserver_ verwendet werden, um parallele Drucker direkt mit einem Netzwerk zu verbinden.
[[printing-connections-serial]]
Seriell (RS-232)::
Serielle Anschlüsse sind veraltet und werden außer in Nischenanwendungen nur noch selten verwendet. Die Kabel, Stecker und die erforderliche Verkabelung sind oft sehr unterschiedlich.
+
Der Gerätename für einen seriellen Anschlüsse ist [.filename]#/dev/cuau0# oder [.filename]#/dev/cuau1#. Es können auch USB-Adapter verwendet werden. Diese erscheinen als [.filename]#/dev/cuaU0#.
+
Damit mit dem Drucker kommuniziert werden kann, müssen einige Kommunikationsparameter bekannt sein. Zu den wichtigsten zählen die _Baudrate_ (BPS - Bits pro Sekunde) und die _Parität_. Diese Werte variieren, aber typische serielle Drucker verwenden eine Baudrate von 9600 und keine Parität.
[[printing-connections-network]]
Netzwerk::
Netzwerkdrucker werden direkt mit dem lokalen Netzwerk verbunden.
+
Der DNS-Name des Druckers muss bekannt sein. Wenn dem Drucker eine dynamische Adresse per DHCP zugeteilt wird, sollte das DNS automatisch aktualisiert werden, so dass der Drucker immer die richtige IP-Adresse hat. Um dieses Problem zu vermeiden, werden Netzwerkdruckern häufig statische IP-Adressen zugeteilt.
+
Die meisten Netzwerkdrucker verstehen Druckaufträge, die über das LPD-Protokoll empfangen werden. Sie können auch den Namen der Druckwarteschlange angeben. Einige Drucker verarbeiten die Daten unterschiedlich, je nachdem welche Warteschlange verwendet wird. Zum Beispiel druckt eine `Raw`-Warteschlange die Daten unverändert, während eine `Text`-Warteschlange den Text um Wagenrückläufe ergänzt.
+
Viele Netzwerkdrucker können auch Daten drucken, die direkt an Port 9100 gesendet werden.
[[printing-connections-summary]]
=== Zusammenfassung
Verkabelte Netzwerkdrucker drucken in der Regel am schnellsten und sind einfach einzurichten. Für den direkten Anschluss am Rechner wird USB wegen seiner Geschwindigkeit und Einfachheit bevorzugt. Parallele Verbindungen funktionieren, haben jedoch ihre Begrenzung in Bezug auf Kabellänge und Geschwindigkeit. Serielle Verbindungen sind schwieriger zu konfigurieren und die Verdrahtung unterscheidet sich zwischen den Modellen. Zudem müssen Baudrate und Parität bekannt sein. Glücklicherweise sind serielle Drucker selten geworden.
[[printing-pdls]]
== Gebräuchliche Seitenbeschreibungssprachen
Daten, die an einen Drucker gesendet werden, müssen in einer Sprache verfasst sein, die der Drucker verstehen kann. Diese Sprachen werden Seitenbeschreibungssprachen oder Page Description Languages (PDL) genannt.
[[print-pdls-ascii]]
ASCII::
Schlichter ASCII-Text ist die einfachste Möglichkeit, um Daten an einen Drucker zu senden. Die Zeichen werden eins zu eins gedruckt: ein `A` in den Daten erscheint beim Druck als `A` auf dem Papier. Eine Formatierung ist nur bedingt verfügbar und es gibt keine Möglichkeit, eine Schriftart oder eine bestimmte Laufweite zu wählen. Die Einfachheit von schlichtem ASCII-Text bedeutet, dass Text ohne bzw. wenig Codierung oder Übersetzung gedruckt werden kann. Die gedruckte Ausgabe entspricht dem, was an den Drucker gesendet wurde.
+
Einige kostengünstige Drucker können keinen einfachen ASCII-Text drucken. Das macht sie in der Regel schwieriger einzurichten.
[[print-pdls-postscript]]
PostScript(R)::
PostScript(R) ist fast das Gegenteil von ASCII. Anstelle von einfachem Text, besteht ein PostScript(R)-Programm aus einer Reihe von Anweisungen, die das endgültige Dokument generieren. Es können auch verschiedene Schriften und Grafiken benutzt werden. Diese Fähigkeiten haben jedoch ihren Preis. Das Programm, das die Seite generiert, muss zunächst erzeugt werden. Normalerweise wird dieses Programm durch die Anwendung erzeugt, so dass der Prozess für den Benutzer transparent bleibt.
+
Kostengünstige Drucker sind manchmal nicht kompatibel mit PostScript(R).
[[print-pdls-pcl]]
PCL (Printer Command Language)::
PCL ist eine Erweiterung von ASCII. Es enthält Escape-Sequenzen für die Formatierung, Schriftauswahl und das Drucken von Grafiken. Viele Drucker bieten Unterstützung für PCL5, einige unterstützen auch das neuere PCL6 oder PCLXL. Die neueren Versionen sind Kombinationen von PCL5 und bieten eine schnellere Druckgeschwindigkeit.
[[print-pdls-host-based]]
Host-basiert::
Hersteller können die Kosten eines Druckers reduzieren, indem sie einen einfachen Prozessor und etwas Speicher verbauen. Diese Drucker sind nicht in der Lage normalen Text zu drucken. Stattdessen werden die Texte und Grafiken von einem Treiber auf dem Host-Rechner generiert und dann an den Drucker gesendet. Diese Drucker werden Host-basierte Drucker genannt.
+
Die Kommunikation zwischen dem Treiber und dem Drucker wird oft durch proprietäre oder nicht dokumentierte Protokolle realisiert, weshalb sie nur mit den gängigsten Betriebssystemen funktionieren.
[[print-pdls-table]]
=== PostScript(R) in eine andere Sprache konvertieren
Viele Anwendungen aus der Ports-Sammlung und FreeBSD Werkzeuge können PostScript(R) erzeugen. Die folgende Tabelle listet die verfügbaren Programme, um PostScript(R) in andere PDLs zu konvertieren:
[[printing-pdls-ps-to-other-tbl]]
.Ausgabe PDLs
[cols="20%,20%,60%", options="header"]
|===
<| Ausgabe PDL
<| Generiert von
<| Hinweis
|PCL oder PCL5
|package:print/ghostscript9-base[]
|`-sDEVICE=ljet4` für Schwarzweiß, `-sDEVICE=cljet5` für Farbe
|PCLXL oder PCL6
|package:print/ghostscript9-base[]
|`-sDEVICE=pxlmono` für Schwarzweiß, `-sDEVICE=pxlcolor` für Farbe
|ESC/P2
|package:print/ghostscript9-base[]
|`-sDEVICE=uniprint`
|XQX
|package:print/foo2zjs[]
|
|===
[[print-pdls-summary]]
=== Zusammenfassung
Um die Konfiguration einfach zu halten, wählen Sie einen Drucker, der PostScript(R) oder auch PCL unterstützt. Mit package:print/ghostscript9-base[] können diese Drucker PostScript(R) nativ verstehen. Wenn der Drucker PostScript(R) oder PCL direkt unterstützt, können Sie auch sofort einfache ASCII-Textdateien drucken.
Zeilenbasierte Drucker wie Tintenstrahldrucker unterstützen in der Regel kein PostScript(R) oder PCL. Dennoch können Sie ASCII-Textdateien drucken. package:print/ghostscript9-base[] unterstützt die Sprachen dieser Drucker. Jedoch ist der Druck von Grafiken auf diesen Druckern oft sehr langsam, da aufgrund der großen Menge an Daten übertragen und ausgedruckt werden müssen.
Host-basierte Drucker sind oft schwieriger einzurichten. Einige Drucker können überhaupt nicht benutzt werden, da sie proprieräte PDLs verwerden. Solche Drucker sollten Sie nach Möglichkeit vermeiden.
Die Beschreibungen vieler PDLs finden Sie auf http://www.undocprint.org/formats/page_description_languages[]. Spezielle PDLs, die von einigen Druckern verwendet werden finden Sie auf http://www.openprinting.org/printers[].
[[printing-direct]]
== Direktes Drucken
Für den gelegentlichen Druck können die Dateien auch direkt, ohne zusätzliche Einstellungen, an den Drucker gesendet werden. Zum Beispiel kann die Datei [.filename]#sample.txt# direkt an einen USB-Drucker gesendet werden:
[source,shell]
....
# cp sample.txt /dev/unlpt0
....
Ob Sie direkt auf einen Netzwerkdrucker drucken können, hängt von den Fähigkeiten des Druckers ab. Die meisten akzeptieren jedoch Druckaufträge auf Port 9100, die Sie mit man:nc[1] an den Drucker senden können. So drucken Sie die gleiche Datei auf einem Drucker mit dem DNS-Namen _netlaser_:
[source,shell]
....
# nc netlaser 9100 < sample.txt
....
[[printing-lpd]]
== LPD (Line Printer Daemon)
Drucken im Hintergrund wird _Spooling_ genannt. Ein Spooler (Warteschlange) ermöglicht es dem Benutzer die Programme auf dem Rechner fortzusetzen, ohne warten zu müssen bis der Druckauftrag abgeschlossen ist.
FreeBSD enthält den Spooler namens man:lpd[8]. Druckaufträge werden mit man:lpr[1] übermittelt.
[[printing-lpd-setup]]
=== Konfiguration
Erstellen Sie ein Verzeichnis zur Speicherung der Druckaufträge und setzen Sie die Berechtigungen auf diesem Verzeichnis, damit der Inhalt der Druckaufträge nicht von anderen Benutzern eingesehen werden kann:
[source,shell]
....
# mkdir -p /var/spool/lpd/lp
# chown daemon:daemon /var/spool/lpd/lp
# chmod 770 /var/spool/lpd/lp
....
Drucker werden in [.filename]#/etc/printcap# angelegt. Ein Eintrag für einen Drucker enthält dessen Name, Anschluss sowie weitere Einstellungen. Erstellen Sie [.filename]#/etc/printcap# mit folgendem Inhalt:
[.programlisting]
....
lp:\ <.>
:lp=/dev/unlpt0:\ <.>
:sh:\ <.>
:mx#0:\ <.>
:sd=/var/spool/lpd/lp:\ <.>
:lf=/var/log/lpd-errs: <.>
....
<.> Der Name des Druckers. man:lpr[1] sendet Druckaufträge an den Drucker `lp`, es sei denn, ein anderer Drucker wird mit der Option `-P` angegeben. Der Standarddrucker sollte also `lp` genannt werden.
<.> Der Anschluss, über den der Drucker verbunden ist. Ersetzen Sie diese Zeile mit dem entsprechenden, hier aufgeführten Verbindungstyp.
<.> Unterdrückt das Drucken eines Deckblattes zu Beginn des Druckauftrags.
<.> Die maximale Größe des Druckauftrags wird nicht begrenzt.
<.> Das Verzeichnis zur Speicherung der Druckdaten. Jeder Drucker verwendet ein eigenes Verzeichnis.
<.> Die Logdatei, in welche die Fehler des Druckers geschrieben werden.
Nachdem Sie [.filename]#/etc/printcap# erstellt haben, verwenden Sie man:chkprintcap[8] um die Datei auf Fehler zu testen:
[source,shell]
....
# chkprintcap
....
Beheben Sie alle gemeldeten Fehler, bevor Sie fortfahren.
Aktivieren Sie man:lpd[8] in [.filename]#/etc/rc.conf#:
[.programlisting]
....
lpd_enable="YES"
....
Starten Sie den Dienst:
[source,shell]
....
# service lpd start
....
[[printing-lpd-lpr]]
=== Drucken mit man:lpr[1]
Mit `lpr` werden Dokumente an den Drucker geschickt. Die Datei können Sie auf der Kommandozeile angeben, oder über eine Pipe an `lpr` schicken. Die beiden folgenden Kommandos sind gleichwertig, sie schicken den Inhalt von [.filename]#doc.txt# an den Standarddrucker:
[source,shell]
....
% lpr doc.txt
% cat doc.txt | lpr
....
Drucker können auch mit `-P` ausgewählt werden. Um auf einen Drucker namens _laser_ zu drucken:
[source,shell]
....
% lpr -Plaser doc.txt
....
[[printing-lpd-filters]]
=== Filter
In den bisher gezeigten Beispielen wurde lediglich eine Textdatei an den Drucker gesendet. Solange der Drucker den Inhalt dieser Dateien versteht, wird die Ausgabe korrekt gedruckt werden.
Einige Drucker sind nicht in der Lage einfachen Text zu drucken. Es kann sogar sein, das die Eingabedatei gar keinen Text enthält.
Mit Hilfe von _Filtern_ können Dateien übersetzt oder verarbeitet werden. Ein typischer Anwendungsfall ist die Umwandlung der Eingabedaten in ein Format, das der Drucker verstehen kann, wie bspw. PostScript(R) oder PCL. Filter können auch verwendet werden um zusätzliche Funktionen hinzuzufügen, wie bspw. Seitenzahlen oder das Hervorheben von Quellcode, um die Lesbarkeit zu verbessern.
Die hier beschriebenen Filter werden _Eingabefilter_ oder auch _Textfilter_ genannt. Diese Filter übersetzen die eingehende Datei in verschiedene Formen. Werden Sie mit man:su[1] zu `root`, bevor Sie die Dateien erstellen.
Filter werden in [.filename]#/etc/printcap# mit der Kennung `if=` festgelegt. Um [.filename]#/usr/local/libexec/lf2crlf# als Filter einzusetzen, bearbeiten Sie [.filename]#/etc/printcap# wie folgt:
[.programlisting]
....
lp:\
:lp=/dev/unlpt0:\
:sh:\
:mx#0:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/libexec/lf2crlf:\ <.>
:lf=/var/log/lpd-errs:
....
<.> `if=` identifiziert den Eingangsfilter, der auf den eingehenden Text angewendet werden soll.
[TIP]
====
Der Backslash am Ende der Zeilen zeigt an, das ein Eintrag für einen Drucker wirklich nur eine Zeile ist, in der die einzelnen Einträge durch einen Doppelpunkt getrennt sind. Das Beispiel hätte man auch wie folgt schreiben können:
[.programlisting]
....
lp:lp=/dev/unlpt0:sh:mx#0:sd=/var/spool/lpd/lp:if=/usr/local/libexec/lf2crlf:lf=/var/log/lpd-errs:
....
====
[[printing-lpd-filters-stairstep]]
==== Den Treppeneffekt verhindern
Typische Textdateien enthalten einen Zeilenvorschub am Ende jeder Zeile. Diese Zeilen erzeugen auf dem Drucker einen "Treppeneffekt":
[.programlisting]
....
A printed file looks
like the steps of a staircase
scattered by the wind
....
Ein Filter kann Zeilenumbrüche in Wagenrückläufe und Zeilenumbrüche konvertieren. Erstellen Sie [.filename]#/usr/local/libexec/lf2crlf# mit folgendem Inhalt:
[.programlisting]
....
#!/bin/sh
CR=$'\r'
/usr/bin/sed -e "s/$/${CR}/g"
....
Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
[source,shell]
....
# chmod 555 /usr/local/libexec/lf2crlf
....
Passen Sie [.filename]#/etc/printcap# an, so dass der neue Filter verwendet wird:
[.programlisting]
....
:if=/usr/local/libexec/lf2crlf:\
....
Drucken Sie nochmal die gleiche Datei, um den Filter zu testen.
[[printing-lpd-filters-enscript]]
==== Mit package:print/enscript[] normalen Text auf PostScript(R)-Druckern drucken
GNUEnscript wandelt Textdateien in formatiertes PostScript(R) um, die dann auf PostScript(R)-Druckern gedruckt werden können. Das Programm fügt auch Seitenzahlen und Zeilenumbrüche hinzu und stellt andere Funktionen bereit, um gedruckte Textdateien besser lesbar zu machen. Abhängig vom Papierformat können Sie entweder package:print/enscript-letter[] oder package:print/enscript-a4[] aus der Ports-Sammlung installieren.
Erstellen Sie [.filename]#/usr/local/libexec/enscript# mit diesem Inhalt:
[.programlisting]
....
#!/bin/sh
/usr/local/bin/enscript -o -
....
Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
[source,shell]
....
# chmod 555 /usr/local/libexec/enscript
....
Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:
[.programlisting]
....
:if=/usr/local/libexec/enscript:\
....
Testen Sie den Filter, indem Sie eine einfache Textdatei drucken.
[[printing-lpd-filters-ps2pcl]]
==== PostScript(R) auf PCL-Druckern drucken
Viele Programme erzeugen PostScript(R)-Dokumente. Allerdings können kostengünstige Drucker oft nur Textdateien oder PCL verstehen. Dieser Filter wandelt PostScript(R)-Dateien in PCL um, bevor die Datei an den Drucker geschickt wird. Installieren Sie den Ghostscript PostScript(R) Interpreter package:print/ghostscript9-base[] aus der Ports-Sammlung.
Erstellen Sie [.filename]#/usr/local/libexec/ps2pcl# mit diesem Inhalt:
[.programlisting]
....
#!/bin/sh
/usr/local/bin/gs -dSAFER -dNOPAUSE -dBATCH -q -sDEVICE=ljet4 -sOutputFile=- -
....
Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
[source,shell]
....
# chmod 555 /usr/local/libexec/ps2pcl
....
Die PostScript(R)-Eingabe wird von dem Skript erst in PCL umgewandelt, bevor es an den Drucker geschickt wird.
Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:
[.programlisting]
....
:if=/usr/local/libexec/ps2pcl:\
....
Testen Sie den Filter mit einem kleinen PostScript(R)-Programm.
[source,shell]
....
% printf "%%\!PS \n /Helvetica findfont 18 scalefont setfont \
72 432 moveto (PostScript printing successful.) show showpage \004" | lpr
....
[[printing-lpd-filters-smart]]
==== Intelligente Filter
Ein Filter kann sehr nützlich sein, wenn er die Eingabe erkennt und sie automatisch in ein für den Drucker verständliches Format umwandelt. Die ersten beiden Zeichen in einer PostScript(R)-Datei sind in der Regel `%!`. Ein Filter ist in der Lage diese beiden Zeichen zu erkennen. PostScript(R)-Dateien können unverändert an einen PostScript(R)-Drucker geschickt werden. Textdateien können, wie eben gezeigt, mit Enscript in PostScript(R) umgewandelt werden. Erstellen Sie [.filename]#/usr/local/libexec/psif# mit diesem Inhalt:
[.programlisting]
....
#!/bin/sh
#
# psif - Print PostScript or plain text on a PostScript printer
#
IFS="" read -r first_line
first_two_chars=`expr "$first_line" : '\(..\)'`
case "$first_two_chars" in
%!)
# %! : PostScript job, print it.
echo "$first_line" && cat && exit 0
exit 2
;;
*)
# otherwise, format with enscript
( echo "$first_line"; cat ) | /usr/local/bin/enscript -o - && exit 0
exit 2
;;
esac
....
Setzen Sie die Berechtigungen und machen Sie die Datei ausführbar:
[source,shell]
....
# chmod 555 /usr/local/libexec/psif
....
Bearbeiten Sie [.filename]#/etc/printcap# um den neuen Filter zu verwenden:
[.programlisting]
....
:if=/usr/local/libexec/psif:\
....
Um den Filter zu testen, drucken Sie PostScript(R)- und einfache Textdateien.
[[printing-lpd-filters-othersmart]]
==== Weitere intelligente Filter
Einen Filter zu schreiben, der verschiedene Arten von Eingaben erkennen und formatieren kann, ist eine große Herausforderung. package:print/apsfilter[] aus der Ports-Sammlung ist auch ein intelligenter Filter, der Dutzende Dateitypen automatisch in eine für den Drucker verständliche PDL umwandeln kann. Weitere Details finden Sie auf http://www.apsfilter.org[].
[[printing-lpd-queues]]
=== Mehrere Warteschlangen
Die Einträge in [.filename]#/etc/printcap# sind nichts anderes als Definitionen von Warteschlangen. Für jeden Drucker können eine oder mehrere Warteschlangen definiert werden. Kombiniert mit Filtern bieten mehrere Warteschlangen eine bessere Kontrolle über die Druckaufträge.
Als Beispiel dient ein vernetzter PostScript(R)-Laserdrucker in einem Büro. Die meisten Benutzer möchten einfache Textdateien drucken, aber ein paar fortgeschrittene Anwender sollen in der Lage sein, PostScript(R)-Dateien direkt zu drucken. Hierfür werden zwei Einträge für den Drucker in [.filename]#/etc/printcap# erstellt:
[.programlisting]
....
textprinter:\
:lp=9100@officelaser:\
:sh:\
:mx#0:\
:sd=/var/spool/lpd/textprinter:\
:if=/usr/local/libexec/enscript:\
:lf=/var/log/lpd-errs:
psprinter:\
:lp=9100@officelaser:\
:sh:\
:mx#0:\
:sd=/var/spool/lpd/psprinter:\
:lf=/var/log/lpd-errs:
....
Dokumente, die zum `textprinter` geschickt werden, werden wie im vorherigen Beispiel durch den Filter [.filename]#/usr/local/libexec/enscript# formatiert. Fortgeschrittene Anwender können PostScript(R)-Dateien direkt auf dem Drucker `psprinter` drucken, wo keine Filterung stattfindet.
Mit mehreren Warteschlangen können Sie einen direkten Zugriff auf alle Arten von Druckerfunktionen zur Verfügung stellen. Ein Duplex-Drucker könnte zwei Warteschlangen verwenden, eine für den gewöhnlichen Druck und eine für den Duplexdruck.
[[printing-lpd-monitor]]
=== Druckaufträge steuern und überwachen
Es stehen verschiedene Programme zur Verfügung um Druckaufträge zu überwachen und den Druckbetrieb zu steuern.
[[printing-lpd-monitor-lpq]]
==== man:lpq[1]
man:lpq[1] zeigt den Status der Druckaufträge des Benutzers an. Druckaufträge anderer Benutzer werden nicht angezeigt.
Dieser Befehl zeigt die anstehenden Druckaufträge eines Benutzers für einen Drucker an:
[source,shell]
....
% lpq -Plp
Rank Owner Job Files Total Size
1st jsmith 0 (standard input) 12792 bytes
....
Der folgende Befehl zeigt die anstehenden Druckaufträge eines Benutzers für alle Drucker an:
[source,shell]
....
% lpq -a
lp:
Rank Owner Job Files Total Size
1st jsmith 1 (standard input) 27320 bytes
laser:
Rank Owner Job Files Total Size
1st jsmith 287 (standard input) 22443 bytes
....
[[printing-lpd-monitor-lprm]]
==== man:lprm[1]
Mit man:lprm[1] können Druckaufträge gelöscht werden. Normale Benutzer dürfen lediglich ihre eigenen Aufträge löschen. `root` kann hingegen jeden beliebigen Auftrag löschen.
Dieser Befehl löscht alle anstehenden Druckaufträge eines Druckers:
[source,shell]
....
# lprm -Plp -
dfA002smithy dequeued
cfA002smithy dequeued
dfA003smithy dequeued
cfA003smithy dequeued
dfA004smithy dequeued
cfA004smithy dequeued
....
Mit dem folgenden Befehl löschen Sie einen bestimmten Druckauftrag. Benutzen Sie man:lpq[1], um die Nummer des Auftrags zu finden.
[source,shell]
....
% lpq
Rank Owner Job Files Total Size
1st jsmith 5 (standard input) 12188 bytes
% lprm -Plp 5
dfA005smithy dequeued
cfA005smithy dequeued
....
[[printing-lpd-monitor-lpc]]
==== man:lpc[8]
Mit man:lpc[8] kann der Druckerstatus überprüft und verändert werden. `lpc` wird zusammen mit einem Kommando und optional mit einem Druckernamen aufgerufen. Mit `all` können alle Drucker angesprochen werden, auf denen das Kommando ausgeführt werden soll. Normale Benutzer können sich den Status mit man:lpc[8] ansehen. Nur `root` darf Kommandos ausführen, die den Status des Druckers verändern.
Dieser Befehl zeigt den Status von allen Druckern an:
[source,shell]
....
% lpc status all
lp:
queuing is enabled
printing is enabled
1 entry in spool area
printer idle
laser:
queuing is enabled
printing is enabled
1 entry in spool area
waiting for laser to come up
....
Der Drucker kann die Annahme neuer Druckaufträge verweigern. Anschließend sollen Aufträge wieder akzeptiert werden:
[source,shell]
....
# lpc stop lp
lp:
printing disabled
# lpc start lp
lp:
printing enabled
daemon started
....
Starten Sie den Drucker nach einem Fehler neu:
[source,shell]
....
# lpc restart lp
lp:
no daemon to abort
printing enabled
daemon restarted
....
Schalten Sie die Warteschlange aus und deaktivieren Sie den Druck. Sie können den Benutzern gleichzeitig eine Nachricht hinterlassen:
[source,shell]
....
# lpc down lp Ersatzteile werden am Montag ankommen
lp:
printer and queuing disabled
status message is now: Ersatzteile werden am Montag ankommen
....
Reaktivieren Sie den Drucker:
[source,shell]
....
# lpc up lp
lp:
printing enabled
daemon started
....
Weitere Kommandos und Optionen finden Sie in man:lpc[8].
[[printing-lpd-shared]]
=== Gemeinsam genutzte Drucker
In Unternehmen und Schulen werden Drucker häufig von mehreren Benutzern genutzt. Es werden zusätzliche Funktionen angeboten, um die gemeinsame Nutzung von Druckern zu erleichtern.
[[printing-shared-aliases]]
==== Aliase
Der Druckername wird in der ersten Zeile von [.filename]#/etc/printcap# festgelegt. Weitere Namen oder _Aliase_ können nach dem Druckernamen hinzugefügt werden. Aliase werden vom Namen durch das Pipe-Zeichen `|` getrennt:
[.programlisting]
....
lp|repairsprinter|salesprinter:\
....
Anstelle des Druckernamens können Aliase verwendet werden. Zum Beispiel können Mitarbeiter der Verkaufsabteilung wie folgt auf ihren Drucker drucken:
[source,shell]
....
% lpr -Psalesprinter sales-report.txt
....
Mitarbeiter der Reparaturabteilung drucken auf dem Drucker mit:
[source,shell]
....
% lpr -Prepairsprinter repairs-report.txt
....
Alle Dokumente werden auf diesem einen Drucker gedruckt. Wenn die Verkaufsabteilung größer wird und die Abteilung einen eigenen Drucker benötigt, kann der Alias entfernt und für einen neuen Drucker verwendet werden. Die Mitarbeiter in beiden Abteilungen benutzen zum Drucken weiterhin die gleichen Befehle, nur dass die Aufträge der Verkaufsabteilung jetzt zum neuen Drucker gesendet werden.
[[printing-shared-headers]]
==== Deckblätter
Bei einem viel benutzten Drucker kann es für die Anwender schwierig sein, ihre Dokumente in einem großen Papierstapel wiederzufinden. Um dieses Problem zu lösen, können _Deckblätter_ verwendet werden. Dabei wird vor jedem Druckauftrag ein Deckblatt mit dem Benutzernamen und dem Dokumentnamen gedruckt. Deckblätter werden manchmal auch als _Banner_ oder _Trennseite_ bezeichnet.
Das Aktivieren der Deckblätter hängt davon ab, ob der Drucker direkt über ein USB, paralleles oder serielles Kabel, oder über ein Netzwerk mit dem Rechner verbunden ist.
Wenn der Drucker direkt verbunden ist, aktivieren Sie die Deckblätter durch Entfernen der Zeile `:sh:\` (Supress Header) in [.filename]#/etc/printcap#. Diese Deckblätter verwenden lediglich einen Zeilenvorschub für neue Zeilen. Einige Drucker benötigen den Filter [.filename]#/usr/shared/examples/printing/hpif# um den Treppeneffekt zu vermeiden. Der Filter konfiguriert PCL-Drucker so, dass sowohl Zeilenumbrüche als auch Zeilenvorschübe verwendet werden, wenn ein Zeilenvorschub empfangen wird.
Für Netzwerkdrucker müssen Deckblätter auf dem Drucker selbst konfiguriert werden, da Einträge für Deckblätter in [.filename]#/etc/printcap# ignoriert werden. Die Einstellungen sind über einen Webbrowser zugänglich und stehen in der Regel auf der Hauptseite der Konfigurations-Webseite zur Verfügung.
[[printing-lpd-references]]
=== Referenzen
Beispieldateien: [.filename]#/usr/shared/examples/printing/#.
Das _4.3BSD Line Printer Spooler Manual_, [.filename]#/usr/shared/doc/smm/07.lpd/paper.ascii.gz#.
Manualpages: man:printcap[5], man:lpd[8], man:lpr[1], man:lpc[8], man:lprm[1], man:lpq[1].
[[printing-other]]
== Andere Drucksysteme
Neben dem in FreeBSD enthaltenen man:lpd[8] existieren noch weitere Drucksysteme. Diese Systeme bieten zusätzliche Funktionen und Unterstützung für andere Protokolle.
[[printing-other-cups]]
=== CUPS (Common UNIX(R) Printing System)
CUPS ist ein beliebtes Drucksystem, das für viele Betriebssysteme erhältlich ist. CUPS unter FreeBSD wird in einem separaten Artikel beschrieben: link:{cups}[CUPS on FreeBSD].
[[printing-other-hplip]]
=== HPLIP
Hewlett Packard stellt ein Drucksystem zur Verfügung, das viele ihrer Drucker unterstützt. Der Port heißt package:print/hplip[]. Die Webseite befindet sich unter http://hplipopensource.com/hplip-web/index.html[]. Der FreeBSD-Port kümmert sich um alle Details während der Installation. Informationen zur Konfiguration finden Sie unter http://hplipopensource.com/hplip-web/install/manual/hp_setup.html[].
[[printing-other-lprng]]
=== LPRng
LPRng wurde als eine verbesserte Alternative zu man:lpd[8] entwickelt. Der Port heißt package:sysutils/LPRng[]. Weitere Informationen und Dokumentation finden Sie unter http://www.lprng.com/[].
|