Benutzer-Werkzeuge

Webseiten-Werkzeuge


Writing /srv/www/htdocs/udo/singollo.de/linux.singollo.de/public_html/data/cache/e/e8cd71657b79f427dcda2d3d37723009.metadata failed
cups:mit_cups_scripten_-_pdf-_und_ps2image

PDF- und PS2Image

CUPS ist ein Allrounder in Sachen Druckerserver. Nicht nur als lokaler Druckerserver für die am Rechner angeschlossenen Drucker oder im Netzwerk spielt er seine Fähigkeiten aus, sondern hat auch noch einige Besonderheiten, die man für „Spielereien“ einsetzen kann. CUPS setzt auf Backends/Filter, die Druckdaten für verschiedene Druckerprotokolle aufbereiten können. Dazu zählen nicht nur lokale und netzwerkfähige Drucker, sondern auch diverse andere. Auf meinem Rechner sind z.B. folgende Backends installiert:

  • canon
  • epson
  • hp
  • ipp
  • lpd
  • parallel
  • usb

Normalerweise bekommt das Backend die druckerspezifischen Daten vom Filter und sendet sie weiter an den Drucker oder einen sonstigen Empfänger. Die Unterschiede zwischen Backend und Filter sind:

  • Genau ein Backend, aber normalerweise mehrere Filter (eine Filterkette) werden aktiviert, um einen Druckauftrag zu verarbeiten. Ausnahmen: „System V style Interface Script“ (genau ein Filter) und „raw“-Druck (kein Filter).
  • Das Backend ist immer das letzte Programm in der Verarbeitungskette, das ausgeführt wird, um einen Druckauftrag zu verarbeiten.

In den Archiven zum Download ist das PPD-File des Adobe Distiller nicht enthalten. Adobe bietet es zum freien Download an. Alternativ kann auch Ghostscript verwendet werden.

Hinweis: Bei den Scripten ist zu beachten, wo CUPS die Backends und andere Files ablegt. Dementsprechend bitte die Pfade anpassen.


Backend/Filter einfügen

Die Backends für Cups können Scripte oder Programme sein. Sie werden in /usr/lib/cups/backends bzw. /usr/lib64/cups/backends (opensuse 10.3) gespeichert. Der Aufruf eines Backends erfolgt immer gleich: BACKEND job-id user title copies options [file]. Eigentlich stehen die Backends für verschiedene Protokolle, sind aber in diesem Falle nur ein Wrapper für das eigentliche Script. Ich bevorzuge das eigentliche Script in ein separates Verzeichnis unter /usr/lib/cups bzw. /usr/lib64/cups zu speichern.

PDF erzeugen

Es gibt viele Möglichkeiten, aus verschiedenen Dokumenten PDF zu erzeugen. Die beste Lösung bietet Adobe selbst an. Aber nicht jeder kann auf diese Lösung zurückgreifen. OpenOffice bietet eine direkte PDF-Erzeugung an, Microsofts Office kann das nur mit Zusatzsoftware. Die meisten Programme dazu nutzen Ghostscript. Leider kann man solche Lösungen nicht in jedem Büro einführen, die IT-Richtlinien erlauben dies nicht.

Mit dieser Variante kann man unabhängig von allen Richtlinien druckbare PDFs erzeugen. PDFs mit Formularen oder ähnlichen Erweiterungen kann der CUPS-Printer naturgemäss nicht erstellen.

Wir benötigen also ein Postscript-Filter und ein Backend, was PS nach PDF wandelt. Die besten Ergebnisse in Sachen Postscript ist der Adobe Distiller, den es als PPD-File einzubinden gilt. Das Backend „pdf“ übernimmt dessen PS-Datei und „jagt“ sie durch Ghostscript, um ein PDF-File daraus zu erzeugen. Dieses File wird anschliessend entweder an den Nutzer gemailt oder in ein Verzeichnis abgelegt.

backend-Script

#!/bin/sh
#
PDFBIN=/usr/lib/cups/pdf/ps2pdf.cups
MAILBIN=/usr/lib/cups/pdf/sendpdf
FILENAME=
# filename of the PDF File
PRINTTIME=`date +%Y-%m-%d_%H.%M.%S`
# no argument, prints available URIs
if [ $# -eq 0 ]; then
        if [ ! -x "$PDFBIN" ]; then
                exit 0
        fi
        echo "direct pdf \"Unknown\" \"PDF Creator\""
        exit 0
fi
# case of wrong number of arguments
if [ $# -ne 5 -a $# -ne 6 ]; then
        echo "Usage: pdf job-id user title copies options [file]"
        exit 1
fi
# get PDF directory from device URI, and check write status
PDFDIR=${DEVICE_URI#pdf:}
if [ ! -d "$PDFDIR" -o ! -w "$PDFDIR" ]; then
        echo "ERROR: directory $PDFDIR not writable"
        exit 1
fi
# generate output filename
OUTPUTFILENAME=
if [ "$3" = "" ]; then
        OUTPUTFILENAME="$PDFDIR/unknown.pdf"
else
        if [ "$2" != "" ]; then
                OUTPUTFILENAME="$PDFDIR/$2-$PRINTTIME.pdf"
        else
                OUTPUTFILENAME="$PDFDIR/$PRINTTIME.pdf"
        fi
        echo "PDF file: $OUTPUTFILENAME placed in: $PDFDIR" >> $LOGFILE
fi
# run ghostscript
if [ $# -eq 6 ]; then
        $PDFBIN $6 $OUTPUTFILENAME >& /dev/null
else
        $PDFBIN - $OUTPUTFILENAME >& /dev/null
fi
 
if [ "$2" != "" ]; then
        $MAILBIN $2 $OUTPUTFILENAME
        rm -f $OUTPUTFILENAME
fi
exit 0

ps2pdf-Script

#!/bin/sh
# Convert PostScript to PDF.
 
OPTIONS=""
while true
do
        case "$1" in
        -*) OPTIONS="$OPTIONS $1" ;;
        *)  break ;;
        esac
        shift
done
 
if [ $# -lt 1 -o $# -gt 2 ]; then
        echo "Usage: `basename $0` [options...] input.ps [output.pdf]" 1>&2
        exit 1
fi
 
infile=$1;
 
if [ $# -eq 1 ]
then
        outfile=$1
else
        outfile=$2
fi
 
exec gs -dNOPAUSE -dBATCH -dPDFSETTINGS=/printer -sDEVICE=pdfwrite -sOutputFile=$outfile $OPTIONS -c save pop -f $infile
 
exec pdfopt $outfile $outfile

PS2Image

Manchmal benötigt man aus einer Seite genau einen bestimmten Ausschnitt oder für Dokumentationszwecke einen passenden Ausschnitt aus einem Dokument. Ich kenne nicht viele Möglichkeiten, aus einem beliebigen Dokument eine einzelne Seite als Grafik zu speichern. Die gängigsten sind Drucken und Scannen bzw. Screenshot und danach mit einem Bildbearbeitungsprogramm bearbeiten.

Wie beim PDF-Printer nutze ich die Scriptfähigkeit von CUPS und erstelle mittels Ghostscript und ImageMagick eine Grafik. Auch hier setze ich einen Pseudo-Drucker ein, der über die Zwischenstation Postscript die Grafik erzeugt. Der PS2Image-Printer ist eine Variante des obigen PDF-Printers. Das Backend nimmt die Druckseite entgegen, wählt die erste gedruckte Seite aus und übergibt diese convert. convert ist ein universelles Werkzeug und versteht sehr viele Formate, darunter auch Postscript. convert erzeugt ein JPG-Bild mit 50dpi. Dieses wird entweder an den Nutzer gemailt oder in ein Verzeichnis gespeichert.

backend-Script

#!/bin/sh
#
PSIBIN=/usr/lib/cups/ps2image/ps2image.cups
MAILBIN=/usr/lib/cups/ps2image/sendimage
FILENAME=
# filename of the File
PRINTTIME=`date +%Y-%m-%d_%H.%M.%S`
# no argument, prints available URIs
if [ $# -eq 0 ]; then
        if [ ! -x "$PSIBIN" ]; then
                exit 0
        fi
        echo "direct psi \"Unknown\" \"ps2image Creator\""
        exit 0
fi
# case of wrong number of arguments
if [ $# -ne 5 -a $# -ne 6 ]; then
        echo "Usage: psi job-id user title copies options [file]"
        exit 1
fi
# get PSI directory from device URI, and check write status
PSIDIR=${DEVICE_URI#psi:}
if [ ! -d "$PSIDIR" -o ! -w "$PSIDIR" ]; then
        echo "ERROR: directory $PSIDIR not writable"
        exit 1
fi
# generate output filename
OUTPUTFILENAME=
if [ "$3" = "" ]; then
        OUTPUTFILENAME="$PSIDIR/unknown.jpg"
else
        if [ "$2" != "" ]; then
                OUTPUTFILENAME="$PSIDIR/$2-$PRINTTIME.jpg"
        else
                OUTPUTFILENAME="$PSIDIR/$PRINTTIME.jpg"
        fi
        echo "JPG file: $OUTPUTFILENAME placed in: $PSIDIR" >> $LOGFILE
fi
# run ghostscript
if [ $# -eq 6 ]; then
        $PSIBIN $6 $OUTPUTFILENAME >& /dev/null
else
        $PSIBIN - $OUTPUTFILENAME >& /dev/null
fi
 
if [ "$2" != "" ]; then
        $MAILBIN $2 $OUTPUTFILENAME
        rm -f $OUTPUTFILENAME
fi
exit 0

ps2image-Script

#!/bin/sh
# Convert PostScript to JPG
 
OPTIONS="-density 50x50"
while true
do
        case "$1" in
        -*) OPTIONS="$OPTIONS $1" ;;
        *)  break ;;
        esac
        shift
done
 
if [ $# -lt 1 -o $# -gt 2 ]; then
        echo "Usage: `basename $0` [options...] input.ps [output.jpg]" 1>&2
        exit 1
fi
 
infile=$1;
 
if [ $# -eq 1 ]
then
        outfile=$1
else
        outfile=$2
fi
 
TMPFILE=/tmp/`date +%Y-%m-%d_%H.%M.%S`.ps
 
psselect -p1 $infile $TMPFILE
convert $OPTIONS $TMPFILE $outfile
rm -q TMPFILE

Download

Beide Varianten habe ich in ein Paket zusammengefasst. Es kann als Startpunkt für eigene Filter verwendet werden.

Download: ftp://singollo.de/pub/cups.tar.gz

Lizenz: Freie Software im Sinne der GPL

cups/mit_cups_scripten_-_pdf-_und_ps2image.txt · Zuletzt geändert: 07.10.2012 18:31 (Externe Bearbeitung)