Drucken mit Unix-Script*

*aus der Dosbox-x

Basierend auf dieser und diese Vorlage habe ich für verschiedene Drucker (Bon/A4 Laser-Drucker) mit der Dosbox-x Druck-listener gebaut, die problemlos im Hintergrund laufen und dann Dateien auf eigentlich jedem beliebigen Drucker auswirft, auch wenn die Software und der Drucker sich eigentlich nicht verstehen/keine direkte Verbindung haben. Dies ließe sich möglicherweise auch in einem Netzwerk nutzen, um z.B. PDF-Drucke von verschiedenen Quelle/Geräten/Nutzern aus einem Netzlaufwerk von einem Endgerät zu drucken, das die Verbindung (oder Treiber 😀 ) zum Drucker hat.

Dafür wird eine einfache Script-Datei erstellt, z.B.

DosDruckDienst.sh

mit folgenden Inhalt (mein angepasster Teil aus dem Beispiel):

#!/bin/bash

# File to look for
TOPRINT=~/doslpt1.txt

printf "Waiting for content at $TOPRINT\n"

while [ true ]; do
  printf "."
  sleep 1 # one second
  if test -f "$TOPRINT"; then
  	ex -s -c '1d|x' "$TOPRINT" 
  	printf "\n[$(date)] Sending $(wc -c "$TOPRINT" | awk '{print $1}') bytes\n"
    lpr -o raw "$TOPRINT" 
#   lpr -o -p DRUCKER raw "$TOPRINT"      
    rm "$TOPRINT"
  fi
done

Was passiert dort?

# Die Zeilen mit einer Raute/Hashtag am Anfang dienen der Beschreibung/sind deaktiviert.

Der Dienst muss von dir gestartet werden** (natürlich auch möglich über den Autostart die Datei beim Systemstart).

Als erstes wird die Variable „TOPRINT“ definiert (hier die Datei „doslpt1.txt“), die später gedruckt werden soll. Ob dort Wildcards (z.B. jede *.pdf in einem bestimmten Ordner drucken) definiert werden können, weiß ich nicht. Für meinen Anwendungsfall war dies nicht nötig. Zwischen verschiedenen Quellen/Dateiformaten als Quelle kann es auch unterschiedliche Anforderungen auf die folgenden Einstellungen (Drucker/Wartezeit, Format) geben. Ein modernes System wird aber auch damit klar kommen, wenn verschiedenen Druck-Scripte im Hintergrund „lauern“.

Das Script wartet auf das „auftauchen“ der definierten Datei. Wenn sie nun aus der Doxbox fällt, wird eine Schleife beschrieben die folgendes tut, während die Frage „Gibt es die Datei $TOPRINT?“ mit „Ja“ (true) beantwortet wird:

  1. sleep – es wird eine Sekunde gewartet (in einem Anwendungsfall habe ich diese Zeitraum auf 2 oder 3 Sekunden verlängert) – manchmal braucht die Quelle ne Sekunde die Datei fertig zu schreiben.
  2. if test – wenn die Datei vorliegt wird sie gesendet, definiert werden kann hinter dem Befehl
  3. lpr – in diesem Fall als purer Text (raw) an den Standard-Drucker geschickt. In der ausgeklammerten Zeile (#) dahinter ist erklärt, dass mit der Option -p der Drucker (genauer Name im System)
  4. rm – am Ende wird die Datei gelöscht, womit aus true wieder false wird und der Befehl durchgelaufen ist
  5. Jetzt wartet das Script wieder auf eine neue Datei

Wie gesagt, ich musste im wesentlichen nur die Vorlage minimal auf meine Wünsche und Probleme anpassen. Mit dem CUPS-Druck-Dienst lpr lassen sich noch deutlich mehr Dinge für den Druckvorgang anpassen und auch die Variablen wir „raw“, „-p“ verstehen. Oder es sind gewöhnliche Unix-Befehle (wie „rm“).

** wenn ihr euch angucken wollt, was das Script tut, könnt ihr es einfach im Terminal starten (Beenden wie bei allen Terminal-Anwendungen mit Strg+c)

nutzer@unix:~$ ./Dosdruckdienst.sh

Anpassung vorm Druck

Ein weiteres „Problem“ in meinem Fall war, dass das Ausgangsprogramm vor dem Inhalt immer noch einige Zeichen in der ersten Zeile ausgab, die wohl für den ursprünglichen (Bon)Drucker gedacht waren, aber so einfach mit ausgedruckt wurden und nicht gebraucht wurden. Naja, aber mit das Script konnte ich einfach um eine Zeile erweitern:

# 1. Zeile mit Unsinn loeschen
ex -s -c '1d|x' "$TOPRINT"

Diese Zeile habe ich vor der Zeile „printif“ eingefügt – die Datei wird (mit der Textbearbeitung ex) bearbeitet und damit die 1. Zeile in der Ausgangdatei gelöscht (funktioniert bei .txt oder vergleichbaren, bei ps/png wird es sicher nicht gehen). Auf diese Weise ließen sich auch Zeichen/Zeilen hinzufügen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.