grimboite/articles/dev/python-pdf-toussa.md

2.5 KiB

Python, PDF, tout ça

Reportlab sphinx, weasyprint, markdown, pdfkit, pandoc.

L'idée de base semblait simple: proposer un système de gestion documentaire inline, avec un mécanisme de conversion du contenu en PDF après validation et approbation.

Le problème provient de la conversion en PDF, justement... A la base, je partais sur un flux type "rédaction et envoi du fichier via webdav". La conversion serait passée par l'interface en console de LibreOffice via un popen en python. Après quoi, je me suis dit que cela n'offrait finalement aucune maîtrise sur le contenu souhaité par le gestionnaire: s'il souhaite une structure de document séparée en X sections, comment s'assurer que les rédacteurs ne feront pas une petite modification? Ou que le numéro de version sera bien conservé au bon endroit dans le template? On peut pas.

-> idée de fixer la structure des documents en DB. Chaque rédacteur pourrait ainsi rédiger le contenu de chaque section, sans possibilité de modifier la structure réelle du document... Restait alors à choisir une syntaxe compréhensible, extensible et facile à apprendre/comprendre pour des non-initiés... Markdown?

-> chaque section reprendrait du coup un ensemble de métadonnées obligatoires ou facultatives ; le rédacteur s'occupe de rédiger le contenu en MD, et le système s'occupe de la conversion à la volée quand c'est nécessaire.

A la base, né mroeintais vers reportlab. Le problème est que la lib markdown python ne permet que de convertir du contenu vers de l'HTML. Bof bof, sauf à rentrer dans le code.

Seconde possibilité : pandoc. Mais pandoc dépend énormément de l'installation de Latex ewistante.

Je suis tombé sur weasuprint, qui permettrait de convertir du HTML en y ajoutant un fichier CSS. Plutôt élégant :-)

Allez, un peu de code pour valider le fonctionnement de ce brol.

[TOC] en markdown

https://python-markdown.github.io/extensions/toc/

Du coup, il manque malgré tout les numéros de page dans le document. Une idée serait de passer malgré tout par LateX (https://superuser.com/questions/601654/generate-document-with-table-of-contents-containing-page-numbers-using-markdown). Où, toujours avec Pandoc, on peut dégager LatEx en passant par wkhtmltopdf. Par exemple:

(-Alternatively, pandoc can use ConTeXt, wkhtmltopdf, or -pdfroff to create a PDF. To do this, specify an output file -with a .pdf extension, as before, but add -t context, -t -html5, or -t ms to the command line.)