Von der Festplatte direkt aufs Papier

Aus LinuxUser 02/2020

Von der Festplatte direkt aufs Papier

© Paolo de Santis, 123RF

Drucken per Skript

Für wiederkehrende Aufgaben lohnen sich automatisierte Lösungen. Mit einfachen Shell-Skripten erstellen Sie Druckausgaben oder verwalten Ihre Drucker.

Wer mit LibreOffice oder einer Bildbearbeitung wie Gimp arbeitet, muss nicht lange nach der Druckfunktion suchen. Das Druck-Icon findet sich meist gleich links oben in der Funktionsleiste, ersatzweise genügt ein Druck auf [Strg]+[P]. In vielen Situationen wäre es allerdings praktisch, auf eine Anwendung verzichten zu können – etwa, wenn man aus einem Skript heraus drucken möchte.

Per Shell-Befehl lassen sich auch komplexe Druckbefehle absetzen. So gibt es Anweisungen, um mehrere Seiten auf einem Blatt unterzubringen, für Duplexdruck oder Deckblätter, die das Sortieren erleichtern, oder Optionen zum Ändern der Seitenausrichtung.

Prinzipiell offeriert Linux mit lp und lpr zwei Kommandos, um Drucker von der Befehlszeile aus anzusteuern. Die Tabelle “Druckbefehle” zeigt einige wichtige Möglichkeiten auf. Die Optionen für die beiden Befehle fallen sehr umfangreich aus, die Tabelle “Druckoptionen” erklärt einige wichtige Varianten für den Alltag. Für die Einstellungen zum Papier und anderes ziehen Sie die umfangreichen Manpages von Lp [1] und Lpr [2] zurate.

Aktion

Lp

Lpr

Ausgabe auf Standarddrucker

lp Datei

lpr Datei

Ausgabe mit Druckerangabe

lp -d Drucker Datei

lpr -P Drucker Datei

Anzahl Kopien (max. 100)

lp -n Anzahl [...]

lpr -# Anzahl [...]

ohne Filter drucken

lp -o raw [...]

lpr -o raw [...]

zu druckende Seiten

lp -P Seiten [...]

Aktion

Eingabe

Hinweis

Papiergröße

-o media=Format

zum Beispiel a3, a4, a5

Querformat

-o landscape

einseitiger Druck

-o sides=one-sided

Duplexdruck

-o sides=two-sided-long-edge

Bindekante an langer Seite

Duplexdruck

-o sides-two-sided-short-edge

Bindekante an kurzer Seite

an Seitengröße anpassen

-o fit-to-page

mehrere Seiten auf einem Blatt zusammenfassen

-o number-up=Zahl

Mögliche Werte: 2, 4, 6, 9, 16

Warteschlangen anzeigen

Den Status zu den aktuell anstehenden Druckaufgaben lassen Sie sich über die Kommandos lpq oder lpstat ausgeben. Ohne weitere Optionen ausgeführt, zeigen beide Befehle die Warteschlange des Standarddruckers an. Optional geben Sie mit der Option -P Drucker den gewünschten Drucker an.

Alle Drucker und deren augenblicklichen Zustand erhalten Sie entweder mit lpstat -a, lpstat -o oder lpq -a (Abbildung 1). Das Kommando lpstat -t liefert eine umfassende Übersicht über Drucker, Warteschlangen und Aufträge.

Abbildung 1: Die in der Warteschlange abgelegten Druckaufträge lassen sich auf vielen Wegen abfragen.

Abbildung 1: Die in der Warteschlange abgelegten Druckaufträge lassen sich auf vielen Wegen abfragen.

Liegen Druckaufträge vor, erhalten Sie eine Ausgabe wie in Abbildung 2 gezeigt. Unter anderem finden Sie hier die Jobnummer, mit der Sie bei Bedarf einen Druckauftrag in der Warteschlange verwalten. Für verschiedene Aktionen müssen Sie die Druckauftragsnummer aus den Ausgaben extrahieren.

Abbildung 2: Die mit Bindestrich an den Druckernamen angehängte Zahl entspricht der Nummer des Druckauftrags.

Abbildung 2: Die mit Bindestrich an den Druckernamen angehängte Zahl entspricht der Nummer des Druckauftrags.

Mittels des Kommandos aus Listing 1 filtern Sie die Nummer des aktuellen Druckauftrags aus dem Statusbericht. Anhand der Nummer erhalten Sie erweiterte Auskünfte zum Druckauftrag, können den zugehörigen Auftrag löschen oder ihn auf einen anderen Drucker verschieben.

Listing 1

$ lpq -al | grep job | cut -d\[ -f2 | cut -d ' ' -f2

Druckaufträge managen

Den Abbruch eines Druckauftrags fordern Sie mit lprm Auftragsnummer oder cancel Auftragsnummer an. Die Auftragsnummer erhalten Sie über die Anzeige der Warteschlange via lpq -a. Um einen Druckjob abzubrechen, müssen Sie entweder Eigentümer des Druckjobs sein oder entsprechende administrative Rechte besitzen. Mit cancel -a löschen Sie alle aktuellen Druckaufträge, egal, auf welchem Drucker. Geben Sie hinter der Option daher besser den betroffenen Drucker an. In Abbildung 3 kommt Lprm zum Einsatz und löscht einen der vorhandenen Druckaufträge.

Abbildung 3: Landet die hunderseitige Masterarbeit auf dem falschen Drucker, lässt sich der Auftrag auch aus dem Terminal heraus abbrechen.

Abbildung 3: Landet die hunderseitige Masterarbeit auf dem falschen Drucker, lässt sich der Auftrag auch aus dem Terminal heraus abbrechen.

Falls im laufenden Betrieb ein Drucker ausfällt, Sie aber den Druckauftrag nicht unterbrechen möchten, dann verschieben Sie ihn mittels lpmove auf ein anderes Gerät – entsprechende Rechte vorausgesetzt. Dieses Kommando verwenden Sie in der Form lpmove Jobnummer NeuerDrucker beziehungsweise für alle Druckaufträge eines Druckers mit lpmove AlterDrucker NeuerDrucker. Abbildung 4 zeigt den Umzug von Druckaufträgen vom Drucker laserjet auf lp.

Abbildung 4: Fällt ein Drucker unerwartet aus, lassen sich die Druckaufträge auf einen funktionsfähigen Drucker umleiten.

Abbildung 4: Fällt ein Drucker unerwartet aus, lassen sich die Druckaufträge auf einen funktionsfähigen Drucker umleiten.

Aufträge per Skript

Zusammen mit einigen anderen Shell-Funktionen lassen sich die vorgestellten Befehle zu einem Skript zusammenbauen, das Details zu einem Druckjob ausgibt und ihn bei Bedarf auf Knopfdruck löscht (Listing 2). Möchten Sie die Routine als Funktion in Ihren eigenen Shell-Skripten nutzen, schneiden Sie den Quelltext der Funktion djobs () { [...] } heraus und fügen ihn am Anfang Ihres eigenen Programms ein.

Listing 2

#!/bin/bash
djobs () {
  clear
  echo "Laufende Druckjobs:"
  echo "---------------------------------------------------------------"
  lpq -a
  echo "---------------------------------------------------------------"
  echo "Druckjob auswählen: "
  dj=$(lpq -al | grep job | cut -d\[ -f2 | cut -d ' ' -f2 | smenu -n10 -t1 )
  echo "Ausgewählter Druckjob: $dj"
  lpq -a $dj
  echo "---------------------------------------------------------------"
  aktion=$(echo "Nichts Abbruch" | smenu -m "Aktion auswählen" )
  if [ "$aktion" = "Abbruch" ]; then
    lprm $dj
    if [ $? -eq 0 ]; then
      echo "Druckauftrag $dj gelöscht"
    fi
    sleep 2
  fi
  exit 0
}
djobs

Mithilfe der Werkzeuge Smenu [3] und Yad [4] (siehe Kasten “Menüwerkzeuge”) lassen sich recht leicht Auswahldialoge verwirklichen. Das Kommandozeilentool Smenu empfiehlt sich für Konsolenritter und Anwender, die über SSH auf einem entfernten Rechner arbeiten. Yad hingegen bietet sich als Option für Nutzer an, die lieber in der Desktop-Umgebung bleiben. Das Programm bringt mithilfe einfacher Anweisungen Fenster auf den Bildschirm.

Menüwerkzeuge

In der Standardinstallation der meisten Distributionen fehlen Smenu und Yad. Über die gleichnamigen Pakete smenu und yad lassen sich jedoch beide Programme schnell aus den Paketquellen einspielen.

Bei Smenu zeigt die Option -m Titel dem Benutzer an, was er auswählt, und gegebenenfalls, warum. Ohne weitere Optionen wählen Sie wortweise innerhalb einer Zeile den gewünschten Eintrag aus. Mit -n Zahl begrenzen Sie die Auswahlzeilen; mit t1 legen Sie fest, dass Smenu die Auswahl zeilenweise mit nur einer Spalte darstellt. Abbildung 5 zeigt den Ablauf des Skripts.

Abbildung 5: Die Funktion <code>djobs()</code> aus <a href="#artRef-l2">Listing&nbsp;2</a> h&uuml;llt die oft kryptischen Druckkommandos in einfache Dialoge.

Abbildung 5: Die Funktion djobs() aus Listing 2 hüllt die oft kryptischen Druckkommandos in einfache Dialoge.

Für eine reine Terminalsitzung empfiehlt sich das Skript aus Listing 3. Damit wählen Sie einen Drucker für die Druckausgabe, die Warteschlangenanzeige oder für das Verschieben einer Warteschlange aus. Das Beispiel in Abbildung 6 listet die Druckjobs des betreffenden Druckers auf.

Listing 3

#!/bin/bash
dru () {
  clear
  ziel=$(/usr/sbin/lpc status all | grep \: | tr -d \: | smenu -n3 -c -m "Drucker auswählen:")
  # Beispiel: Warteschlangenausgabe
  lpq -P$ziel
  exit 0
}
dru

Abbildung 6: Die Funktion <code>dru()</code> aus <a href="#artRef-l3">Listing&nbsp;3</a> f&uuml;hrt alle verf&uuml;gbaren Drucker auf und gibt dann die Druckwarteschlange des ausgew&auml;hlten Ger&auml;ts aus.

Abbildung 6: Die Funktion dru() aus Listing 3 führt alle verfügbaren Drucker auf und gibt dann die Druckwarteschlange des ausgewählten Geräts aus.

Als grafische Alternative bietet sich Yad an. Ohne viel Programmierarbeit lassen sich mit diesem Werkzeug einfache Anwendungen auf Basis eines Shell-Skripts erstellen. Das Beispiel in Listing 4 zeigt die Auswahl eines Druckers und der auszudruckenden Datei.

Listing 4

#! /bin/sh
dru {
  clear
  # Drucker auslesen
  z=0
  dzeile=""
  for i in $(/usr/sbin/lpc status all | grep : | tr -d \: ); do
    dzeile=$(echo $dzeile$i!)
  done
  # Menüpunkt mit Yad
  drucker=$(yad --title="DRUCKPROGRAMM" --text="Drucker auswählen" --form \
  --field="Drucker":CB $dzeile \
  --button="Abbruch":1 \
  --button="Weiter":2)
  if [ $? -eq 1 ]; then
    exit
  fi
  drucker=$(echo $drucker | tr -d \| )
  # Beispieldatei drucken
  datei=$(yad --title="DRUCKPROGRAMM" --file)
  yad --title="DRUCKPROGRAMM" --text="Gewählte Datei $datei ausdrucken?" --yesno
  if [ $? -eq 0 ]; then
    lpr -P$drucker $datei
  fi
  exit 0
}
dru

Die Aufrufe von Yad in den Zeilen 12, 22 und 23 fragen zuerst nach dem gewünschten Drucker (Abbildung 7), öffnen dann einen Dialog zur Dateiauswahl (Abbildung 8) und blenden zum Schluss noch eine Bestätigung ein.

Abbildung 7: Per Bash-Skript lassen sich auch Programme mit grafischen Dialogen wie in <a href="#artRef-l4">Listing&nbsp;4</a> umsetzen.

Abbildung 7: Per Bash-Skript lassen sich auch Programme mit grafischen Dialogen wie in Listing 4 umsetzen.


Abbildung 8: Das Kommandozeilentool Yad unterst&uuml;tzt dabei Auswahllisten, Dateidialoge und einfache Schalter.

Abbildung 8: Das Kommandozeilentool Yad unterstützt dabei Auswahllisten, Dateidialoge und einfache Schalter.

Drucken per Skript

Ständig wiederkehrende Aufgaben, zum Beispiel eine Datenbankabfrage, lassen sich mithilfe eines Shell-Skripts sehr einfach automatisieren und wiederholt in immer derselben Qualität ausführen. Die entsprechenden Kommandozeilenwerkzeuge spucken allerdings in der Regel die Ergebnisse ohne druckbare Formatierung aus.

Mit ein wenig Hilfe durch das Kommando enscript lässt sich die Ausgabe jedoch recht leicht aufarbeiten. Das Ergebnis schreibt Enscript [5] direkt in eine Postscript-Datei und unterstützt auch das Drucken des ausgegebenen Inhalts. Das kommt im Beispielskript aus Listing 5 zur Anwendung.

Listing 5

#!/bin/bash
# Datenbankabfrage (PostgreSQL) mit Druckaufbereitung
# Auswahl PDF-Datei oder Ausdruck
weg=$(echo "Druck PDF" | smenu )
if [ "$weg" = "Druck" ]; then
  # Drucker auswählen
  ziel=$(/usr/sbin/lpc status all | grep \: | tr -d \: | smenu -n3 -c -m "Drucker auswählen:")
  # Datenbankabfrage, Zeichensatzkonvertierung, Druckaufbereitung und Druck
  psql -P border=3 -c "select * from teile;" | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -P$ziel
elif [ "$weg" = "PDF" ]; then
  # Datenbankabfrage, Zeichensatzkonvertierung, PS-Erzeugung
  psql -P border=3 -c "select * from teile;" | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o Teileliste.ps
  # Konvertieren in PDF-Datei
  ps2pdf14 Teileliste.ps
  # PS-Datei löschen
  rm -v Teileliste.ps
  echo "Abfrage in Teileliste.pdf abgelegt"
fi

Dabei gilt es jedoch, darauf zu achten, dass Enscript bislang noch nicht mit UTF-8-kodierten Dateien und Pipes zurechtkommt. Sie müssen daher die Daten im Vorfeld mittels Recode auf den gewünschten Zeichensatz umstellen. Beide Programme arbeiten sowohl in der Pipe als auch mit Dateien. Bei Bedarf lassen sich zudem die PS-Dateien mittels Ps2pdf14 ins PDF-Format umwandeln.

Das Beispielskript in Listing 5 bietet noch viel Potenzial für Verbesserungen und eigene Ideen. Den Ablauf zeigt Abbildung 9, die Ausgabe der Datenbankabfrage sehen Sie in Abbildung 10. Das Skript soll vor allem demonstrieren, mit welch geringem Aufwand sich selbst sehr komplexe Aufgaben lösen lassen. Gegenüber der bei einem Datenbank-Client eines Büropakets nötigen Klickerei erspart das Terminal-Skript viel Arbeit.

Abbildung 9: <a href="#artRef-l5">Listing&nbsp;5</a> automatisiert die Abfrage einer PostgreSQL-Datenbank. Zuerst druckt das Skript das Ergebnis direkt aus, danach schreibt es eine PDF-Datei.

Abbildung 9: Listing 5 automatisiert die Abfrage einer PostgreSQL-Datenbank. Zuerst druckt das Skript das Ergebnis direkt aus, danach schreibt es eine PDF-Datei.


Abbildung 10: So kommt die Datenbankabfrage aus dem Drucker. Das Ergebnis bereitet das Kommandozeilenwerkzeug Enscript auf.

Abbildung 10: So kommt die Datenbankabfrage aus dem Drucker. Das Ergebnis bereitet das Kommandozeilenwerkzeug Enscript auf.

Ausgabe aufarbeiten

Der in den Zeilen 10 und 13 von Listing 5 gezeigte Aufruf von Enscript lässt sich bei Bedarf an die eigenen Anforderungen anpassen. So können Sie zum Beispiel einen Ausdruck im Querformat anfordern, Art und Größe der Schrift festlegen und sogar Quelltexte mit Syntaxhervorhebung ausgeben (siehe Kasten “Quellcode in bunt”). Einige der entsprechenden Optionen führt die Tabelle “Optionen zu Enscript” auf.

Quellcode in bunt

In der Regel markieren für das Programmieren gedachte Texteditoren Kommandos, Variablen oder Anweisungen farbig; so lässt sich der Quelltext viel einfacher überblicken. Auch Enscript bietet mit dem Schalter -ESprache eine solche Funktion. Eine Liste mit allen unterstützten Schemata erhalten Sie mit den Kommandos enscript --help-highlight oder enscript --help-pretty-print, je nach Version. Die Anweisung enscript -H1 --highlight-bar-gray=08 -fCourierBold10 --color -Ebash -o Quelltext.sh.ps Quelltext.sh erstellt beispielsweise eine farbige Abbildung des Shell-Skripts Quelltext.sh (Abbildung 11). Zuvor musste auch hier wieder mit Recode der richtige Zeichensatz eingestellt werden.

Abbildung 11: Optional l&auml;sst sich die Ausgabe von Enscript auch mit einer Syntaxhervorhebung versehen und so der Ausdruck von Quellcode verbessern.

Abbildung 11: Optional lässt sich die Ausgabe von Enscript auch mit einer Syntaxhervorhebung versehen und so der Ausdruck von Quellcode verbessern.

Aktion

Option

Hinweis

Spaltenangabe

-Zahl

Angabe der auszudruckenden Seiten

-aErsteSeite-LetzteSeite

ungerade Seiten ausdrucken

-a odd

gerade Seiten ausdrucken

-a even

Seitenkopf unterdrücken

-B

Jobüberschrift unterdrücken

-h

überlange Zeilen kappen

-c

Drucker angeben

-d Drucker

Auch -P Drucker möglich.

Duplexdruck

-DDuplex

Syntaxhervorhebung

-ESprache

Übersicht mithilfe enscript --help-highlight (in neueren Versionen auch enscript --help-pretty-print) ausgeben.

Schriftart Text

-fSchriftgröße

Schriftart Kopf

-FSchriftgröße

Lesezeilen

-HZahl

Zahl gibt die Häufigkeit der Lesezeilen an, -H1 ergibt einen “Zebrastreifen” mit abwechselnd hellen und dunklen Zeilen.

Graustufen bei Lesezeilen angeben

--highlight-bar-gray=Wert

Titel

-t

Mehrfachausfertigung

-n Zahl

Ausgabedatei

-o Datei

Auch -p Datei möglich.

Querformat

-r

Fußzeile

-uText

mehrere logische Seiten je Seite

-U Zahl

Zahl muss 2 oder ein Vielfaches davon betragen.

Oft gilt es zum Beispiel, Zeilenumbrüche zu vermeiden. Bei überlangen Zeilen hilft es dann, eine kleinere Schriftart zu verwenden oder im Querformat zu drucken. Auch diese Problematik lässt sich per Skript lösen: Mit dem Kommando wc -L ermitteln Sie die Länge der längsten vorkommenden Zeile. Den so gewonnenen Wert ziehen Sie dann als Kriterium zur Festlegung der Schriftgröße und Seitenausrichtung heran:

  • Bis 80 Zeichen: 10/12 pt Schriftgröße.
  • 80 – 132 Zeichen: 8 pt Schriftgröße oder 10/12 pt und Querformat.
  • 132 Zeichen und mehr: 8/10 pt Schriftgröße und Querformat.

Listing 6 zeigt ein Teilskript, das die längste Zeile mithilfe von Wc ermittelt (Zeile 7) und Enscript dann entsprechend anweist, im Querformat zu drucken oder es bei der konventionellen Ausrichtung im Hochformat zu belassen (If-Schleife ab Zeile 10).

Listing 6

#!/bin/bash
# Dateiauswahl
datei=$(ls -1 | smenu -n 10 -t 4)
# maximale Zeilenlänge
mz=$(cat $datei | wc -L)
# Bis 80 Zeichen Hochformat, darüber Querformat
if [ $mz -lt 80 ]; then
        cat $datei | recode UTF8..ISO-8859-15 | enscript -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o $datei.ps
elif [ $mz -gt 80 ]; then
        cat $datei | recode UTF8..ISO-8859-15 | enscript -r -H1 --highlight-bar-gray=0.8 -fCourierBold10 -o $datei.ps
fi
[... Druckbefehle, PDF-Umwandlung ...]

Fazit

Auch in der Shell und in Skripten müssen Sie nicht auf den Komfort verzichten, den grafische Oberflächen beim Drucken bieten. Druckerauswahl, Warteschlangenverwaltung und das Erstellen ansprechender Druckausgaben bringen Sie ohne großen Aufwand in Ihren Shell-Skripten unter. Dabei müssen Sie weder das Rad neu erfinden noch Programmieren lernen: Simple Shell-Skripte und praktische Kommandozeilenwerkzeuge nehmen Ihnen viel Arbeit ab. 

Der Autor

Harald Zisler beschäftigt sich seit den frühen 90er-Jahren mit FreeBSD und Linux. Zu Technik- und EDV-Themen verfasst er Zeitschriftenbeiträge und Bücher.

Infos

  1. Manpage zu Lp: http://de.manpages.org/lp

  2. Manpage zu Lpr: http://de.manpages.org/lpr

  3. Smenu: Harald Zisler, “Keine Qual der Wahl”, LU 06/2017, S. 84, https://www.linux-community.de/38772

  4. Yad: Karsten Günther, “Neue Oberfläche”, LU 06/2014, S. 58, https://www.linux-community.de/30568

  5. Syntax-Highlighting in LaTeX/Enscript: Harald Zisler, “Alles bunt”, LU 04/2013, S. 48, https://www.linux-community.de/28353

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 02/2020 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben