Table des matières

CUPS

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.

Liens utiles

https://docs.oracle.com/cd/E23824_01/html/821-1451/gllgm.html#glmgg

https://www.brennan.id.au/15-System_Printing.html

https://doc.ubuntu-fr.org/tutoriel/comment_installer_pilotes_canon_ufr2

https://wiki.debian.org/PrintQueuesCUPS#The_device-uri