Howto/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 14.04, Ubuntu 16.04, Ubuntu 18.04 und Ubuntu 18.10 erfolgreich getestet.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein einzelnes Paket installieren

  3. Ein Terminal öffnen

  4. Einen Editor öffnen

  5. Root-Rechte erlangen

  6. Starten von Programmen

  7. Dateien mergen

  8. Hintergrundwissen zu CUPS-PDF

Inhaltsverzeichnis
  1. Vorwort
  2. Installation bis Ubuntu 16.10
  3. Installation ab Ubuntu 17.04
    1. Anlegen der benötigten CUPS-Backends
    2. Anlegen der Konfigurationsdateien für je...
    3. Anlegen der benötigten PostProcessing-Sk...
    4. Skript für den Speicherdialog und E-Mail...
    5. Anpassung von AppArmor
    6. Hinzufügen der virtuellen Drucker
  4. Fazit
  5. Problembehebung
  6. Links

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.

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:

Paketliste zum Kopieren:

sudo apt-get install cups-pdf pdftk zenity yad thunderbird 

Oder mit apturl die Pakete 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:

Paketliste zum Kopieren:

sudo apt-get install printer-driver-cups-pdf pdftk zenity yad thunderbird 

Oder mit apturl die Pakete 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