
Manchmal möchte ich beim Arbeiten an meinem Laptop einige Dokumente in die Warteschlange stellen, um sie später auszudrucken, da ich zu diesem Zeitpunkt nicht mit einem Drucker verbunden bin.
Echte Druckerwarteschlangen sind dafür jedoch nicht ausgelegt. Sie versuchen sofort, das Dokument zu drucken, und beginnen plötzlich mit dem Drucken, sobald ich mit dem Netzwerk verbunden bin, was ich im Allgemeinen nicht tun möchte. Außerdem möchte ich manchmal die Reihenfolge der Dokumente in der Warteschlange ändern, was nicht sehr einfach ist, insbesondere wenn einige davon bereits mit dem Drucken begonnen haben.
Außerdem schlägt der Druckvorgang manchmal fehl, weil dem Drucker beispielsweise das Papier oder der Toner ausgeht und ich das Dokument auf einem anderen Drucker erneut ausdrucken möchte. Dies ist mit eg CUPS
oder nicht so einfach system-config-printer
; ich muss normalerweise zurückgehen, den PDF-Reader erneut öffnen und von vorne beginnen. Keiner der mir bekannten PDF-Reader ermöglicht es Ihnen, eine Liste der Dokumente zu speichern, die später gedruckt werden sollen, aber dies könnte eine versteckte Funktion eines PDF-Readers sein, von der ich nichts weiß.
Wie dem auch sei, ich möchte in der Lage sein, Folgendes zu tun:
- Geben Sie eine Liste der PDFs an, die ich drucken möchte.
- Bewahren Sie die Liste auf der Festplatte auf, damit ich die Anwendung schließen oder neu starten kann, ohne die gesamte Liste zu verlieren.
- Geben Sie den/die Drucker an, an die/den Sie die Nachrichten senden möchten, im Voraus an, ohne zu diesem Zeitpunkt tatsächlich mit diesen Druckern verbunden zu sein.
- Geben Sie Druckoptionen wie Farbe, Duplex und Anzahl der Kopien an.
- Ändern Sie diese Druckerzuweisungen und Druckoptionen später.
- Warten Sie, bis ich eine Taste drücke oder einen Befehl ausführe, um das/die Dokument(e) tatsächlich zu drucken.
- Führe eine separate Liste mit bereits ausgedruckten Dokumenten, falls der Ausdruck nicht funktioniert oder ich diese später noch einmal ausdrucken möchte.
lpr
Ich weiß, dass ich mit einem Shell-Skript und einer Pfadliste in einer Textdatei etwas zusammenhacken könnte , aber ich kann das Gefühl nicht loswerden, dass dieses Problem bereits auf eine robustere und elegantere Weise gelöst wurde.
Bonuspunkte:
- Verlangen Sie nicht, dass die Dokumente in einem PDF-Reader geöffnet werden. Ich möchte sie drucken, nicht durchsuchen, und es gibt keinen Grund, warum es sich dabei um dieselbe Anwendung handeln muss.
- Mehr als eine Liste.
- Funktioniert auch für Postscript, DjVu und andere Seitenbeschreibungsformate.
- Ziehen und Ablegen aus Dateimanagern.
Irgendwelche Vorschläge?
Antwort1
Ich mache Folgendes - es ist nicht so vielseitig, wie Sie es sich gewünscht haben, aber es funktioniert fast ganz gut. Sie müssen alle Ihre Drucker definiert haben und dann brauchen Sie diese beiden Skripte:
stop_printers
:#!/bin/bash -f # allp=(`cat /etc/printcap | tr "|" "\t" | cut -f 1 | grep -v "#"`) for i in ${allp[@]}; do echo -n Printer $i: cupsdisable "$i" echo " " paused. done
start_printers
:#!/bin/bash -f # allp=(`cat /etc/printcap | tr "|" "\t" | cut -f 1 | grep -v "#"`) for i in ${allp[@]}; do echo -n Printer $i: cupsenable "$i" echo " " restarted. done
Diese musst Du in Deinen Pfad einfügen (zum Beispiel ~/bin
) und mit ausführbar machen chmod +x
.VORBEHALT: Ich habe keine Drucker mit Leerzeichen im Namen. Die Skripte sind in diesem Fall nicht getestet (aber ich bin sicher, dass einer unserer Shell-Skript-Gurus die Skripte im Handumdrehen reparieren wird ;-)... )
Jetzt können Sie Folgendes ausgeben:
[romano:~] % stop_printers
Printer PDF: paused.
Printer ColorDEA: paused.
Printer Deskjet_6980: paused.
Printer fotocop5: paused.
Und Sie können von überall aus drucken, der Drucker wird angehalten:
Sie können Ihre Warteschlange sehen:
[romano:~] % lpq -PDeskjet_6980
Deskjet_6980 is not ready
Rank Owner Job File(s) Total Size
1st romano 439 Bones_3+RG.pdf — Flesh depth 125952 bytes
(Soweit ich weiß, bleiben die Druckwarteschlangen auch nach Neustarts bestehen.) Und wenn Sie drucken möchten:
[romano:~] % start_printers
Printer PDF: restarted.
Printer ColorDEA: restarted.
Printer Deskjet_6980: restarted.
Printer fotocop5: restarted.
Mithilfe von lprm
können Sie bei Bedarf einen Auftrag entfernen, lpr
ein Dokument über die Befehlszeile in die Warteschlange stellen und wenn Sie unterschiedliche „Listen“ wünschen, ist es nicht verboten, denselben Drucker mehrmals mit unterschiedlichen Namen zu definieren.
Sie können jeden Drucker auch manuell fortsetzen. Führen Sie dazu einfach cupsenable <printername>
die Eingabeaufforderung aus.
Meiner Meinung nach ist es mit dieser Lösung nicht möglich, die Druckoptionen nachträglich zu ändern. Hierzu müssen Sie das Dokument aus der Warteschlange nehmen und erneut einreihen.
Antwort2
Mein Paket (unverhohlene Werbung),duplexprmacht einiges von dem, was Sie wollen, und enthält Bash-Funktionen, die beim Erstellen Ihrer eigenen Version nützlich sein können. (Es ist in Bash codiert, daher sollte es relativ einfach zu ändern sein, und ich werde helfen, wenn ich kann.)
Es ist für die Emulation von Duplexdruck auf Nicht-Duplexdruckern konzipiert und implementiert eine eigene einfache Druckwarteschlangenverwaltung. Es verfügt sowohl über GUI- als auch CLI-Schnittstellen.
Die aktuelle Version druckt nur Duplex und funktioniert nur mit Nicht-Duplex-Druckern, aber es ist eine neue Version in Arbeit, die Drucker mit Duplex-Hardware handhaben kann, was im Wesentlichen nur Drucker- und Warteschlangenverwaltung ohne die Duplex-Emulationssoftware ist. (Ich habe eine Alpha-Version eines Skripts verfügbar, das bereits funktioniert, falls mich jemand direkt über das Projekt usw. kontaktieren möchte.)
Das System druckt auf dem aktuellen Standarddrucker, aber die Skripte „dplx“ und „duplex“ akzeptieren zusätzliche Argumente, die an „lp“ übergeben werden und zum Festlegen aller von „lp“ verstandenen Optionen wie Drucker und andere Eigenschaften verwendet werden können.
Das System verarbeitet derzeit PDF-, PostScript- und reine Textdateien.
Das Einzige, was esnichtSie können Dateien drucken, die mit der Option „In Datei drucken“ voninnerhalbAcroread. Diese Dateien funktionieren einfach nicht mit lp und ich konnte nie die Aufmerksamkeit eines der Upstream-Leute gewinnen, um herauszufinden, wo die Probleme liegen.
Persönlich drucke ich fast alles „offline“ (mithilfe der Option „In Datei drucken“, die die meisten Anwendungen unterstützen), selbst wenn mein(e) Drucker verfügbar sind. Das hilft mir, mich auf das zu konzentrieren, was ich tue. Später, wenn ich einen geeigneten Unterbrechungspunkt erreiche, drucke ich Stapel von Aufträgen.
Eine Druckwarteschlange ist auch sehr praktisch, wenn Sie eine weitere Kopie von etwas drucken möchten, ohne sie erneut erstellen zu müssen. Sie ist auch wichtig für die Behebung von Druckerfehlern wie Papierstaus oder Tonermangel.
Antwort3
Es scheint keine vollständige Lösung für dieses Problem zu geben, aber hier ist eine Funktion, die ich zu meinem hinzugefügt habe und .bashrc
die ähnlich ist wieRmanos Antwortoben, mit dem zusätzlichen Komfort der Autovervollständigung.
all-printers() {
if [ "$*" = "" ]
then
# Print usage."
printf "Usage:\n"
printf "all-printers start\n"
printf "all-printers stop\n"
return 1
elif ! [ "$1" = "stop" -o "$1" = "start" ]
then
printf "Unrecognized command: $1\n"
return 1
fi
cut -f 1 -d '|' /etc/printcap |
grep -v '^#' |
while read printer_name
do
if [ "$1" = "stop" ]
then
cupsdisable "$printer_name"
printf "$printer_name stopped.\n"
elif [ "$1" = "start" ]
then
cupsenable "$printer_name"
printf "$printer_name started.\n"
fi
done
}
complete -W 'stop start' all-printers