Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

Il vous est peut-être déjà arrivé de vous retrouver avec une collection d'images pleine page – par exemple issues d'un scan – et de souhaiter les (ré)assembler en un seul document PDF.

La solution réside dans l'utilitaire convert de la suite de logiciels ImageMagick. En deux mots, ImageMagick est un ensemble d'outils en ligne de commande (donc sans interface graphique) destinés à manipuler des images. Et, parmi tous ces utilitaires, convert est chargé de la conversion d'un format de fichier graphique à l'autre. Ainsi, convert peut être utilisé pour convertir des PNG en JPEG, des GIF en TIFF, ou n'importe quelle autre combinaison parmi une centaine de formats différents.

Remarque:

Cette définition de convert est très réductrice, puisque ce programme peut aussi redimentionner, ré-échantillonner, recadrer, flouter et modifier de bien d'autres manières encore une image. Mais ici, nous nous contenterons d'utiliser sa fonctionnalité de base, à savoir convertir d'un format à un autre...

Parmi les nombreux formats de fichiers manipulables par convert, certains ont des caractéristiques particulières. Comme la possibilité d'incorporer plusieurs images dans un seul fichier. C'est le cas du format GIF – ce qui permet de créer des GIFs animés. C'est aussi le cas du format PDF, ce qui va nous permettre ici de créer un PDF dont chaque page sera constituée d'une image.

Installation

Sous Debian vous aurez besoin du paquet imagemagick pour ce qui suit. Si ce logiciel n'est pas déjà sur votre machine utilisez le gestionnaire de paquets de votre distribution pour procéder à l'installation.

sh# apt-get install imagemagick

En supposant que les fichiers à assembler soient 3 PNG dans le répertoire courant, la commande suivante fera l'affaire:

sh$ convert fichier1.png fichier2.png fichier3.png destination.pdf

Une fois que la commande aura achevé son travail, le fichier destination.pdf contiendra un document PDF de 3 pages: une pour chaque fichier PNG. Selon la résolution de vos images et la puissance de votre machine, l'opération peut prendre du temps et consommer pendant son exécution une partie importante des ressources (mémoire, temps processeur) de votre ordinateur.

Erreur (14): PDF corrompu?

La version d'ImageMagick disponible sous Lenny comporte au moins un bug relatif à la génération de PDF [1].

Concrètement, quand j'ai testé la manipulation décrite ici avec cette version, le PDF produit pouvait être relu sous Debian avec evince, mais sous Windows, Acrobat Reader refusait de l'ouvrir en signalant une obscure « Erreur (14) ». Celle-ci signifie que le PDF est corrompu: soit endommagé pendant son transfert, soit, comme c'est plutôt le cas ici, que son contenu ne respecte pas rigoureusement les contraintes du format PDF.

La solution ici a été d'installer la version d'ImageMagick disponible dans Squeeze.

Si vous voulez assembler toutes les images d'un dossier dans un PDF, la commande peut s'abréger ainsi:

sh$ convert *.png destiantion.pdf

Piège:

Si vous êtes familier du shell, vous savez que l'étoile (*) sert de joker. Et que *.png veut dire « tous les fichiers se terminant par .png ».

Ce que vous ne savez peut-être pas, c'est que la liste des fichiers auxquels correspond le joker est triée dans l'ordre lexicographique (l'ordre du dictionnaire). Autrement dit, si vous avez 10 fichiers appelés fichier1.png à fichier10.png, l'ordre ne sera pas celui que vous souhaitez. On peut le vérifier avec la commande ls:

sh$ ls -1 *.png
fichier10.png
fichier1.png
fichier2.png
fichier3.png
fichier4.png
fichier5.png
fichier6.png
fichier7.png
fichier8.png
fichier9.png

Surprise! fichier10.png arrive avant tous les autres – et pas après comme souhaité. L'explication est que pour trier, le shell compare caractère par caractère. Sur cette base, fichier1.png et fichier10.png commencent tous deux par fichier1. Ce qui les place – dans l'ordre lexicographique – en tête de liste!

La solution est de compléter les nombres avec des zéros (0) pour que tous soient écrits avec autant de chiffres:

sh$ ls -1 *.png
fichier01.png
fichier02.png
fichier03.png
fichier04.png
fichier05.png
fichier06.png
fichier07.png
fichier08.png
fichier09.png
fichier10.png

Magique! Les fichiers sont maintenant dans le bon ordre. C'est d'ailleurs un truc abondamment utilisé dans le monde Unix/Linux pour forcer l'ordre des fichiers dans un répertoire.

Références