CUPS-PDF mit Wasserzeichen und E-Mailversand via Thunderbird
Achtung!
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.
Artikel für fortgeschrittene Anwender
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Hinweis:
Diese Howto-Anleitung wurde zuletzt von Manuel@eteddy am 19.01.2019 mit Ubuntu 16.04 und Ubuntu 18.04 erfolgreich getestet.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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:
cups-pdf
pdftk
zenity
yad
thunderbird
Befehl zum Installieren der Pakete:
sudo apt-get install cups-pdf pdftk zenity yad thunderbird
Oder mit apturl installieren, Link: apt://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:
printer-driver-cups-pdf
pdftk
zenity
yad
thunderbird
Befehl zum Installieren der Pakete:
sudo apt-get install printer-driver-cups-pdf pdftk zenity yad thunderbird
Oder mit apturl installieren, Link: apt://printer-driver-cups-pdf,pdftk,zenity,yad,thunderbird
Die folgende Tabelle liefert eine übersicht wozu die Pakete benötigt werden:
Ü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
apt-get source cups-pdf
bzw. ab Ubuntu 17.04 mit
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
cd cups-pdf-*/src
In dem Verzeichnis öffnet man die Datei cups-pdf.h mit einem Texteditor seiner Wahl
vi cups-pdf.h
und ändern die Zeile für die Konfigurationsdatei unseres neuen Backends von
1 | #define CPCONFIG "/etc/cups/cups-pdf.conf"
|
in z.B.
1 | #define CPCONFIG "/etc/cups/cups-pdf-md1.conf"
|
ab. Nun können wir das neue Backend mit
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
sudo cp cups-pdf-md* /usr/lib/cups/backend
nach /usr/lib/cups/backend und der Anpassung der Rechte mit
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
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
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:
1 2 3 4 5 6 7 8 9 | ### 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: <empty> 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:
Ü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:
1 2 | #!/bin/bash /etc/cups/PDF2Mail.sh "$1" "$2" "$3" |
Erzeugen der Datei /etc/cups/cups-pdf-md1.sh mit folgendem Inhalt:
1 2 | #!/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:
1 2 | #!/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:
1 2 | #!/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:
1 2 | #!/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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | #!/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:
sudo vi /etc/apparmor.d/usr.sbin.cupsd
Die angepassten Stellen wurden mit # Modifikation MD markiert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 | # vim:syntax=apparmor # Last Modified: Thu Aug 2 12:54:46 2007 # Author: Martin Pitt <martin.pitt@ubuntu.com> #include <tunables/global> /usr/sbin/cupsd flags=(attach_disconnected) { #include <abstractions/base> #include <abstractions/bash> #include <abstractions/authentication> #include <abstractions/dbus> #include <abstractions/fonts> #include <abstractions/nameservice> #include <abstractions/perl> #include <abstractions/user-tmp> 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 <local/usr.sbin.cupsd> } # separate profile since this needs to write into /home /usr/lib/cups/backend/cups-pdf { #include <abstractions/base> #include <abstractions/fonts> #include <abstractions/nameservice> #include <abstractions/user-tmp> 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 <abstractions/base> #include <abstractions/fonts> #include <abstractions/nameservice> #include <abstractions/user-tmp> 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 <abstractions/base> #include <abstractions/fonts> #include <abstractions/nameservice> #include <abstractions/user-tmp> 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 <abstractions/base> #include <abstractions/fonts> #include <abstractions/nameservice> #include <abstractions/user-tmp> 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 <abstractions/base> #include <abstractions/fonts> #include <abstractions/nameservice> #include <abstractions/user-tmp> 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
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 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¶
Druckwerkzeuge Programmübersicht
Drucker Übersicht zum Thema