Tipp: mehrere PDF Drucker mit unterschiedlichen Briefpapier erstellen

Hallihallo,

zu dem Thema gibt es bereits einige Informationsschnipsel, die ich hier zusammentragen und vervollständigen möchte. Ich bin darauf gestoßen, als ich bei einzelnen Mitarbeiter PCs eine kommerzielle Software zum Erstellen von PDF Dateien mit Firmenlogo installiert hatte, aber dann durch Umorganisation die Software an anderen PCs gebraucht wurde. Da kam der Gedanke, eine Serverbasierte Lösung wäre toll. Zudem muss man auch nicht mehr mit dem Lizenzdingensaktivierungsgedöns rumeiern :money_mouth_face:

Sehr erfreulich fand ich, dass der UCS schon 95% der Lösung mitbringt :slight_smile:
Kurz gesagt benötigt man nur einen CUPS-PDF Drucker und ein Tool, was im Nachgang die original PDF-Datei mit der Briefpapier-PDF-Datei zusammen führt und dafür sorgt, dass der Anwender an die PDF-Dateien, die ja auf dem Server liegen, herankommt.

ucr set repository/online/unmaintained=yes
univention-install univention-printserver-pdf pdftk
ucr set repository/online/unmaintained=no

pdftk: das PDF-Toolkit kann eine PDF Datei als Hintergrund zu einer anderen PDF Datei hinzufügen.
univention-printserver-pdf: Stellt die CUPS-PDF Druckfunktionalität zur Verfügung und erzeugt eine für jeden Benutzer persönliche Freigabe zu den PDF-Dateien, sobald die erste Datei gedruckt wurde.

Nach der Installation kann man testen, ob der PDF-Druck an sich schon funktioniert. Hier steht, wie ein PDF-Drucker in der Univention Management Console angelegt wird:
https://docs.software-univention.de/handbuch-4.4.html#pdf-printer
Den Druckernamen, den man hierbei bestimmt, braucht man später im Skript wieder, wenn man mehr als einen PDF-Drucker nutzen möchte. Wie man einen Druckertreiber für Windows Clients zur Verfügung stellt, ist Handbuch gleich im nächsten Kapitel beschrieben.

  • Eine Skritpdatei vorbereiten, die nach jedem PDF-Druck aufgerufen wird
touch /usr/bin/cups_postprocess
chmod +x /usr/bin/cups_postprocess
  • Der CUPS-PDF Konfiguration das Skript bekannt machen, hier nach #PostProcessing suchen
sudo nano /etc/cups/cups-pdf.conf

PostProcessing /usr/bin/cups_postprocess

nano /usr/bin/cups_postprocess
  • Hier nun das Skript, das die Nachbearbeitung erledigt:
!/bin/bash

# The script is called by:
# postprocessing commandline built
# (/usr/bin/cups_postprocess /var/spool/cups-pdf/printuser/Title_of_your_print.pdf username printuser)
# username is the user running this script. Remember you changed this to be your regular system user name. If you skipped that step it will be 'nobody'
# the printuser is the username the print client gave. It's probably the user account on their pc.
# You can use these as variables in this script, $1 is the file name, $2 the username and $3 the client print user.

FILENAMEEXT=`basename $1`
DIRNAME=`dirname $1`
FILENAME=`basename $1 .pdf`
cd $DIRNAME

case $PRINTER in
     PDF-Briefpapier-nurLogo)      
                        PLET="$DIRNAME"/"$FILENAME".pdf
                        BLANK="$DIRNAME"/"$FILENAME"_blank.pdf
                        mv $1 $BLANK
                        pdftk $BLANK background /etc/cups/Logo.pdf output "$PLET"
                        ;;
     PDF-Briefpapier-nurLogo_RG-Nr)  
                        convert -density 300 $1[0] -depth 8 -background white -alpha Off $1.tiff
                        tesseract $1.tiff $1
                        RENR=$(grep -oP 'Nr. \K\w+' $1.txt)
                        #MAILADR=$(grep -oPi 'Email: \K[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,10}' $1.txt)
                        #echo $MAILADR > mail.txt
                        PLET="$DIRNAME"/firma\ RG\ "$RENR".pdf
                        pdftk $1 background /etc/cups/Logo.pdf output "$PLET"
                        mv $1 "$DIRNAME"/firma\ RG\ "$RENR"\ blank.pdf
                        rm $1.txt
                        rm $1.tiff
          ;;
     PDF-Briefpapier-LogoFusszeile)
                PLET="$DIRNAME"/"$FILENAME".pdf
                        BLANK="$DIRNAME"/"$FILENAME"_blank.pdf
                        mv $1 $BLANK
                        pdftk $BLANK multibackground /etc/cups/Letterhead.pdf output "$PLET"
          ;;
     *)
          PLET="$DIRNAME"/"$FILENAME".pdf
          pdftk $1 background /etc/cups/Logo.pdf output "$PLET"
          ;;
esac

Anfangs war ich schon happy, ein Logo in eine PDF Datei pflanzen zu können - wie bei Drucker 1. Allerdings war der Dateiname nicht so aussagekräftig, was mich dazu bewegt hat, Drucker 2 zu kreieren. Firmenname und Rechnungsnummer gleich im Dateinamen zu haben wäre doch super. Ein paar Worte dazu…

convert -density 300 $1[0] -depth 8 -background white -alpha Off $1.tiff

Konvertiert die erste Seite der PDF-Datei in eine TIFF Datei um


tesseract $1.tiff $1

Tesseract ist ein OCR Programm. Es sucht nach Buchstaben und Wörter in der Grafikdatei und schreibt das Erkannte in eine Textdatei mit der Endung .txt
Installation mit univention-install tesseract-ocr-deu tesseract-ocr


RENR=$(grep -oP 'Nr. \K\w+' $1.txt)

Sucht in der eben erstellen Textdatei nach dem Schlüsselwort NR. und steckt das, was unmittelbar danach kommt, in die Variable $RENR
Zum Testen von Regular Expressions ist diese Seite eine große Hilfe: https://regex101.com/


PLET="$DIRNAME"/firma\ RG\ "$RENR".pdf

Dateinamen nach wunsch zusammenbauen


pdftk $1 background /etc/cups/Logo.pdf output "$PLET"

Hintergrund in PDF-Datei integrieren. Es wird eine PDF-Datei mit dem gewünschten Hintergrund im Pfad /etc/cups/Logo.pdf erwartet.


mv $1 "$DIRNAME"/firma\ RG\ "$RENR"\ blank.pdf
rm $1.txt
rm $1.tiff

Die original PDF-Datei umbenennen und temporäre Dateien löschen.

Zu dem 3. Drucker noch eine Anmerkung. Hier wird pdftk mit dem Parameter multibackground aufgerufen. Das ist nützlich, wenn man auf der 1. Seite einen anderen Hintergrund nutzen möchte, wie auf den restlichen Seiten. Z.B. auf Seite 1 Logo, Kopf- und Fußzeile, auf den restlichen Seiten nur das Logo. Als Template wird dann eine PDF-Datei mit zwei Seiten benötigt.

Hinweise für Windows Clients

  • Als Druckertreiber eignet sich der Typ: Generic MS Publisher Imagesetter
  • UNC Pfad zu den PDF-Dateien: \\<UCS-Server>\pdfPrinterShare
  • Bei Windows 10 kommt der Fehler 0x000006d1, hier steht die Lösung:
    Print from Windows 10

Quellen:
https://www.steveroot.co.uk/2014/11/22/virtual-pdf-printer-for-our-small-office-network-a-step-by-step-how-to/


2 Likes