Verwenden eines Shell-Skripts als virtueller Drucker

Verwenden eines Shell-Skripts als virtueller Drucker

Ich habe ein Shell-Skript, das eine PDF-Datei als Argument verwendet und diese mit zusätzlichen druckerspezifischen Optionen druckt. Wie kann ich dieses Skript als virtuellen Drucker hinzufügen, der über die GUI ausgewählt werden kann?

Das Shell-Skript ist ein manuelles Duplex-Skript, das eine PDF-Datei verwendet, die geraden Seiten druckt, mithilfe von Zenity eine Benutzeraufforderung zum Umblättern der Seiten ausgibt und anschließend die ungeraden Seiten druckt.

Mein aktueller Arbeitsablauf ist:

  1. Datei -> Drucken -> In Datei speichern -> tmp.pdf
  2. my_duplex_script tmp.pdf
  3. rm tmp.pdf

Gibt es eine Möglichkeit, es so zu machen:

  1. Datei -> Drucken -> mein_Skript_als_virtueller_Drucker

Hinweis: Dies ist auf Linux Mint 13 Cinnamon. Ich habe es versucht gnome-manual-duplex, aber es funktioniert bei mir nicht.


Der GUI-Dialog, aus dem ich in eine PDF-Datei drucken kann Standard-GTK-Druckdialog

my_duplex_script

#!/bin/bash

lp_args=
while getopts o: opt
do
    case "$opt" in
        o)  lp_args="$lp_args -o $OPTARG" ;;
        \?) echo >&2 Invalid argument; exit 1 ;;
    esac
done
shift `expr $OPTIND - 1`

file=$1
page_count=$(pdfinfo "$file" | grep Pages | awk '{print $2}')
is_odd=`expr $page_count % 2`

if [ $is_odd -eq 1 ]
then
    #outputting blank
    echo | lp -s -t "$file"-blank
fi

#printing even reversed
lp -s -o page-set=even -o outputorder=reverse $lp_args -t "$file"-even "$file"

if zenity --question --text="Flip and reinsert the entire stack when printing has finished." --ok-label="Proceed" --cancel-label="Cancel"
then
    #printing odd reversed
    lp -s -o page-set=odd -o outputorder=reverse $lp_args -t "$file"-odd "$file"
else
    echo >&2 User abort
    exit 1
fi

exit 0

Antwort1

Ich habe das noch nie ausprobiert, aber es gibt ein Tool namenstea4cupsdas klingt, als könnten Sie einen Prehook in Ihr Skript implementieren, der den Druckvorgang übernimmt. Sie könnten diesen Druckvorgang dann abbrechen und nicht über CUPS an einen echten Drucker senden, sodass Ihr Skript den Druckvorgang übernimmt.

Auszug

Die Möglichkeiten sind endlos :

  • Senden Sie denselben Auftrag gleichzeitig an mehrere Drucker, was mit CUPS nicht möglich ist.
  • Automatisieren Sie die PDF-Archivierung aller Druckaufträge.
  • Doppelte Druckaufträge verbieten (ein einfaches Beispiel finden Sie in der Beispielkonfigurationsdatei)
  • Erstellen Sie in 15 Minuten eine Druckabrechnungslösung (JA, DAS IST ERNST)
  • usw...

Tea4cups bietet die folgenden Annehmlichkeiten:

Tea4CUPS bietet drei Möglichkeiten zum Starten von Befehlen:

  • Filter: Ein Filter kann die Eingabedaten ändern, bevor sie an den Drucker gesendet oder den unten definierten Pre- und Post-Hooks zur Verfügung gestellt werden. Derzeit kann pro Druckwarteschlange ein einzelner Filter definiert werden.
  • Prehooks: Diese werden garantiert gestartet, bevor der Druckauftrag an den eigentlichen Drucker gesendet wird. Jeder Prehook, der mit -1 endet, kann den Druckauftrag abbrechen. Für eine bestimmte Druckwarteschlange können beliebig viele Prehooks definiert werden.
  • Posthooks: Diese werden garantiert gestartet, nachdem der Druckauftrag an den echten Drucker gesendet wurde, es sei denn, der Auftrag wurde zuvor durch einen Prehook abgebrochen. Für eine bestimmte Druckwarteschlange können beliebig viele Posthooks definiert werden.

Antwort2

Wie kann ich dieses Skript als virtuellen Drucker hinzufügen, der über die GUI ausgewählt werden kann?

Um einen virtuellen Drucker hinzuzufügen, bearbeiten Sie einfach Ihre /etc/printcap. Das ist nicht ganz einfach, da die Syntax von DRUCKKAPPEgewöhnungsbedürftig.

Ein Beispiel dafür finden Sie hierPDF Service mit Samba:

# /etc/printcap
# PDF Service entry

lp|pdf|PDF Printer:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/pdf:\
        :af=/var/spool/lpd/pdf/acct:\
        :mx#0:sh:\
        :if=/usr/bin/smbprint:

Hier /usr/bin/smbprintwird das Skript als Druckfilter verwendet. Der Drucker selbst ist /dev/null.

Möglicherweise müssen Sie installieren cups-bsd, aber das ist oft die Standardkonfiguration.

Antwort3

Ich kam zu spät zur Party, wollte aber dasselbe tun und habe keine andere Lösung gefunden.

Ich werde hier schreiben, wie ich es gelöst habe, vielleicht finden andere die Lösung nützlich.

  • einen Filter für CUPS erstellt, um die zu druckende Datei zu erfassen
  • ein Backend zum Drucken der Datei erstellt
  • hat ein schönes und einfaches Installationsprogramm erstellt.

Der Quellcode ist auf GitHub: https://github.com/dentys03/manual_duplex_linux

Es sollte auf jedem HP-Drucker funktionieren. Ich schätze, es lässt sich leicht für andere Drucker anpassen.

verwandte Informationen