Impression PDF Android

Philippe Wambeke - LoliGrUB

L'objectif

Un utlisateur “Lambda” doit pouvoir imprimer simplement un PDF depuis son smartphone / sa tablette Android.

  • Sans que Google ne sache ce qui est imprimé
  • Sans que le document ne fasse le tour du monde
  • Sans devoir donner tous les droits à Google sur l'imprimante
  • Sans être obligé d'acheter une imprimante réseau
  • En utilisant des logiciels libres

Les ingrédients

Au niveau matériel

  • Une imprimante (réseau ou USB)
  • Un ordinateur connecté à l'imprimante (un RPI suffit amplement)
  • La mise en réseau de l'ordinateur et du périphérique Android

Au niveau logiciel

  • Sur le serveur:
    • CUPS (Common Unix Printing Sytem)
    • Un serveur web (Apache par exemple) avec le module “webdav”
    • incron: permet d'être averti sur changements du système de fichiers
    • Un script Bash fait maison ;-)
  • Sur Android:
    • Un (bête) client webdav

La recette

Quel va être le parcours du PDF ?

  1. Envoyé depuis Android vers le serveur web à l'aide du protocole webdav
  2. Incron détectera qu'un nouveau fichier vient d'être “uploadé” et déclenchera l'exécution du script bash maison
  3. Le script maison vérifie qu'il s'agit bien d'un PDF et l'imprime via CUPS

Mise en place

Installation du serveur web

  • Installer Apache et CUPS:
sudo apt-get install apache2 cups
  • Activer le module webdav:
sudo a2enmod dav
sudo a2enmod dav_fs

Configuration du serveur web (1/3)

Dossier de destination

Le dossier qui recevra les fichiers PDF sera ici /var/www/webdav. Ce dossier doit être créé et appartenir à Apache.

sudo mkdir -p /var/www/webdav
sudo chown -R www-data:www-data /var/www/webdav

Configuration du serveur web (2/3)

Configurer Apache et le module webdav

Il faut aussi l'indiquer à Apache dans le dossier sites-available par le fichier /var/www/webdav:

Alias /webdav /var/www/webdav

<Location /webdav>
	Options Indexes MultiViews
	DAV On
	Order deny,allow
	deny from all
	allow from 192.168.2
</Location>

Côté serveur web: configuration (3/3)

Il faut ensuite activer le module webdav et recharger la configuration de Apache:

sudo a2ensite webdav
sudo service apache2 reload

Configuration de CUPS (1/2)

Port d'écoute

Permettre d'accéder à CUPS depuis le réseau local en modifiant le fichier de configuration /etc/cups/cupsd.conf.

Remplacer la ligne:

Listen localhost:631

par:

Listen 631

Configuration de CUPS (2/2)

Permettre d'accéder à l'interface d'administration de CUPS:

sudo cupsctl --remote-admin

Finalement, on redémarre CUPS:

sudo systemctl restart cups

Ajouter l'imprimante

En fonction de la marque et du modèle d'imprimante, il peut être nécessaire d'installer des pilotes supplémentaires. Le site https://www.openprinting.org/printers dresse une liste exhaustive des modèles et des drivers correspondant.

Une fois le bon driver installé, reste à ajouter l'imprimante:

Incron

  • Installer incron et permettre à root de l'utiliser. Taper en tant que root:
sudo su
# apt-get install incron
# echo root > /etc/incron.allow
  • Activer la surveillance du dossier de destination:
sudo incrontab -e
  • Et ajouter:
/var/www/webdav IN_MOVED_TO /home/wap/printtest.sh $@ $#

Le script bash

Du côté serveur, il ne reste plus qu'à copier le script bash suivant dans le dossier spécifié à l'étape précédente.

#!/bin/bash
# Petit script pour imprimer un pdf en ligne de commande (trop fort GNU/Linux)
complete_file_name="$1/$2"

file_name=$(file "${complete_file_name}" | grep "PDF document" | cut -f1 -d':')
if [ -n "${file_name}" ]; then
	lp -d "HP_DESKJET_990C" "${file_name}"
	rm "${file_name}"
fi

Côté Android

Il suffit ensuite d'installer n'importe quel client webdav.

L'impression du PDF se fait simplement en “uploadant” le fichier PDF sur le serveur web.

Pour aller plus loin

Il est possible d'améliorer les choses:

  • en implémentant une authentification pour l'envoi des PDF (mode digest)
  • imprimer des images en faisant une conversion à la volée (mogrify)
  • imprimer des documents odt en faisant une conversion à la volée (mais nécessite l'installation d'une usine à gaz)

Merci

Questions ?