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 | ||
+ |