Eine Handvoll Dateien per Mail abschicken und kurz darauf alles als PDF-Dokumente zurückbekommen: Dieser Anwendertraum lässt sich mit Open oder Libre Office, Postfix und ein wenig Scripting verwirklichen.
Programme, die aus allerhand Formaten PDF-Dokumente erzeugen, gibt es unter Linux viele. Was aber, wenn die Mitarbeiter eine PDF-Konvertierung mehrerer Dokumente gleichzeitig, einfach und schnell, innerhalb der grafischen Benutzerumgebung und ohne viel Tipparbeit benötigen?
Erste Recherchen fördern zwar etliche Lösungen zu Tage, aber für mehrere gleichzeitig zu konvertierende Dateien sind stets sehr viele Benutzereingaben notwendig. Auch bei virtuellen PDF-Druckertreibern ist der Arbeitsablauf mit vielen Dateien zu langsam.
So entstand für ein Berliner Büro die Idee, einen Mailserver und Open/Libre Office in einer hausgemachten Lösung zu verbinden: Der Anwender schickt die zu konvertierenden Dateien als Mailattachments an den Server (Abbildung 1) und erhält das Resultat per E-Mail zurück (Abbildung 2).

Abbildung 1: Bedienungskomfort: Der Anwender packt die Dateien, die er konvertieren möchte, einfach als Anhänge in eine E-Mail.

Abbildung 2: Bereits nach kurzer Zeit landen die gewünschten PDF-Dokumente gesammelt im Posteingang des Absenders.
Praktischer Ablauf
Zur Annahme der Konvertierungsaufträge kommt eine eigene Mailadresse, beispielsweise »pdf@domain.tld« , zum Einsatz. Auf dem Konvertierungsserver verrichtet Postfix seinen Dienst. Die folgende Zeile in »/etc/aliases« veranlasst den freien Mailserver dazu, die Nachricht zur Weiterverarbeitung an das Konvertierungsskript weiterzugeben – der Aufruf »postalias /etc/aliases« übersetzt die Konfiguration für Postfix:
pdf: "|/usr/local/bin/pdf-konverter.sh"
Das Skript »pdf-konverter.sh« packt zunächst die Datei-Anhänge aus. Danach gibt es diese Dateien an Unoconv weiter [1], ein Hilfsprogramm zur Kommunikation mit Open und Libre Office. Die freie Bürosuite erledigt die Umwandlung, dann verpackt das Skript die Dateien wieder in Anhänge und schickt sie per Mail an den Absender zurück.
Die maximale Größe einer E-Mail gibt der Parameter »message_size_limit« in der Postfix-Konfiguration vor (Listing 1). Da Office als Daemon läuft, geht die Konvertierung angenehm schnell: Wie die beiden Abbildungen zeigen, benötigte im Test eine rund 20 MByte große E-Mail mit 19 Datei-Anhängen rund eine Minute zum Konvertieren und Zurücksenden – dabei ging diese Testmail auf dem Hin- und Rückweg zusätzlich noch durch einen Virenscanner.
Listing 1
/etc/postfix/main.cf
01 myhostname = pdfserver.[UCC:x00-fake-italic]domain.tld 02 mydomain = [UCC:x00-fake-italic]domain.tld 03 mydestination = $mydomain 04 myorigin = $mydomain 05 alias_maps = hash:/etc/aliases 06 alias_database = hash:/etc/aliases 07 # eventuell Smarthost 08 # relayhost = [UCC:x00-fake-italic]mail.domain.tld 09 mynetworks = 127.0.0.0/8 10 message_size_limit = 51200000
Systemvoraussetzungen
Für die Umsetzung im Berliner Büro kam Debian Squeeze in der 64-Bit-Ausgabe zur Verwendung. Da die Lösung ausschließlich Open-Source-Komponenten nutzt, sollte sie auch auf anderen Distributionen funktionieren.
Neben Postfix als Mailserver sind Programme zum Aus- und Einpacken der Attachments erforderlich. Zum Extrahieren kommt Ripmime zum Einsatz, das MIME-kodierte Anhänge aus einer E-Mail liest und als einzelne Dateien in einem ausgewählten Ordner ablegt. Ein alternatives Werkzeug für diesen Zweck ist Uudeview [2], es macht seine Arbeit allerdings etwas langsamer. Ripmime steht gegenwärtig nur im Quelltext unter [3] zur Verfügung, der sich aber mit »make && make install« übersetzen lässt. Das Kommando
chown nobody:nogroup /usr/local/bin/ripmime
versieht die Binärdatei mit den passenden Berechtigungen.
Das Paket »mime-construct« ist in den Debian-Repositories enthalten. Es packt die umgewandelten Dateien in die Antwort-Mail. Das Programm macht es leicht, eine Nachricht mit vielen Datei-Anhängen zu versenden, und kennt obendrein nützliche Parameter, die sich einfach übergeben lassen.
Für den Serverbetrieb von Open oder Libre Office ist das Kommandozeilentool Unoconv erforderlich. Es nutzt die UNO-Bindings der freien Bürosuite, um unterstützte Dateiformate einzulesen und ins Zielformat konvertiert wieder auszugeben. Auf der Unoconv-Homepage [1] findet sich eine beeindruckende Liste der Im- und Exportformate (Abbildung 3).

Abbildung 3: Die Unoconv-Homepage hat eine eindrucksvolle Liste an unterstützten Formaten zu bieten.
Office-Daemon
Mit »unoconv –listener« lässt sich Libre Office als Daemon starten, der standardmäßig am TCP-Port 2002 lauscht. Das lässt sich aber mit der Kommandozeilenoption »–port« ändern. Ein großer Vorteil des Listener-Modus sind die Schnelligkeit, mit der er Dokumente konvertiert, sowie die einfache Syntax. Weitere Informationen zum Starten von Libre Office im Daemon-Modus und zum API finden sich unter [4] und [5].
Der Wermutstropfen: Wer in einer Standardinstallation von Debian Squeeze das Programm Unoconv im Listener-Modus startet, erhält eine Fehlermeldung der Python-UNO-Bridge als Antwort. Abhilfe schafft, statt Open Office das Libre-Office-Paket aus »backports« zu installieren. Da Unoconv eng mit der Office-Version zusammenarbeitet, kommt es als Paket aus Debians Unstable-Zweig zur Verwendung [6].
Unter dem Namen »/etc/init.d/unoconvd« legt Root ein Initskript zum Steuern des Office-Servers ab, das er wie in Listing 2 befüllt. Es erhält die oktalen Dateiberechtigungen 755. Anschließend sorgt das Tool Insserv dafür, dass das Initsystem den Konvertierungsdienst im Standardrunlevel startet:
Listing 2
/etc/init.d/unoconvd
01 #!/bin/bash 02 ### BEGIN INIT INFO 03 # Provides: unoconvd 04 # Required-Start: $network 05 # Required-Stop: $network 06 # Default-Start: 2 3 5 07 # Default-Stop: 08 # Description: unoconvd - Konvertierung nach PDF 09 ### END INIT INFO 10 case "$1" in 11 start) 12 su root -c "/usr/bin/unoconv --listener &" 13 ;; 14 stop) 15 killall soffice.bin 16 ;; 17 restart) 18 killall soffice.bin 19 sleep 1 20 su root -c "/usr/bin/unoconv --listener &" 21 ;; 22 esac
insserv -d unoconvd
Ist Insserv nicht vorhanden, lässt sich der Dienst auch mit »update-rc.d« , »chkconfig« oder per Handarbeit einrichten. Ist der Daemon gestartet, ob per RC oder manuell mit »/etc/init.d/unoconv start« , sollten sich Unoconv und »soffice.bin« in der Prozessliste befinden.
Das Skript, das die E-Mail annimmt, konvertiert und zurücksendet, ist zum Beispiel unter »/usr/local/bin/pdf-konverter.sh« gut aufgehoben. Es sollte »nobody:nogroup« als Eigentümer erhalten. Seinen Inhalt zeigt Listing 3 in verkürzter Form. Unter [12] findet sich der vollständige Code.
Listing 3
pdf-konverter.sh (gekürzt)
01 #!/bin/bash
02 # pdf - Befehl fuer pdf@[UCC:x00-fake-italic]domain.tld
03 [UCC:x00-fake-italic][...]
04 # Anhaenge als einzelne Dateien extrahieren
05 /usr/local/bin/ripmime -i $PDFMAIL -d $PDF_PFAD --syslog
06 # von ripmime erzeugte Datei textfile0
07 # wird nicht benoetigt, loeschen
08 if [ -f $PDF_PFAD/textfile0 ] ;
09 then rm -f $PDF_PFAD/textfile0 ;
10 fi
11 # von Ripmime extrahierte Dateien mit den
12 # Dateinamen textfile[i] werden dem BODY
13 # der Antwort wieder beigefuegt
14 if [ -f $PDF_PFAD/body_return.txt ] ;
15 then rm -f $PDF_PFAD/body_return.txt ;
16 fi
17 for TEXTFILENAME in $(ls $PDF_PFAD/textfile*); do
18 if (file --mime-type $TEXTFILENAME | grep -v "html"); then
19 cat $TEXTFILENAME >> $PDF_PFAD/body_return.txt
20 fi
21 done;
22 (echo "Dateianhaenge, welche als \
23 konvertierbar erkannt wurden:") \
24 >> $PDF_PFAD/body_return.txt
25
26 # zeige alle Dateien mit den folgenden
27 # Dateiendungen und lenke das Ergebnis
28 # in $PDF_PFAD/files_to_convert.txt um
29 # Typen erweiterbar - siehe man unoconv
30 ls $PDF_PFAD/*.* \
31 | egrep -i '\.(do[ct]|doc[mx]|rtf|pp[ts]|xl[st]|csv|od[stdgp]|ott|htm|sd[wcda]|sxc|jpg|pts|bmp|png|tif|gif)$' \
32 > $PDF_PFAD/files_to_convert.txt
33
34 [UCC:x00-fake-italic][...]
35
36 # zeilenweises Verarbeiten der Liste
37 # jede Datei einzeln an unoconv uebergeben
38 while read DATEI_NAME
39 do
40 /usr/bin/unoconv -f pdf "${DATEI_NAME}"
41 # Pfad aus dem Dateinamen entfernen
42 basename "${DATEI_NAME}" >> $PDF_PFAD/body_return.txt
43 done < $PDF_PFAD/files_to_convert.txt
44 # Kommandozeile fuer mime-construct in var 1 zusammenbauen
45 var1="/usr/bin/mime-construct"
46 var1="${var1} --header 'Sender: PDF-Server'"
47 var1="${var1} --header 'From: $PDF_FROM' --to $SENDER"
48 var1="${var1} --subject 'Re: $SUBJECT'"
49 var1="${var1} --file $PDF_PFAD/body_return.txt"
50
51 # jede PDF-Datei per file-attach an
52 # die Variable var1 uebergeben
53 for DATEI_NAME in $PDF_PFAD/*.pdf
54 do
55 var1="${var1} --file-attach \"$DATEI_NAME\""
56 done
57
58 # Ausfuehren des mime-construct-Befehls
59 eval ${var1}
60 echo ${var1} > $PDF_PFAD/var1.txt
61 echo ${var1} | sed 's/--/\\\n--/g' \
62 > $PDF_PFAD/mime-construct.txt
63
64 date >> $PDF_PFAD/dauer_von_bis.txt
65 exit 0
Ausblick
Wer mit der Kombination von Unoconv und Open oder Libre Office nicht zufrieden ist, findet in der Open-Source-Welt reichlich Alternativen: Antiword ([7], konvertiert erst nach Postscript, dann mit »ps2pdf« nach PDF), Pandoc [8], JOD- und PyOD-Converter [9] sowie LOPDF-Converter [10] stehen ebenfalls zur Auswahl.
Mit dieser funktionierenden Lösung ist es prinzipiell möglich, einen schnellen PDF-Konvertierungsserver zu betreiben. Einzelne Dokumentenanhänge erhält der Anwender binnen Sekunden zurück. Da Unoconv ab Version 0.4 spezialisierte Exportfilter bietet, wäre es außerdem machbar, mit einem weiteren Mailaccount in »/etc/aliases« und einem zweiten angepassten Skript (oder Parameter) andere Exportoptionen anzubieten, etwa mit anderer Auflösung [11].
Für den produktiven Einsatz dieses PDF-Konverters sollte der gewissenhafte Admin allerdings noch weitere Sicherheitsmaßnahmen treffen: Unoconv als reglementierten User starten, Cronjobs zum Löschen der temporären Pfade anlegen, Logdateien erzeugen sowie Postfix fachkundig absichern. (mhu)
Infos
- Unoconv: http://dag.wieers.com/home-made/unoconv
- Uudeview: http://www.fpx.de/fp/Software/UUDeview
- Ripmime: http://www.pldaniels.com/ripmime/ripmime-1.4.0.9.tar.gz
- Parameterliste für Libre Office: http://help.libreoffice.org/Common/Starting_the_Software_With_Parameters/de
- Open-Office-Export ins PDF-Dateiformat: http://de.openoffice.org/doc/howto_2_0/office/exportpdfformat.pdf
- »unoconv-unstable« : http://packages.debian.org/sid/all/unoconv/download
- Antiword: http://freshmeat.net/projects/antiword
- Pandoc: http://johnmacfarlane.net/pandoc
- JOD- und PyOD-Converter: http://artofsolving.com/opensource
- LOPDF-Converter: http://sourceforge.net/projects/lopdfconverter
- Open-Office-API zum PDF-Export: http://wiki.services.openoffice.org/wiki/API/Tutorials/PDF_export
- Listings: https://www.linux-magazin.de/static/listings/magazin/2011/10/mail2pdf/






