CUPS (Common Unix Printing System) est le système qui gère l'impression sur les sytèmes Unix.
Si cups n'est pas déjà installé :
apt-get install cups
Notre but est de proposer une imprimante virtuelle pour imprimer dans un fichier PDF. Pour cela nous allons installer un “backend” (ou filtre) dans cups.
Ci-dessous le code du backend :
#!/bin/sh ################################################################################# # # File: pdf-writer # # Description: A simple PDF Writer for CUPS # # Copyright: (c) 2006 Axel Schmidt, SUSE LINUX GmbH, Nuernberg, Germany # (c) 2001 Michael Goffioul (kdeprint <at> swing <dot> be) # # License: GPL # ################################################################################# PS2PDF=`which ps2pdf` DATE=`date +%Y-%m-%d-%H-%M-%S` # USERMODE="on" changes PDFPATH to "$HOME/<user-name>/PDF" # USERMODE="off" DEFGROUP="www-data" HOME="/home" JOB=$1 PRTUSER=$2 PRTNAME=$3 # Create user based file name # create_user_fname() { if [ "$PRTUSER" != "" ]; then FILENAME="$PDFPATH/$PRTNAME-$PRTUSER-$DATE.pdf" logger "pdf-writer: \"$PRTNAME-$PRTUSER-$DATE.pdf\" was placed in: $PDFPATH" else FILENAME="$PDFPATH/$DATE.pdf" logger "pdf-writer: \"$DATE.pdf\" was placed in: $PDFPATH" fi } # Check DEVICE DISCOVERY + test PS2PDF # if [ "$JOB" = "" ]; then if test -f "$PS2PDF" ; then echo "network pdf-writer:/export/share/pdf \"unkown\" \"pdf writer\" " logger "pdf-writer: INFO: USERMODE=\"$USERMODE\"" if [ "$USERMODE" = "on" ]; then logger "pdf-writer: CUPS user must be set to root with USERMODE=\"on\"!" fi exit 0 else echo "Error: $0 - ps2pdf is not available!" logger "pdf-writer: ERROR: ps2pdf is not available!" exit 1 fi fi logger "pdf-writer started: $1 $2 $3 $4 $5 $6" # Check number of command line arguments # if [ $# -ne 5 -a $# -ne 6 ]; then echo "Usage: $0 job-id user title copies options [file]" logger "pdf-writer: CRITICAL: Printer stopped !" exit 1 fi # get PDF-WRITER directory from device URI # PDFPATH=${DEVICE_URI#pdf-writer:} # Create output filename based on user name and user mode # if [ "$USERMODE" = "on" -a "$PRTUSER" != "" ]; then mkdir -p $HOME/$PRTUSER/PDF chown $PRTUSER $HOME/$PRTUSER/PDF # check if cups run as lp or root # user lp may not run chown # if [ $? -eq 1 ]; then create_user_fname else chgrp $DEFGROUP /home/$PRTUSER/PDF PDFPATH=$HOME/$PRTUSER/PDF FILENAME="$PDFPATH/$DATE.pdf" logger "pdf-writer: \"$DATE.pdf\" was placed in: $PDFPATH" fi else create_user_fname fi # Check write status # if [ ! -d "$PDFPATH" -o ! -w "$PDFPATH" ]; then logger "pdf-writer: ERROR: directory $PDFPATH not writeable" exit 1 fi chmod 777 $PDFPATH # Run ps2pdf (ghostscript) if [ $# -eq 6 ]; then $PS2PDF $6 "$FILENAME" #>& /dev/null else $PS2PDF - "$FILENAME" #>& /dev/null fi # Chown + set permissions for the user # Note: this will no work if CUPS runs as lp if [ "$PRTUSER" != "" ]; then chmod 664 "$FILENAME" chown www-data:www-data "$FILENAME" fi logger "pdf-writer: exit 0" exit 0 # ######################### CUPS pdf-writer ends here ######################## #
A écrire dans le fichier :
/usr/lib/cups/backend/pdf-writer
que l'on rend executable :
chmod +x /usr/lib/cups/backend/pdf-writer
Nous allons aussi installer un driver PDF d'Adobe : Driver Adobe Distiller
On télécharge le fichier :
wget https://wiki.ezdev.fr/lib/exe/fetch.php?media=adist5.zip -O adist5.zip
On extrait
unzip adist5.zip
On copie le fichier du driver vers le répertoire suivant:
cp ADIST5.PPD /usr/share/ppd/cupsfilters/
Dès lors nous pouvons créer une imprimante qui utilisera ce backend et ce driver. La création d'une imprimante peut se faire via l'interface web de cups ou en ajoutant sa définition dans le fichier
/etc/cups/printers.conf
Ci-dessous la définition d'une imprimante (à écrire dans /etc/cups/printers.conf):
<Printer EzGED> UUID urn:uuid:8df712d7-9396-3700-7d21-6b7999f2de89 Info EzGED Location MakeModel Acrobat Distiller 3011.104 DeviceURI pdf-writer:/ezged-pdf/ State Idle StateTime 1476371738 ConfigTime 1476371730 Type 8433740 Accepting Yes Shared Yes JobSheets none none QuotaPeriod 0 PageLimit 0 KLimit 0 OpPolicy default ErrorPolicy retry-job </Printer>
Les parties les plus importantes que vous êtes libre de modifier (et que vous devrez modifier si vous souhaitez copier cette déclaration pour de nouvelles imprimantes):
Le répertoire /ezged-pdf/ doit avoir les droits suivants :
drwxrwxrwx 2 www-data www-data 4096 oct. 14 09:19 ezged-pdf
Nous allons par commodité créer un lien symbolique sur ce répertoire dans /var/spool/ezged/instance/ps2pdf/wait
ln -s /ezged-pdf/ /var/spool/ezged/instance/ps2pdf/wait/ezged-pdf
Et c'est donc sur ce répertoire /var/spool/ezged/instance/ps2pdf/wait/ezged-pdf que vous ferez pointer votre lanceur COLD.
/!\ La configuration de base de AppArmor (https://guide.ubuntu-fr.org/server/apparmor.html) va certainement contraindre cups en terme de droits d'écritures. La configuration de apparmor n'entre pas dans le cadre de cette documentation.
Vous pouvez désactiver apparmor de la manière suivante (Il est toutefois vivement recommandé de configurer le profil de cups dans apparmor)
service apparmor stop update-rc.d -f apparmor remove
Il faudra rebooter la machine.