Sauvegarde d'un blog en PDF
Il y a quelques années, j'ai arrêté d'alimenter un de mes blogs. Je ne voulais pas en perdre le contenu donc j'ai continuer à l'héberger en attendant de trouver une solution pour le sauvegarder de manière efficace. Mon idée était de pouvoir le sauvegarder en PDF.
Le blog étant propulsé par Dotclear, ma première idée fut d'installer une extension qui génère directement du ePub depuis l'interface de navigation. Malheureusement, je n'ai jamais réussi à le faire fonctionner correctement.
De plus, je n'étais pas sur de pouvoir faire autrement que de générer un fichier par message. Ce n'était pas un blog très fourni, mais ça aurait quand même fait pas loin de 200 fichiers, ce qui n'est pas franchement utilisable. Surtout si la chronologie des messages a son importance.
Ce projet est resté longtemps au stade de l'idée jusqu'au jour où je me suis dit que je pouvais utiliser Pandoc. C'est un logiciel de conversion de document numérique. La liste des types de fichier qu'il supporte aussi bien en entrée qu'en sortie est impressionnante. Mais le point le plus intéressant dans mon cas, est le support du HTML en entrée et du PDF en sortie.
J'ai fait un premier test assez concluant sur une page malgré la quantité d'information superflue récupérée. Il fallait que je nettoie l'information pour ne garder que ce qui était pertinent. Ma première idée fut de convertir plutôt en TeX et d'écrire un script de nettoyage. Idée rapidement abandonnée après avoir vu la complexité du document TeX généré. Après avoir lu la documentation de Pandoc, ma seconde idée fut d'utiliser un filtre qui ferait du nettoyage entre la conversion d'entrée et la conversion de sortie. Idée également abandonnée après avoir vu la complexité du format de travail de Pandoc. Ma troisième idée fut de modifier le modèle d'affichage du blog directement dans Dotclear pour avoir des données nettoyées avant même de les utiliser avec Pandoc.
Je suis resté sur cette idée car elle est facile à mettre en place et très souple. Ça ne fonctionne que parce que j'ai la main sur le blog que je voulais sauvegarder. Dans un cas où ce n'est pas possible, il faudrait trouver un autre moyen.
Ensuite il a fallu récupérer les URLs de chaque message pour pouvoir les télécharger. Ma première idée fut d'utiliser wget pour naviguer à travers le blog et faire l'extraction. Cette solution est faisable mais pas la plus pratique. Ma seconde idée fut d'utiliser le plan du site1).
Je suis resté sur cette idée car elle est très facile à mettre en place grâce à l'extension de Dotclear. Par contre, le fichier généré étant du XML, il aurait fallu écrire un bout de code pour en extraire les URLs. Mais comme ce fichier est aussi généré avec un modèle, je l'ai également modifié pour ne conserver que la partie intéressante.
Il a fallu retravailler certains messages directement dans l'interface d'administration du blog pour que le contenu généré corresponde à ce que je voulais. Ça a pris un peu de temps, mais beaucoup moins que de modifier la sortie ou d'écrire un filtre.
Voici les quelques commandes utilisées lors de ce projet :
- Récupération des URLs
# Version courte wget http://www.blog.org/index.php/sitemap.xml -O URL.List # Version longue wget http://www.blog.org/index.php/sitemap.xml --output-document URL.List
- Récupération du contenu
# Version courte wget -i URL.List -k -p -E # Version longue wget --input-file URL.List --convert-links --page-requisites --adjust-extension
- Concaténation du contenu
find www.blog.org/ -name \*html | sort | xargs cat > blog.html
- Conversion du contenu
# Version courte pandoc blog.html -f html -t latex --toc -V geometry:margin=2cm -V papersize:A4 -o blog.pdf # Version longue pandoc blog.html --from html --to latex --table-of-contents --variable geometry:margin=2cm --variable papersize:A4 --output blog.pdf
Le résultat obtenu est bon, même s'il reste perfectible. Par exemple, la table des matière n'est pas en français et les photos prennent trop de place à mon goût.