OfficedokumenteDirectDrucken hier beschreiben...
Anleitung zum einrichten von Openofficekonverter für CUPS.
Kurz die Theorie
CUPS ist in grunde genommen einfach ein Filter system. Du gibst ein was du hast, was du bekommen wills, und noch ein Paar optionen für Filtern. CUPS kümmert sich dan schon selbst darum, welche Filtre benutzt werden müsse. Meistens will man am ende PostScript haben, was man direkt ans Drücker anspeist oder wieder durch Druckerspezifischerfilter schickt. Also braucht man nur einen Filter basteln, der Officedocumente annimmt und das ausspuckt, was cups schon versteht, in diesem Fall PDF.
Was Konvertierung angeht, da läuft es wie folgt: Zuerst startet man Openoffice in Fensterlosenmodus (bracht leider Xserver um zu starten, ansonten meckert, dass es Display nicht öffnen kann. Lösung: xvfb) und an einem Port lauschen lassen. Dann kommt jodconverter in Spiel: er sagt dem Openoffice, was es öffnen muss, und wohin pdf speichern. Aus irgendeinem Grund weigert sich jodconverter die Dateien ohne passender Erweiterung anzunehmen, obwohl ist dem auch ziemlich egal, was für Erweiterung die Dateien haben. Es funktioniert ganz Prima alles blafoo.doc zu nennen.
Das ganze zissamen zu bringen ist nicht schwer. Zuerst liest man aus stdin alles und speichert irgendwo. Dann nennt man dieses irgendwo irgendwo.doc, speist jodconverter und bekommt irgendwo.pdf. Es bleicht nur noch irgendwo.pdf nach stdout zu schicken (mit cat z.B.).
Abhängikeiten
* cups - selbstverständlich * openoffice - gerade läuft es mit Version 2.0.4 aus Debian stable * [http://www.artofsolving.com/opensource/jodconverter jodconverter] - jetzt in Version 2.2.1 * start-stop-daemon - nützliches Tool, das aus Debian kommt, um mit * xvfb - fake-xserver, um jetzt openoffice als service starten zu können. * jre - für jodconverter (wird sowieso für Openoffice benötigt) * mktemp - ein Standarttool bei debian * und noch ein Paar Skripte, die man später in diesem Artikel findet und in Repository für Adminskripte
CUPS Konfiguration
Zuerst muss man dem CUPS sagen, wie es Officedokumente erkennt. In /etc/cups/mime.types einfügen:
application/officedocument dot doc \ xls xlb xlt \ ppt pps \ odc odb odf odg otg odi odp otp ods ots odm ott oth \ string(0,<D0CF11E0A1B11AE1>) \ ( string(0,<504B030414>) + ( string(50,"vnd.sun.xml.") string(50,"vnd.oasis.opendocument.") )
Dann erklären, wie es das ganze Konvertieren kann. In /etc/cups/mime.conv einfügen:
# Input-Format Output-Format Kosten Filter application/officedocument application/pdf 33 ooconv
Kosten sind dafür da, um für besseres Pfad zu entscheiden, wenn es mehrere gibt. Filter ist ausfürbare Datei in /usr/lib/cups/filter/.
/usr/lib/cups/filter/ooconv
Das ist ein Wrapper-Script, um Argumente für Filter anzupassen: wir brauchen nur ggf. Dateiname zum Konvertieren:
#!/bin/sh /usr/local/ooconv/ooconv.sh $6
/usr/local/ooconv
Das ist Hauptverzeichnis des Konverters.
jodconverter
Aus dem Archive braucht Konverter das gesamte Verzeichnis lib.
start_soffice.sh
Startet Openoffice in Service-Modus.
exec xvfb-run soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard -invisible -nologo
soffice_daemon
Dekoriert start_soffice.sh schön als Daemon. Wenn Openoffice schon gestartet ist, dann wird es nicht noch mal gestartet.
EXEC=/usr/lib/openoffice/program/soffice.bin START_FILE=/usr/local/ooconv/start_soffice.sh exec /sbin/start-stop-daemon -S -b -u $USER -a "$START_FILE" --exec "$EXEC"
jodconverter.sh
Wrapper für Javaprogramm jodconverter.
DIR=/usr/local/ooconv/lib/ exec java -jar "$DIR/jodconverter-cli-2.2.1.jar" $@
ooconv.sh
Wrapper für jodconverter, um den mit CUPS benutzen zu können.
# Gelenberg Andrej <andrej.gelenber@udo.edu> (C) 2008 USER=`whoami` # Wohin mit den ganzen Meldungen LOGF=/dev/null #LOGF=/tmp/lo # Name der temporärer Datei FILE=`mktemp` # Name der Ausgangsdatei TARGET="$FILE.pdf" if [ $# -eq 0 ] # Keine Argumente, also die Daten kommen ans stdin then cat > "$FILE" # Zuerst ins temporäres Datei speichern elif [ $# -ge 1 ] then ln -sf "$1" "$FILE" >>$LOGF 2>>$LOGF # wenn ein Dateiname übergeben wurde, # dann machen wir einen Symlink dadrauf, # damit alles, was danach kommt, gleich bleiben kann fi TYPE=doc # Dateiendung, die Datei haben soll, damit jodconvertor sie akzeptiert # ist egal, was für Format die Datei hat (ln -sf "$FILE" "$FILE.$TYPE" || exit 1) >>$LOGF 2>>$LOGF # das symlink wird von jodconveter später ohne probleme angenommen echo "File to convert: $FILE.$TYPE" >>$LOGF /usr/local/ooconv/soffice_daemon.sh >>$LOGF 2>>$LOGF # kümmert sich drum, das openoffice hoch-kommt, # wenn es nicht schon gestartet ist. RES=$? if [ "$RES" -eq "0" ] # openoffice musste gestartet werden, es daert ein bisschen, # es so weit ist, also muss man warten then echo "USER=$USER" >> $LOGF until pgrep -u $USER soffice >>$LOGF 2>>$LOGF do echo "wait for soffice" >>$LOGF sleep 1 done elif [ "$RES" -ne "1" ] then echo "can't start daemon" >>$LOGF # warum auch immer, aber weiter geht's bestimmt nicht exit 4 fi if /usr/local/ooconv/jodconverter.sh -f pdf "$FILE.$TYPE" >>$LOGF 2>>$LOGF # versuche zu convertieren then if [ ! -f "$TARGET" ] then echo "can't find target file: $TARGET" >>$LOGF # sollte eigentlich nicht vorkommen, aber wer weisst? exit 5 fi true else echo "converting fail ($?)" >>$LOGF # LOGF passend setzen und gucken, was schief läuft exit 3 fi cat "$TARGET" # gibt resultat aus rm -f "$FILE" "$FILE.$TYPE" "$TARGET" >> $LOGF 2>>$LOGF # temporäre Dateien löschen exit 0 # alles ist supper gelaufen