Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
|
printing:linux:cups [2017/09/12 13:35] florian créée |
printing:linux:cups [2023/12/12 08:22] (Version actuelle) florian ↷ Page déplacée de linux:cups à printing:linux:cups |
||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ===== 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 : | ||
| + | <file pdf-writer> | ||
| + | #!/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 ######################## | ||
| + | # | ||
| + | </file> | ||
| + | |||
| + | 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): | ||
| + | <code> | ||
| + | <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> | ||
| + | </code> | ||
| + | |||
| + | 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): | ||
| + | * **<Printer EzGED>** 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) | ||
| + | |||
| + | <code> | ||
| + | service apparmor stop | ||
| + | update-rc.d -f apparmor remove | ||
| + | </code> | ||
| + | Il faudra rebooter la machine. | ||
| + | |||
| + | |||
| ====== Liens utiles ====== | ====== Liens utiles ====== | ||
| Ligne 8: | Ligne 210: | ||
| https://wiki.debian.org/PrintQueuesCUPS#The_device-uri | https://wiki.debian.org/PrintQueuesCUPS#The_device-uri | ||
| + | |||