Automatiser la mise en page d’un roman grâce à un script Python

Bonjour,

Je suis actuellement en train de corriger les derniers chapitres d’un roman intitulé  On ira tou·te·s au Paradis. Si vous cliquez sur ce lien, vous accédez à la page de présentation du roman, sur mon dépôt framagit. Cette présentation commence par un lien hypertexte qui vous conduira au roman en version PDF téléchargeable.

Bref, ce roman de SF sinistre comporte treize chapitres. Je suis en train de faire les dernières corrections du chapitre 9. J’écris les chapitres directement en version html dans l’éditeur de texte pluma, c’est-à-dire que je pose toutes les balises html. Voici donc à quoi ressemble la première page de présentation :

Selection_050

Et voici à quoi ressemble mon dossier On ira tou·te·s au paradis :

Selection_050

pandoc

Pour obtenir une version PDF de ces neuf chapitres avant que je rédige mon script Python, c’est bien simple, je devais d’abord convertir chacun de ces chapitres au format PDF grâce à pandoc, application qui s’utilise dans un terminal.

Voici donc la commande que je rentrais :

pandoc -s chapitre_1.html -f html -t latex -o chapitre_1.pdf

Décortiquons cette commande :

  • pandoc : commande principale qui ouvre le programme,
  • -s : spécifie le fichier source,
  • chapitre_1.html : nom du fichier à convertir,
  • f : spécifie le format du fichier d’origine, en l’occurrence html,
  • – t : spécifie le format de destination du fichier, en l’occurrence latex pour obtenir un fichier pdf,
  • – o : spécifie le nom du fichier de destination,
  • chapitre_1.pdf : nom du fichier de destination.

Source : https://doc.ubuntu-fr.org/pandoc

pdftk

Ensuite, lorsque j’avais accompli dix fois cette besogne ingrate, je devais concaténer tous ces fichiers pdf en un seul, grâce à l’outil pdftk. C’est un outil bien pratique et fort simple d’utilisation mais bien évidemment, plus on a de fichiers à concaténer, plus la commande est longue. Donc, voici ce que je rentrais dans un terminal :

pdftk README.pdf chapitre_1.pdf chapitre_2.pdf chapitre_3.pdf chapitre_4.pdf chapitre_5.pdf chapitre_6.pdf chapitre_7.pdf chapitre_8.pdf cat output on_ira_toutes_au_paradis.pdf

Là encore, décortiquons cette commande :

  • pdftk : commande principale qui démarre l’application et qui est suivie de tous les fichiers pdf à concasser,
  • cat : commande de concassage,
  • output : sortie suivie du nom du fichier final on_ira_toutes_au_paradis.pdf

Autant vous dire que tout ça me prenait un temps fou, surtout si je voulais absolument que la version pdf du roman soit toujours actualisée!

Le script d’automatisation rédigé en Python

Voici donc le script que j’ai rédigé et qui me permet d’automatiser tout ce travail en entrant une seule commande dans le terminal :

$ ~/automatisation.py

Je vous invite à cliquer sur l’image pour l’agrandir :

Selection_050

Je ne m’attarde pas sur les lignes de commentaires en gris. Vous les connaissez.

  • ligne n° 16 : importation du module os,
  • ligne n° 17 : je me place dans le répertoire où se trouvent mes fichiers html à convertir et à concaténer,
  • lignes n° 19 à 21 : je sélectionne et rassemble dans une liste, tous les fichiers portant l’extension html. Grâce à la méthode sort( ), je les trie de telle sorte que la liste commence par README.html et se termine par chapitre_9.hmtl (le dernier chapitre en cours de correction). Cette méthode est très pratique!
  • ligne n° 22 : grâce à une compréhension de liste et à la méthode os.system( ), j’exécute dans un terminal la commande pandoc qui me convertit tous mes fichiers html au format pdf.
  • lignes n° 24 à 26 : je sélectionne et rassemble dans une liste, tous les fichiers portant l’extension pdf sauf s’il commence par « on_ira ». Ça, c’est pour éviter de concaténer une version finale déjà présente avec une nouvelle version actualisée. Grâce à la méthode sort( ), je trie tout ça pour que la liste commence par README.pdf et se termine par chapitre _9.pdf (le dernier chapitre en cours de correction)
  • ligne n°28 : ensuite, je déclare une variable pdftk à laquelle j’affecte la chaîne de caractères « pdftk »,
  • lignes n°29 à 31 : grâce à une boucle, je rajoute chaque élément de la liste contenant les fichiers au format pdf. Puis je rajoute l’ultime commande « cat output … ». Au final, cette variable pdftk contient la chaîne de caractères suivante :

« pdftk README.pdf chapitre_1.pdf chapitre_2.pdf chapitre_3.pdf chapitre_4.pdf chapitre_5.pdf chapitre_6.pdf chapitre_7.pdf chapitre_8.pdf cat output on_ira_toutes_au_paradis.pdf »

  • ligne n° 32 : grâce à la méthode os.system( ), j’exécute la concaténation.

Lorsque j’exécute mon script en lançant la commande $ ~/automatisation.py, les fichiers pdf apparaissent petit à petit et se concatènent pour générer le fichier final on_ira_tous_au_paradis.pdf.

Alléluia!

Selection_050

Selection_050

Problèmes non résolus

  • Dans le fichier final concaténé, chaque chapitre commence par la page numéro 1, pas dans la colonne de gauche comme vous pouvez le constater sur la capture d’écran ci-dessus mais sur le papier! C’est-à-dire que si je me rends au chapitre 4 qui commence à la page n° 37, le pied de page porte le numéro 1! Est-ce que quelqu’un a une solution?
  • Autre bizarrerie pas bien grave mais énervante : si mon répertoire contient déjà des fichiers pdf et que je lance mon script, les noms des fichiers se retrouvent décalés! Ils ne correspondent plus au contenu! Par exemple chapitre_2.pdf contiendra le chapitre 3! Il me suffit de fermer mon gestionnaire de fichiers thunar puis de le réouvrir pour que tout rentre dans l’ordre. Là encore, je n’ai pas d’explication.

Je vous souhaite un bon weekend.

 

 

2 commentaires sur “Automatiser la mise en page d’un roman grâce à un script Python

Ajouter un commentaire

  1. Bonjour,

    c’est normale que la numérotation ne soit pas bonne sur les pages étant donné que chaque PDF est généré individuellement puis concaténé… J’ai fait rapidement un test en concaténant d’abord les pages HTML, puis en générant le PDF en utilisant Weasyprint, ce qui m’a donné le résultat suivant (en ajoutant 3 lignes de CSS) :

    https://nextcloud.flozz.org/s/eM7g5Ew8D57FAyt/download?path=%2F&files=output.pdf

    vous trouverez le script Python ainsi que le CSS ajouté ici:

    https://nextcloud.flozz.org/s/eM7g5Ew8D57FAyt

    Il faut bien sur apporter quelques amélioration (il manque une page de titre et je ne prend pas du tout en compte les fichiers LaTeX) dans mon exemple. 🙂

    Cordialement,

    J'aime

    1. Bonjour,

      Super! Merci beaucoup. Je vais regarder ça de plus près.

      En fait, après avoir écrit cet article et à cause de cette histoire de numérotation, j’ai commencé à m’intéresser au LaTex et j’ai formaté mes fichiers html en LaTex.

      C’est assez intéressant le LaTex. C’est un langage de description pas si difficile que ça à apprendre et il me semble qu’il y a beaucoup de petites astuces.

      Bref, j’ai édité un PDF dans un style machine à écrire :

      https://ordinosor.files.wordpress.com/2018/05/roman.pdf

      Mais ce style, je peux le changer très facilement.

      Le décalage des marges d’une page à l’autre (et aussi les numéros) me laisse à penser que le PDF est déjà configuré pour l’impression.

      Je vais regarder de suite votre script python.

      Cordialement,

      Benoît.

      J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

w

Connexion à %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Créez un site ou un blog sur WordPress.com

Retour en haut ↑

%d blogueurs aiment cette page :