{{{#!vorlage Warnung Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos. }}} [[Vorlage(Fortgeschritten)]] {{{#!vorlage Hinweis Diese Howto-Anleitung wurde zuletzt von [user:Manuel@eteddy:] am 19.01.2019 mit '''Ubuntu 16.04''' und '''Ubuntu 18.04''' erfolgreich getestet. }}} {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Paketinstallation_DEB: Ein einzelnes Paket installieren] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:sudo: Root-Rechte erlangen] [:Programme_starten: Starten von Programmen] [:Meld: Dateien mergen] [:CUPS-PDF: Hintergrundwissen zu CUPS-PDF] }}} [[Inhaltsverzeichnis(2)]] = Vorwort = In diesem Artikel wird beschrieben wie man mittels CUPS-PDF verschiedene virtuelle PDF-Drucker einrichtet. Diese können im Anschluss dazu genutzt werden, verschiedenste Sachen zu automatisieren, wie z.B. * Dateiauswahldialog um den Namen der PDF festzulegen * Hinterlegen von verschiedenen Wasserzeichen (Briefbögen) * Anschließender Versand per E-Mail In dem Artikel wird davon ausgegangen, dass man [:CUPS-PDF:] durchgearbeitet und verstanden hat. = Installation bis Ubuntu 16.10 = Die folgenden Pakete müssen (je nach dem welche Features man benötigt) installiert [1] werden: {{{#!vorlage Paketinstallation cups-pdf pdftk zenity yad thunderbird }}} = Installation ab Ubuntu 17.04 = Die folgenden Pakete müssen (je nach dem welche Features man benötigt) installiert [1] werden: {{{#!vorlage Paketinstallation printer-driver-cups-pdf pdftk zenity yad thunderbird }}} Die folgende Tabelle liefert eine übersicht wozu die Pakete benötigt werden: {{{#!vorlage Tabelle Übersicht der installierten Pakete +++ Paket Beschreibung +++ cups-pdf bzw. printer-driver-cups-pdf virtueller Druckertreiber zum Erzeugen von PDF-Dateien +++ pdftk Werkzeug für die Manipulation von PDF-Dokumenten +++ zenity Zeigt graphische Dialogfelder von Shell-Skripten aus an +++ yad Zeigt graphische Dialogfelder von Shell-Skripten aus an (Weiterentwicklung von zenity) +++ thunderbird E-Mail-, RSS- und Newsgroup-Client mit integriertem Spamfilter }}} == Anlegen der benötigten CUPS-Backends == Zum Anlegen weiterer CUPS-Backends werden die Quellen von CUPS-PDF benötigt, welche mit {{{#!vorlage Befehl apt-get source cups-pdf }}} bzw. ab Ubuntu 17.04 mit {{{#!vorlage Befehl apt-get source printer-driver-cups-pdf }}} installiert werden können. Als nächstes wechseln wir in das src Verzeichnis der soeben heruntergeladenen Sourcen mit {{{#!vorlage Befehl cd cups-pdf-*/src }}} In dem Verzeichnis öffnet man die Datei cups-pdf.h mit einem Texteditor seiner Wahl {{{#!vorlage Befehl vi cups-pdf.h }}} und ändern die Zeile für die Konfigurationsdatei unseres neuen Backends von {{{#!code c #define CPCONFIG "/etc/cups/cups-pdf.conf" }}} in z.B. {{{#!code c #define CPCONFIG "/etc/cups/cups-pdf-md1.conf" }}} ab. Nun können wir das neue Backend mit {{{#!vorlage Befehl gcc -O9 -s -o cups-pdf-md1 cups-pdf.c }}} kompilieren. Je nachdem wieviele weitere Backends man benötigt, müssen diese Schritte mit anderen Namen wiederholt werden. In dem Beispiel wurden 4 weitere Backends (cups-pdf-md1 bis cups-pdf-md4) angelegt. Die erzeugten Backends stehen nach dem Kopieren mit {{{#!vorlage Befehl sudo cp cups-pdf-md* /usr/lib/cups/backend }}} nach /usr/lib/cups/backend und der Anpassung der Rechte mit {{{#!vorlage Befehl sudo chown root.root /usr/lib/cups/backend/cups-pdf-md* sudo chmod 700 /usr/lib/cups/backend/cups-pdf-md* }}} nun zur Verfügung. == Anlegen der Konfigurationsdateien für jedes Backend == Nun kann man die bereits existierende Original-Konfigurationsdatei für cups-pdf für die anderen Backends duplizieren {{{#!vorlage Befehl sudo cp /etc/cups-pdf.conf /etc/cups-pdf-md1.conf sudo cp /etc/cups-pdf.conf /etc/cups-pdf-md2.conf sudo cp /etc/cups-pdf.conf /etc/cups-pdf-md3.conf sudo cp /etc/cups-pdf.conf /etc/cups-pdf-md4.conf }}} Im nächsten Schritt werden für die verschiedenen Backends unterschiedliche Postprocessor-Direktiven konfiguriert. Dazu öffnet man die jeweilige Konfigurationsdatei mit einem Textedit seiner Wahl {{{#!vorlage Befehl sudo vi /etc/cups-pdf-md1.conf sudo vi /etc/cups-pdf-md2.conf sudo vi /etc/cups-pdf-md3.conf sudo vi /etc/cups-pdf-md4.conf }}} und fügt die Zeile für das PostProcessing-Skript ein: {{{#!code bash ### Key: PostProcessing ## postprocessing script that will be called after the creation of the PDF ## as arguments the filename of the PDF, the username as determined by ## CUPS-PDF and the one as given to CUPS-PDF will be passed ## the script will be called with user privileges ## set this to an empty value to use no postprocessing ### Default: PostProcessing /etc/cups/cups-pdf-md1.sh }}} Da wir in den Backends später unterschiedliche Wasserzeichen hinterlegen wollen, weisen wir über diesen Weg jedem Backend ein anderes PostProcessing-Skript zu. Die folgende Tabelle zeigt die Abhängigkeiten nochmals in der Übersicht: {{{#!vorlage Tabelle Übersicht der Abhängigkeiten +++ Backend Konfigurationsdatei Post-Processing-Skript wasserzeichen +++ cups-pdf-md1 /etc/cups/cups-pdf-md1.conf /etc/cups/cups-pdf-md1.sh /etc/cups/cups-pdf-md1.pdf +++ cups-pdf-md2 /etc/cups/cups-pdf-md2.conf /etc/cups/cups-pdf-md2.sh /etc/cups/cups-pdf-md2.pdf +++ cups-pdf-md3 /etc/cups/cups-pdf-md3.conf /etc/cups/cups-pdf-md3.sh /etc/cups/cups-pdf-md3.pdf +++ cups-pdf-md4 /etc/cups/cups-pdf-md4.conf /etc/cups/cups-pdf-md4.sh /etc/cups/cups-pdf-md4.pdf }}} Wie der Tabelle zu entnehmen ist, muss man die PDF-Dateien für das Wasserzeichen unter /etc/cups ablegen. == Anlegen der benötigten PostProcessing-Skripte == Im nächsten Schritt erzeugen wir nun die einzelnen Post-Processing-Skripts für unsere verschiedenen Backends. Erzeugen der Datei /etc/cups/cups-pdf.sh mit folgendem Inhalt: {{{#!code bash #!/bin/bash /etc/cups/PDF2Mail.sh "$1" "$2" "$3" }}} Erzeugen der Datei /etc/cups/cups-pdf-md1.sh mit folgendem Inhalt: {{{#!code bash #!/bin/bash /etc/cups/PDF2Mail.sh "$1" "$2" "$3" "/etc/cups/cups-pdf-md1.pdf" }}} Erzeugen der Datei /etc/cups/cups-pdf-md2.sh mit folgendem Inhalt: {{{#!code bash #!/bin/bash /etc/cups/PDF2Mail.sh "$1" "$2" "$3" "/etc/cups/cups-pdf-md2.pdf" }}} Erzeugen der Datei /etc/cups/cups-pdf-md3.sh mit folgendem Inhalt: {{{#!code bash #!/bin/bash /etc/cups/PDF2Mail.sh "$1" "$2" "$3" "/etc/cups/cups-pdf-md3.pdf" }}} Erzeugen der Datei /etc/cups/cups-pdf-md4.sh mit folgendem Inhalt: {{{#!code bash #!/bin/bash /etc/cups/PDF2Mail.sh "$1" "$2" "$3" "/etc/cups/cups-pdf-md4.pdf" }}} In dem Beispiel, ist auch bei der Standard-PDF Ausgabe ein Versand per E-Mail möglich, ohne jedoch ein Wasserzeichen zu hinterlegen. Dafür wurde die Post-Processing Direktive in der cups-pdf.conf auf /etc/cups/cups-pdf.sh gesetzt. == Skript für den Speicherdialog und E-Mail-Versand == Um nach der Erstellung der PDF-Datei mit CUPS-PDF, die PDF mit einem Wasserzeichen hinterlegen und versenden zu können, kann man z.B. folgendes Skript in der Datei /etc/cups/PDF2Mail.sh ablegen: {{{#!code bash #!/bin/bash # # PDF2Mail.sh # # This script is a CUPS postprocessor. It adds a watermark # if necessary, renames the file and offers the possibility # for sending the file by e-mail. # # @author.: Manuel Dräger # @datei..: 20.03.2016 # @version: 0.1 # @usage..: with postprocessor directive in /etc/cups-pdf.conf export file="$1" export USER="$2" export wmfile="$4" export date=`date +%Y.%m.%d` export time=`date +%H.%M.%S` export hostname=`hostname` export dirname=`dirname $file` export filename=`basename $file` export newfile="$date - $time - $hostname - $filename" export nfile="$dirname/$newfile" export self=`basename $0` export DISPLAY=:0.0 export HOME=/home/$USER export XAUTHORITY=$HOME/.Xauthority # thunderbird needs a D-BUS session, if thunderbird is not running if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then eval `dbus-launch --sh-syntax` fi # show dialog to save the file nfile=`zenity --file-selection --save --confirm-overwrite --filename="$nfile"` if [ $? -eq 0 ]; then # add watermarks and delete the original file if [ $wmfile -eq "" ]; then mv "$file" "$nfile" else pdftk "$file" background "$wmfile" output "$nfile" && rm "$file" fi # show dialog for sending the file by e-mail if zenity --question --text "Willst Du die PDF per E-Mail mit Thunderbird versenden?"; then # escape the "," export pseudouri="file://"`echo $nfile | sed 's/,/%2C/g'` export subject=`basename "$nfile" | sed 's/,/%2C/g'` # send file via thunderbird thunderbird -compose "subject=$subject,attachment='$pseudouri'" fi fi }}} In dem Skript wird zur Interaktion mit dem Anwender zenity verwendet. Wem es vom Layout her besser gefällt, der kann auch zenity durch yad ersetzen. == Anpassung von AppArmor == Da CUPS von AppArmor überwacht wird, ist es nun noch nötig die neuen Backends AppArmor bekanntzugeben und die Ausführung der PostProcessing-Skripts zu erlauben. Hierzu editiert man die zuständige Konfigurations-Datei mit einem Texteditor seiner Wahl: {{{#!vorlage Befehl sudo vi /etc/apparmor.d/usr.sbin.cupsd }}} Die angepassten Stellen wurden mit # Modifikation MD markiert: {{{#!code bash # vim:syntax=apparmor # Last Modified: Thu Aug 2 12:54:46 2007 # Author: Martin Pitt #include /usr/sbin/cupsd flags=(attach_disconnected) { #include #include #include #include #include #include #include #include capability chown, capability fowner, capability fsetid, capability kill, capability net_bind_service, capability setgid, capability setuid, capability audit_write, deny capability block_suspend, # nasty, but we limit file access pretty tightly, and cups chowns a # lot of files to 'lp' which it cannot read/write afterwards any # more capability dac_override, # the bluetooth backend needs this network bluetooth, # the dnssd backend uses those network x25 seqpacket, network ax25 dgram, network netrom seqpacket, network rose dgram, network ipx dgram, network appletalk dgram, network econet dgram, network ash dgram, /bin/bash ixr, /bin/dash ixr, /bin/hostname ixr, /dev/lp* rw, deny /dev/tty rw, # silence noise /dev/ttyS* rw, /dev/ttyUSB* rw, /dev/usb/lp* rw, /dev/bus/usb/ r, /dev/bus/usb/** rw, /dev/parport* rw, /etc/cups/ rw, /etc/cups/** rw, /etc/cups/interfaces/* ixrw, /etc/foomatic/* r, /etc/gai.conf r, /etc/papersize r, /etc/pnm2ppa.conf r, /etc/printcap rwl, /etc/ssl/** r, @{PROC}/net/ r, @{PROC}/net/* r, @{PROC}/sys/dev/parport/** r, @{PROC}/*/net/ r, @{PROC}/*/net/** r, @{PROC}/*/auxv r, @{PROC}/sys/crypto/** r, /sys/** r, /usr/bin/* ixr, /usr/sbin/* ixr, /bin/* ixr, /sbin/* ixr, /usr/lib/** rm, # backends which come with CUPS can be confined /usr/lib/cups/backend/bluetooth ixr, /usr/lib/cups/backend/dnssd ixr, /usr/lib/cups/backend/http ixr, /usr/lib/cups/backend/ipp ixr, /usr/lib/cups/backend/lpd ixr, /usr/lib/cups/backend/parallel ixr, /usr/lib/cups/backend/serial ixr, /usr/lib/cups/backend/snmp ixr, /usr/lib/cups/backend/socket ixr, /usr/lib/cups/backend/usb ixr, # we treat cups-pdf specially, since it needs to write into /home # and thus needs extra paranoia /usr/lib/cups/backend/cups-pdf Px, /usr/lib/cups/backend/cups-pdf-md1 Px, # Modifikation MD /usr/lib/cups/backend/cups-pdf-md2 Px, # Modifikation MD /usr/lib/cups/backend/cups-pdf-md3 Px, # Modifikation MD /usr/lib/cups/backend/cups-pdf-md4 Px, # Modifikation MD # third party backends get no restrictions as they often need high # privileges and this is beyond our control /usr/lib/cups/backend/* Cx -> third_party, /usr/lib/cups/cgi-bin/* ixr, /usr/lib/cups/daemon/* ixr, /usr/lib/cups/monitor/* ixr, /usr/lib/cups/notifier/* ixr, # filters and drivers (PPD generators) are always run as non-root, # and there are a lot of third-party drivers which we cannot predict /usr/lib/cups/filter/** Cxr -> third_party, /usr/lib/cups/driver/* Cxr -> third_party, /usr/local/** rm, /usr/local/lib/cups/** rix, /usr/share/** r, /{,var/}run/** rm, /{,var/}run/avahi-daemon/socket rw, deny /{,var/}run/samba/ rw, /{,var/}run/samba/** rw, /var/cache/samba/*.tdb r, /var/{cache,lib}/samba/printing/printers.tdb r, /{,var/}run/cups/ rw, /{,var/}run/cups/** rw, /var/cache/cups/ rw, /var/cache/cups/** rwk, /var/log/cups/ rw, /var/log/cups/* rw, /var/spool/cups/ rw, /var/spool/cups/** rw, # third-party printer drivers; no known structure here /opt/** rix, # FIXME: no policy ATM for hplip and Brother drivers /usr/bin/hpijs Cx -> third_party, /usr/Brother/** Cx -> third_party, # Kerberos authentication /etc/krb5.conf r, deny /etc/krb5.conf w, /etc/krb5.keytab rk, /etc/cups/krb5.keytab rwk, /tmp/krb5cc* k, # likewise authentication /etc/likewise r, /etc/likewise/* r, # silence noise deny /etc/udev/udev.conf r, signal peer=/usr/sbin/cupsd//third_party, unix peer=(label=/usr/sbin/cupsd//third_party), profile third_party flags=(attach_disconnected) { # third party backends, filters, and drivers get relatively no restrictions # as they often need high privileges, are unpredictable or otherwise beyond # our control file, capability, audit deny capability mac_admin, network, dbus, signal, ptrace, unix, } # Site-specific additions and overrides. See local/README for details. #include } # separate profile since this needs to write into /home /usr/lib/cups/backend/cups-pdf { #include #include #include #include capability chown, capability fowner, capability fsetid, capability setgid, capability setuid, # unfortunate, but required for when $HOME is 700 capability dac_override, capability dac_read_search, @{PROC}/*/auxv r, /bin/dash ixr, /bin/bash ixr, /bin/cp ixr, /etc/papersize r, /etc/cups/cups-pdf.conf r, @{HOME}/PDF/ rw, @{HOME}/PDF/* rw, /usr/bin/gs ixr, /usr/lib/cups/backend/cups-pdf mr, /usr/lib/ghostscript/** mr, /usr/share/** r, /var/log/cups/cups-pdf_log w, /var/spool/cups/** r, /var/spool/cups-pdf/** rw, /etc/cups/cups-pdf.sh uxr, # Modifikation MD } /usr/lib/cups/backend/cups-pdf-md1 { #include #include #include #include capability chown, capability fowner, capability fsetid, capability setgid, capability setuid, # unfortunate, but required for when $HOME is 700 capability dac_override, capability dac_read_search, @{PROC}/*/auxv r, /bin/dash ixr, /bin/bash ixr, /bin/cp ixr, /etc/papersize r, /etc/cups/cups-pdf-md1.conf r, # Modifikation MD @{HOME}/PDF/ rw, @{HOME}/PDF/* rw, /usr/bin/gs ixr, /usr/lib/cups/backend/cups-pdf mr, /usr/lib/ghostscript/** mr, /usr/share/** r, /var/log/cups/cups-pdf_log w, /var/spool/cups/** r, /var/spool/cups-pdf/** rw, /etc/cups/cups-pdf-md1.sh uxr, # Modifikation MD } /usr/lib/cups/backend/cups-pdf-md2 { #include #include #include #include capability chown, capability fowner, capability fsetid, capability setgid, capability setuid, # unfortunate, but required for when $HOME is 700 capability dac_override, capability dac_read_search, @{PROC}/*/auxv r, /bin/dash ixr, /bin/bash ixr, /bin/cp ixr, /etc/papersize r, /etc/cups/cups-pdf-md2.conf r, # Modifikation MD @{HOME}/PDF/ rw, @{HOME}/PDF/* rw, /usr/bin/gs ixr, /usr/lib/cups/backend/cups-pdf mr, /usr/lib/ghostscript/** mr, /usr/share/** r, /var/log/cups/cups-pdf_log w, /var/spool/cups/** r, /var/spool/cups-pdf/** rw, /etc/cups/cups-pdf-md2.sh uxr, # Modifikation MD } /usr/lib/cups/backend/cups-pdf-md3 { #include #include #include #include capability chown, capability fowner, capability fsetid, capability setgid, capability setuid, # unfortunate, but required for when $HOME is 700 capability dac_override, capability dac_read_search, @{PROC}/*/auxv r, /bin/dash ixr, /bin/bash ixr, /bin/cp ixr, /etc/papersize r, /etc/cups/cups-pdf-md3.conf r, # Modifikation MD @{HOME}/PDF/ rw, @{HOME}/PDF/* rw, /usr/bin/gs ixr, /usr/lib/cups/backend/cups-pdf mr, /usr/lib/ghostscript/** mr, /usr/share/** r, /var/log/cups/cups-pdf_log w, /var/spool/cups/** r, /var/spool/cups-pdf/** rw, /etc/cups/cups-pdf-md3.sh uxr, # Modifikation MD } /usr/lib/cups/backend/cups-pdf-md4 { #include #include #include #include capability chown, capability fowner, capability fsetid, capability setgid, capability setuid, # unfortunate, but required for when $HOME is 700 capability dac_override, capability dac_read_search, @{PROC}/*/auxv r, /bin/dash ixr, /bin/bash ixr, /bin/cp ixr, /etc/papersize r, /etc/cups/cups-pdf-md4.conf r, # Modifikation MD @{HOME}/PDF/ rw, @{HOME}/PDF/* rw, /usr/bin/gs ixr, /usr/lib/cups/backend/cups-pdf mr, /usr/lib/ghostscript/** mr, /usr/share/** r, /var/log/cups/cups-pdf_log w, /var/spool/cups/** r, /var/spool/cups-pdf/** rw, /etc/cups/cups-pdf-md4.sh uxr, # Modifikation MD } }}} Zum Abschluss der Arbeiten muss man nun nur noch Cups und AppArmor neu starten {{{#!vorlage Befehl sudo service apparmor restart sudo service cups restart }}} == Hinzufügen der virtuellen Drucker == Im folgenden kann man nun die virtuellen Drucker über die Druckerverwaltung mit hinzufügen. Als Geräteadresse kann man nun eines unserer Backends verwenden: {{{ cups-pdf:/ cups-pdf-md1:/ cups-pdf-md2:/ cups-pdf-md3:/ cups-pdf-md4:/ }}} = Fazit = Dies ist eine alternative Lösung zu dem Windows Programm FreePDF XP unter Linux. = Problembehebung = * Bei der Entwicklung des Skripts /etc/cups/PDF2Mail.sh fiel auf, dass Thunderbird ohne sinnvolle Werte in den folgenden Umgebungsvariablen nicht startet bzw. mit Fehlermeldungen startet. {{{ DISPLAY XAUTHORITY HOME DBUS_SESSION_BUS_ADDRESS }}} Dies hat auch schon jemand auf [uf_thread:1275505:ubuntuforums.org] vor mir im Jahr 2009 festgestellt. Durch die Erzeugung der D-BUS Session sollte das dort geschilderte Problem behoben sein. * Außerdem mag Thunderbird keine Kommata in Dateinamen die angehangen werden sollen. Ein urlencode des Pfades zur Datei in eine URI mochte Thunderbird auch nicht. Daher wurden lediglich die Kommata (",") durch "%2C" ersetzt. = Links = ## (nicht mehr verfügbar, 19.07.2018, Beforge) * [http://burns.cs.uni-potsdam.de/~mdraeger/cups-pdf/cups-pdf.tar.bz2 CUPS-Modifikationen dieses Artikel als tar.bz2] * [youtube:RLfftoYIdT0:Video zum Einrichten der virtuellen Drucker] {de} * [:CUPS-PDF:] * [:Druckwerkzeuge:] {Übersicht} Programmübersicht * [:Drucker:] {Übersicht} Übersicht zum Thema #tag: Howto