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

OfficedokumenteDirectDrucken (zuletzt geändert am 2009-01-17 16:31:28 durch dslnet)