Marquer ses PDFs avec PDFTK et un script bash
J’ai, pour les besoins d’une association, scanné plusieurs milliers de pages de documents et ceux-ci sont stockés sur un serveur Debian accessible aux membres. Ces documents ne sont pas confidentiels, mais l’association n’apprécierait pas que ses documents se retrouvent facilement sur le net et surtout sans contrôle de diffusion. Cette diffusion pouvant être le résultat d’une faute d’un des membres (celui-ci ayant décidé de distribuer des documents à des extérieurs), soit une erreur (serveur mal protégé,…). Afin de limiter l’étendu des dégâts, à l’aide de PDFTk et d’un script de ma composition, j’ai ‘watermaké’ (mis un filigrane) les documents PDF afin de rendre clairement visible l’origine des documents.
Dans le poste qui suit, je vais vous expliquer en quelques lignes les outils utilisés, et l’organisation des données afin de pouvoir ‘watermaké’ facilement plusieurs centaines/milliers de documents PDF. Les documents originaux seront eux, inchangés.
Tout ceci se fera sous Linux. Amis windossiens, désolé, je ne peux rien pour vous….
Les outils
Il n’y a pas besoin de grand chose, juste d’un outil qui permet d’éditer les PDF en ligne de commandes et d’un script. Deux outils ont particulièrement attiré mon attention:
jPDFTweak
J’ai dans un premier temps essayé JPDFTweak. L’annonce comme couteau suisse du PDF est vraie. On peut faire plein de chose sur les PDF avec jPDFTweak et cela m’a convaincu. Un des avantage est que jPDFTweak propose une interface mais qu’il est également possible de le contrôler par lignes de commandes… Cependant, j’ai eu quelques soucis lors de la mise en place du script Bash. Je n’arrivai pas à naviguer comme je le souhaitais dans les répertoires… ce qui est un peu handicapant.
PDFTk
Dans un second temps j’ai découvert PDF Tool Kit (PDF tool kit qui n’est disponible qu’en ligne de commandes (ce qui dans mon cas est un avantage). Pour l’installation de PDFtk, on reste sur la solution habituelle:
sudo aptitude install pdftk
PDFsam
Je n’ai pas encore exploré toutes les capacités de PDFsam. La page web n’indique pas clairement cette possibilité. Ceci dit, je le lise… au cas où.
La préparation
Pour l’opération de ‘watermarquage’, PDFtk a besoin d’un PDF contenant le filigrane. il vous faut donc créer ce PDF. J’ai pour ma part créé celui-ci dans Gimp et enregistré directement en PDF.
En ce qui concerne l’organisation des données, il est préférable qu’il y ait un répertoire source de PDF. Il est possible d’organiser les PDF par répertoires, mais que ceux-ci aient à un moment un unique parent.
Enfin, plus par soucis de faciliter la vie, on supprimera les espaces ‘ ‘ dans les noms de fichiers et répertoires. Bash n’a pas trop l’air d’apprécier les espaces. Afin de faciliter cette démarche, le script remplacera dans un premier temps tous les espaces trouvés dans les noms de fichiers et de répertoires.
Le script
#! /bin/bash
#Ce script permet d'ajouter des watermark (stamp), defini par le PDF STAMP_PDF, à des PDF contenus dans le répertoire DIR_INPUT.
#Les PDFs modifiés sont stockés dans le répertoire DIR_OUT.
#Le stamp (watermark) est défini par STAMP_PDF
echo "##### Start job at `/bin/date` #####"
DIR_INPUT="/PDF_Originaux/"
DIR_OUT="/PDF_Modifies/"
STAMP_PDF="/PDF_Originaux/wm_output.pdf"
#on se déplace vers le répertoire des PDFs originaux.
cd ${DIR_INPUT}
#on renomme les fichiers et répertoire pour supprimer les espaces
find "${DIR_INPUT}" -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
#copie de l'architecture et des fichiers autres que PDF dans la destination
rsync -av --exclude '*.pdf*' ${DIR_INPUT} ${DIR_OUT}
#boucle sur les pdf en navigant répertoire par répertoire
#liste l'ensemble des répertoires
directory=$(find . -type d)
#parcours les répertoires
for d in ${directory}
do
#parcours des fichiers pdf
for arg in $d/*.pdf
do
#si le fichier existe déja, on passe (gain de temps)
#il pourrait être interressant de compléter l'analyse avec la prise en compte de la date
if [ -f ${DIR_OUT}${arg} ]; then
echo "\"${arg} \" File exist, skipped"
else
#Watermark du fichier PDF et enregistrement de celui-ci dans le répertoire destination
pdftk "${arg}" stamp ${STAMP_PDF} output ${DIR_OUT}${arg}
#teste si le fichier est créé, sinon on le copie
#Si le fichier n'existe pas, on le copie tel quel (il est certainement protégé par mot de passe,
#inutile de le watermarké)
if [ -f ${DIR_OUT}${arg} ]; then
echo "\"${arg}\" created"
else
echo "Did not find file \"${arg}\" -> copy the file"
cp "${arg}" "${DIR_OUT}${arg} ${arg}"
fi
fi
done
done
echo "##### job completed at `/bin/date` #####"
Pour mon cas, j’ai créé un répertoire PDF_Originaux (j’ai fait dans l’originalité). Ce répertoire contiendra toute l’architecture de répertoires, les documents PDF, mais aussi d’autres types de documents… L’ensemble du contenu du répertoire PDF_Originaux sera copié dans le répertoire de destination PDF_Modifies qui contiendra toute les données initiales (incluant les PDF modifiés). La copie des documents autres que les PDF s’effectue par une commande rsync. Si vous modifier l’organisation des répertoires dans le répertoire PDF_Originaux, ceux-ci seront répercutés dans le répertoire destination. Cependant, par sécurité, les suppressions de fichiers ou répertoires d’origines, ne sont pas répercutés dans le répertoire de destination (si besoin, voir les options de rsync). Une fois la synchronisation effectuée, on traite les PDF en parcourant les répertoires en utilisant pdftk.
En pratique
J’utilise pydio pour partager les documents. Le répertoire des PDF Originaux est partagé uniquement avec ceux qui doivent déposer des documents sur le serveur.
Le script est ensuite exécuté régulièrement (taches Cron), et les utilisateurs ont accès aux documents watermakés via l’interface de pydio. Pour l’ensemble des intervenants, le processus de watermarking est transparent.
Le script n’est pas parfait, loin de là. Mais il traite assez rapidement les centaine de PDF disponibles sur le serveur (environ une dizaine de minutes d’execution sur une machine qui n’est pas une bête de course).
Amélioration possible
Quelques améliorations sont encore faisables, notamment:
- Je souhaiterai que le nom, date… soient automatiquement incrustés dans le pdf lors du téléchargement. Un addon pydio devraient pouvoir le faire, mais je n’ai pas encore regardé cette option.
- Améliorer la copie: si un document est plus récent dans les originaux, il ne sera pas copié car il existe déjà dans le répertoire destination. Actuellement, il n’y a donc pas copie parfaire de la source. Dans notre cas, le risque est faible, car les documents évoluent peu.
- Éditer les metadata des PDFs afin de rajouter diverses informations (titres, origine,…).