Journal pdf2web-presenter : transformer une présentation PDF en diaporama web

Posté par  . Licence CC By‑SA.
Étiquettes :
10
18
avr.
2025

Présentation

pdf2web-presenter est un outil en ligne de commande permettant de convertir un fichier PDF (typiquement issu de LibreOffice Impress, PowerPoint ou autre) en un diaporama web autonome, lisible dans un navigateur moderne. L’objectif est de pouvoir présenter un diaporama depuis un navigateur local ou distant, sans connexion réseau et sans dépendance propriétaire. Il répond ainsi à la problématique de portabilité de présentation (workshop, obligation d'utilisation de powerpoint, …) et premet d'avoir une meilleur gestion des vidéos que le mode de présentation de libreoffice.

Le projet est conçu pour rester minimaliste, autonome et transparent.

Cas d’usage

On prépare une présentation dans un logiciel classique (LibreOffice Impress, Beamer, etc.) et on génère un PDF. Ce PDF peut contenir des vidéos embarquées (via LibreOffice par exemple).

Avec pdf2web-presenter, une seule commande permet de produire une version HTML interactive, incluant les vidéos, et navigable via clavier, souris ou écran tactile :

python3 main.py mon_fichier.pdf --codec=vp9 --scale-videos=70

Cela génère un dossier contenant :

  • Un fichier HTML autonome
  • Une feuille de style embarquée
  • Les pages du PDF sous forme de fichiers SVG vectoriels
  • Les vidéos extraites, converties si nécessaire

Le tout est statique, sans dépendance externe. On peut ouvrir le fichier HTML localement ou l’héberger (par exemple via un serveur web statique).

Pour les utilisateurs

  • Fonctionne avec Python 3 et ffmpeg
  • Nécessite soit PyMuPDF, soit pdf2svg pour extraire les pages
  • Produit une présentation lisible dans Firefox, Chromium, etc.
  • Aucune interface graphique : une commande suffit
  • Fonctionne entièrement hors ligne une fois généré

Navigation

  • flèches pour avancer/reculer début et fin
  • f : plein écran
  • m : vignettes de la présentation

Pour les utilisateurs avancés

Techniquement, le script :

  • Utilise PyMuPDF ou pdf2svg pour générer un SVG par page, avec rendu vectoriel (avantageux pour le zoom, la qualité, etc.)
  • Parcourt les annotations RichMedia du PDF pour identifier les flux vidéo encapsulés
  • Utilise ffmpeg pour extraire et re-encoder les vidéos :
    • Codec sélectionnable : h264, vp9, av1
    • Re-encodage optionnel (par défaut, il est évité si le format est déjà compatible)
    • Redimensionnement possible avec --scale-videos
  • Génère une structure HTML simple avec Swiper.js, sans dépendance (tout est embarqué)

L’objectif n’est pas de réimplémenter une solution complète de présentation (comme Reveal.js), mais de proposer un outil léger, reproductible et suffisamment souple pour des cas d’usage courants.

Embarqué dans une page web

La présentation est redimensionnable, ce qui doit lui permettre d'être embarquée dans une iframe permettant ainsi une réutilisation des présentations sur un site web de manière conviviale.

Licence, lien et contributions

Le code est disponible ici :

pdf2web-presenter

Licence : MIT.

Contributions et retours bienvenus. Code réalisé avec Gemini 2.5 pro et GPT 4.1

  • # poussez-nous ça en dépêche!

    Posté par  . Évalué à 3 (+1/-0). Dernière modification le 18 avril 2025 à 20:44.

    Mais, mais, mais sais-tu qu'on manque de dépêches ? et que ton projet super intéressant mérite plus de visibilité ?
    Si l'équipe de modération pouvait pousser ça en dépêche, ça serait cool.

    • [^] # Re: poussez-nous ça en dépêche!

      Posté par  . Évalué à 4 (+2/-0).

      et puis soyons exigeants: un ou deux exemples IRL pour qu'on puisse se faire une idée.

      Sinon, j'essayerais de tester ça sous peu.

      "Si tous les cons volaient, il ferait nuit" F. Dard

      • [^] # Re: poussez-nous ça en dépêche!

        Posté par  . Évalué à 7 (+5/-0). Dernière modification le 18 avril 2025 à 22:10.

        Bon, on va être tout à fait honnête ici, je n'ai pas proposé de dépêche, car je ne maîtrise pas les technologies web utilisées.

        J'ai prototypé la partie extraction binaire avec pikepdf et gemini 2.5 pro.
        J'ai prototypé la partie export des slides en svg avec pymupdf (fitz) et encore gemini 2.5 pro.

        Donc, là encore, c'est des format binaires, des MIME types, je sais où je vais.

        La partie la plus pénible fut probablement ffmpeg, je connais, mais les difficultés pour l'encodage hadware VPU étaient plus grandes que prévues et trouver les bonnes commandes a été un vrai supplice … Il m'a fallu 3 IA pour réussir à trouver la bonne stratégie …

        Bon le parti pris n'est pas parfait pour pouvoir utliser vaapi il faut pouvoir et décoder et encoder et pour se faire, je commence par transcoder les formats non pris en charge en MP4/H264 haut bitrate, qui est rapide CPU, avant d'envoyer sur av1 qui lui est rapide GPU/VPU.

        Là, je sais encore un peu ce que je fais, j'ai déjà galéré avec dans le passé.

        Là, où je ne maîtrise plus rien c'est sur la partie jinja2/DOM/CSS/JS. Je ne comprends absolument rien, je ne peux rien relire, et donc cette partie pourtant critique du projet est complètement au delà de mon champs d'analyse.

        J'ai vraiment lutté à l'aveugle en essai erreur, j'ai juste appris à utiliser la console JS des navigateurs pour remonter les erreurs à l'IA, mais c'est tout, c'est comme si j'avais délégué cette partie à un prestataire, ne rien me demander dessus hors le cahier des charges, je ne serais pas capable de répondre.

        Je viens juste de le mettre en ligne, il marche chez moi, mais il faudrait que je fasse le jeu de le tester sur un autre PC pour voir, si je n'ai pas oublié des dépendances ou autres joyeusetés.

        C'est pour cela que je trouve que c'est un peu prématuré pour ne dépêche !

        Si cela vous motive, vous pouvez tester, si cela ne fonctionne pas à cause de dépendances, je m'engage à faire ce qu'il faut pour améliorer les requirements et peut être rendre le README.md plus digeste, jusqu'à ce que ça fonctionne pour tout le monde.

        J'ai vu que le vibe-coding n'était pas vraiment en odeur de sainteté ici, du coup, le journal c'est bien.

        J'ai tout de même tenté le coup de le mettre sur github, car je pense que c'est un énorme manque et que cela peut aider des gens à avoir des présentations qui se passent mieux en étant sur Linux/LibreOffice, beamer, …

        Ça valait donc le coup, de mon point de vue.

        Je trouve que cela fait aussi un bon démonstrateur de ce que pourrait proposer LibreOffice s'ils le voulaient vraiment. Avec leur accès uno, ils pourraient en plus gérer les animations, ce qu'il faut faire en amont ici avec l'extensions "expand animation" qui demande un peu de re-travail (renumérotation manuelle des slides).

        Après tout les estimations de différents LLM sur le coût de ce projet fait par des professionnels se positionnent entre 13 et 20 k€, et cela m'a pris 6 jours, de mon temps libre, donc c'est plutôt intéressant, par contre, il n'y a pas de CI du tout, je ne sais pas vraiment faire et c'est trop de taf pour moi …

        Donc si on est exigent, il est clair qu'il ne faut pas en faire une dépêche, clairement pas, c'est prématuré, je n'ai pas envie de me faire mal-traiter ! C'était déjà assez osé de le proposer en journal, sachant que je ne peux pas répondre à toutes les questions qui seraient posées alors que je suis le seul développeur … On est dans un nouveau moment, ou peut être toutes cette prudence serait considérée comme complètement dépassée dans 1 à 2 ans, mais pas pour l'instant.

        En tout cas cela fait longtemps que je désirais cette fonctionnalité, pour mes présentations scientifiques et que je voulais pouvoir les mettre sur le site du labo, reste à voir si je peux mettre des Iframes dans leur TYPO3.

        En ce qui concerne les essais, je n'ai pas eu un seul échec, il y a un présentation sur le site, mais les autres que j'ai testées, je ne suis pas le seul auteur, et nous n'avons pas décidé de licences, donc pas pour l'instant.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.