Remettre les pages d'un PDF dans l'ordre

Je viens de scanner un document imprimé en brochure/booklet après l’avoir dégrafé. C’est pratique, ça permet d’utiliser le chargeur automatique du scanner. Mais cela veut dire que sur chaque page scannée j’ai en réalité 2 pages, et dans un ordre assez bizarre: 8 et 9, 10 et 7, etc. Comment les remettre dans l’ordre ?

Numérologie

D’abord, on constate qu’avec 2 pages par scan, le nombre de pages est un multiple de 2. Écrivons-le 2n.

On a les pages 1 à n dans la première moitié de la brochure, et les pages n+1 à 2n dans la seconde moitié. Ce qui veut dire que sur la première page scannée, on a les pages n (à gauche) et n+1 (à droite).

Au verso, c’est-à-dire sur la deuxième page scannée, on a les pages n-1 et n+2. Et ainsi de suite jusqu’à la nième page scannée, la couverture, où l’on a les pages 1 et 2n.

Numérotation d'une brochure

À l’inverse, la page 1 est à droite du scan n, la page 2 à gauche du scan n-1, la page 3 à droite du scan n-2, … la page n à gauche du scan 1, la page n+1 à droite du scan 1, etc.

Mise en pratique

Vous aurez besoin d’avoir installé ImageMagick, Ghostscript (version 32 bits), et Cygwin si vous êtes sous Windows. Vous aurez également besoin des utilitaires pdfimages et jpegtran :

Après ces préliminaires, si l’on a un doc.pdf de 8 scans (16 pages à la fin) :

  1. On extrait les images du PDF :

    $ pdfimages -j doc.pdf doc
    
    Cela crée des fichiers doc-0000.jpg à doc-0007.jpg.
    Si l’on a besoin de retourner 1 page sur 2 : for i in {01..07..2};do exiftran -i1 doc-00$i.jpg;done

  2. On splitte chaque scan en 2 pages distinctes (-rotate 90 tourne la page de 90° horaires avant de la couper en 2 ; le retirer si l’orientation est déjà bonne) :

    $ for i in doc-*.jpg; do convert -quality 95 -rotate 90 -crop 50%x0 "$i" "$i" && rm "$i";done
    
    Cela remplace doc-0000.jpg par doc-0000-0.jpg (page de gauche) et doc-0000-1.jpg (page de droite), etc.

  3. Si une page est à l’envers (p.ex. dernière page d’une brochure au format paysage) on la retourne :

    $ i=doc-0007-0.jpg; jpegtran -rotate 180 $i $i
    

  4. Puis on génère la liste des scans à prendre pour remettre les pages dans l’ordre :

    $ pages=`python3 -c 'n=8; print(" ".join(f"doc-{(k-n if k>n else n-k+1)-1:04d}-{k%2}.jpg" for k in range(1, n*2+1)))'`; echo $pages
    doc-0007-1.jpg doc-0006-0.jpg doc-0005-1.jpg doc-0004-0.jpg doc-0003-1.jpg doc-0002-0.jpg doc-0001-1.jpg doc-0000-0.jpg doc-0000-1.jpg doc-0001-0.jpg doc-0002-1.jpg doc-0003-0.jpg doc-0004-1.jpg doc-0005-0.jpg doc-0006-1.jpg doc-0007-0.jpg
    
    Si on a scanné dans l’autre sens et qu’on a les pages 2n et 1 sur le scan 1, puis 2 et 2n-1, etc. jusqu’à n et n+1 sur le scan n :
    $ pages=`python3 -c 'n=8; print(" ".join(f"doc-{(n*2+1-k if k>n else k)-1:04d}-{k%2}.jpg" for k in range(1, n*2+1)))'`; echo $pages
    doc-0000-1.jpg doc-0001-0.jpg doc-0002-1.jpg doc-0003-0.jpg doc-0004-1.jpg doc-0005-0.jpg doc-0006-1.jpg doc-0007-0.jpg doc-0007-1.jpg doc-0006-0.jpg doc-0005-1.jpg doc-0004-0.jpg doc-0003-1.jpg doc-0002-0.jpg doc-0001-1.jpg doc-0000-0.jpg
    

  5. Enfin on construit le PDF final (-density 300 correspond à la résolution du scan, 300 dpi) et après vérification on fait le ménage :

    $ convert -density 300 -quality 80 $pages out.pdf
    $ rm *jpg
    

Cet article publié en août 2015 a été mis à jour.

En lire plus sur : cygwin , linux , maths