[Eisfair] PDF-Druck unter eisfair

Marcus Röckrath marcus.roeckrath at gmx.de
Sa Feb 10 22:13:34 CET 2024


Hallo Stefan,

Stefan Puschek wrote:

>> Dafür bräuchte es das Paket cups-pdf, was es bislang wohl noch nicht
>> gibt; sähe nach Blick ins src-RPM keine Probleme.
>> 
>> Mal sehen, was Holger dazu meint.
> 
> macht mal langsam: das müsste doch auch LOKAL auf jedem client gehen -
> ich bin da gerade am buddeln...

Der Vorteil eines Netzwerk-PDF-Druckers hat den Vorteil, den nicht auf jedem
Client einzeln installieren zu müssen, sondern den netzwerkweiten einfach
auf jeden Client als Raw-Drucker (ohne Treiber/PPD) im Clientmodus
einzurichten.

Habe heute mal damit rumgespielt, nachdem mir Holger das Paket
bereitgestellt hat, damit ich das Binärbackend nicht erst selbst bauen
musste.

Dabei bin ich auf ganz interessante Lösungen gestoßen.

Man kann

- verschiedene Konfigurationsdateien des PDF-Druckers nutzen
- man kann ein PostProcessing-Skript in die Konfigurationsdatei einbinden

Üblicherweise lautet die Konfigurationsdatei /etc/cups/cups-pdf.conf, womit
dann im Cups-Webinterface bei der Druckereinrichtung ein "CUPS-PDF (Virtual
PDF Printer)" auswählbar ist.

Erstellt man nun eine /etc/cups/cups-PDF-Mail.conf erscheint im Webinterface
nun auch "CUPS-PDF (Virtual PDF Printer)".

Damit dieser nun auch wirklich mailt, nutzt man die PostProcessing Option in
der Konfigurationsdatei, wo man ein skript einträgt, was die
Nachbearbeitung (Mailversand) durchführt.

Ich habe heute mal als "Studie" ein "Universalskript" geschrieben, dass
verschiednee Aktionen ausführen kann; für den lokalen Mailversand steht nun
bei mir in der /etc/cups/cups-PDF-Mail.conf:

PostProcessing /pfad/zu/cups-pdf-postprocessing mail2user "your pdf" "pdf"
(mail2user ist die Aktion; "your pdf" "pdf" die Texte für Betreff und Body
der Mail.)

Automatisch übergibt Cups noch den Dateinamen des Dokumentes und des
druckenden Users.

Somit wird nun das erzeugte PDF mittels mailx an den User versandt; auch
externen Versand habe ich damit erfolgreich getestet.

Je nachdem, welchen Aufwand man in diesem PostProcessing-Skript treiben
möchte, ist fast jede beliebige Aktion denkbar. Für jede gewünschte Aktion
ist dann eine cups-pdf-<aktion>.conf zu erstellen und der dazugehörende
PDF-Drucker einzurichten.

Hier mal mein schneller Skripthack:

#!/bin/sh

# Usage: cups-pdf-postprocessing action [...] pdf-file user user
#
# arg1 : action
# arg2 to arg<count-3> : additional arguments
# Next three (last arguments) on commandline added by the
# pdf printer automatically
# arg<count-2> : pdffile
# arg<count-1> : user
# arg<count> : user

argscount=$#

additionalargscount=$((argscount - 4))

if [ "${argscount}" -lt 4 ]
then
  echo "Too less arguments; minimum 4 including the three arguments"
  echo "added by pdf print driver!"
else
  action="${1}"
  shift
  # Additional arguments are counted beginning with 2
  # corresponding to there position in the commandline.
  i=2
  while [ -n "${1}" ]
  do
    if [ $# -eq 3 ]
    then
      pdffile="${1}"
      shift
      user="${1}"
      shift
      user2="${1}"
      shift
    else
      eval 'arg'${i}='${1}'
      shift
      i=$((i + 1))
   fi
done

case ${action} in
  move2public)
    # move all pdf's to public dir
    # no additional argument
    if [ "$(dirname ${pdffile})" != "/public" ]
    then
      mv ${pdffile} /public
    fi
  ;;
  move2dir)
    # move all pdf's to the directory given as argument
    # arg2 : path to move file to
    if [ "${additionalargscount}" -ge "1" ]
    then
      if [ "$(dirname ${pdffile})" != "${arg2}" ] && \
         [ "$(dirname ${pdffile})/" != "${arg2}" ]
      then
        mv ${pdffile} ${arg2}
      fi
   fi
   ;;
   mail2printuser)
     # mail pdf's to that local user who has printed it
     # arg2 : mail text
     # arg3 : mail subject
     if [ "${additionalargscount}" -ge "2" ]
     then
       echo ${arg2} | mailx -s ${arg3} -a ${pdffile} ${user}
       rm ${pdffile}
     fi
   ;;
   mail2address)
     # mail all pdf's to a single mail address (local or extern)
     # arg2 : mail text
     # arg3 : mail subject
     # arg4 : mail recipient
     # arg5 : mail sender (eventually needed for external recipients
     #        depends on the mail server configuration
     if [ "${additionalargscount}" -ge "4" ]
     then
       echo ${arg2} | mailx -s ${arg3} -r ${arg5} -a ${pdffile} ${arg4}
       rm ${pdffile}
     else
       if [ "${additionalargscount}" -ge "3" ]
       then
         echo ${arg2} | mailx -s ${arg3} -a ${pdffile} ${arg4}
         rm ${pdffile}
       fi
     fi
     ;;
     userdependend)
       # Do differnt things for some users
       # Check for number of arguments: has to be additional needed
       # parameters + 4
       if [ "${additionalargscount}" -ge "....." ]
       then
         case ${user} in
           username)
             echo "do something"
           ;;
           otheruser|anotheruser)
             echo "do something different"
           ;;
           yetanotheruser)
             echo "do something completely different"
           ;;
           *)
             echo "No special action for all other users."
           ;;
         esac
       fi
     ;;
     *)
       echo action not defined
     ;;
  esac
fi

-- 
Gruß Marcus
[eisfair-Team]


Mehr Informationen über die Mailingliste Eisfair