===== 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 swing be)
#
# License: GPL
#
#################################################################################
PS2PDF=`which ps2pdf`
DATE=`date +%Y-%m-%d-%H-%M-%S`
# USERMODE="on" changes PDFPATH to "$HOME//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 : {{:adist5.zip| 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):
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
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):
* **** Ici notre imprimante s'appelle EzGED.
* **MakeModel Acrobat Distiller 3011.104** Indique le driver à utiliser.
* **DeviceURI pdf-writer:/ezged-pdf/** Indique le backend utilisé, ici //pdf-writer// et surtout le répertoire vers lequel les impressions vont être écrites, ici ///ezged-pdf///
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