Convertir une page web en document ODT, c'est maintenant possible

Posté par (page perso) . Modéré par Bruno Michel.
Tags :
29
12
avr.
2010
Bureautique
J'aimerais présenter ici un projet de développement personnel qui pourrait potentiellement intéresser beaucoup de monde : xhtml2odt. L'objectif de ce développement est, comme le nom l'indique, de convertir une page web en document ODT (OpenDocument).

Selon moi, le projet a atteint un état d'aboutissement qui le rend utilisable par d'autres, d'où cette annonce.
De plus, lors du récent salon Solutions Linux à Paris, j'en ai parlé avec des membres du projet OpenOffice.org sur leur stand, et l'un d'entre eux a dit que certains de ses collègues envisageaient de développer une fonctionnalité similaire. Dans le but d'éviter une duplication des efforts, j'aimerais faire connaître le projet par le biais de cet article, dont la deuxième partie présente les références et les aspects techniques.

NdM: Sous licence GPL2. XHTML2ODT est en fait une bibliothèque de conversion, qui est actuellement utilisée dans les grffons suivants :
Tout d'abord, la limitation principale : il n'est pas prévu de convertir le style complet de la page web dans le document, donc pas de rendu CSS ni de gestion de la balise "font".

Ce point ayant été abordé, la conversion est néanmoins assez fidèle tout en restant souple, car elle est basée sur deux aspects principaux :
  • La conversion du XHTML en OpenDocument grâce à des feuilles XSL ;
  • L'inclusion de ce XML dans un document ODT "modèle" qui pourra être personnalisé avec les styles désirés.

De cette façon, la gestion des styles se fait simplement en éditant le fichier ODT modèle, la conversion du XHTML essayant d'utiliser au maximum les styles prédéfinis dans OpenOffice. Les styles manquants seront ajoutés, avec un rendu par défaut proche de celui du navigateur.

Un des axes de développement étant de faire le maximum en XSL, le code à écrire pour utiliser cette bibliothèque reste léger. Il est donc relativement aisé de l'inclure dans des greffons d'export, quelque soit le langage. En effet, parmi les deux projets qui utilisent déjà xhtml2odt, l'un est en PHP et l'autre est en Python.
De plus, on peut trouver deux exemples de code dans les sources, sous la forme de scripts en ligne de commande. Là aussi, il y en a un en PHP et l'autre en Python.

Du point de vue de la qualité du code :
  • La grande majorité des éléments du XHTML 1.0 sont pris en compte et convertis ;
  • Le projet compte à l'heure actuelle 117 tests unitaires pour éviter les régressions futures ;
  • Les documents ODT produits passent les tests de validation avec succès ;
  • Le code XSL et celui des deux scripts-exemples fournis est largement commenté.


Il est intéressant de noter deux choses à propos de la conversion de XHTML vers ODT :
  • À ce jour, il n'existe pas à ma connaissance d'autre projet de conversion dans ce sens, alors que les programmes permettant de faire l'inverse sont nombreux ;
  • La fondation OpenDocument Fellowship a proposé un prix de 11 500 dollars à qui réaliserait un export parfait de HTML vers ODT. Je n'ai pas les compétences pour participer à ce concours, mais si quelqu'un veut s'appuyer sur xhtml2odt pour le réaliser, qu'il n'hésite pas !


Ce dont le projet aurait maintenant besoin pour avancer serait que le code soit utilisé pour d'autres greffons d'export. Le premier qui me vient à l'esprit serait un greffon d'export ODT pour Wordpress.
Je suis aussi évidemment intéressé par les bugs qui seraient découverts dans la conversion ou les scripts fournis, ainsi que par toute contribution. Mon objectif avoué étant tout simplement de populariser au maximum le format OpenDocument.
  • # Pourquoi ?

    Posté par . Évalué à 8.

    C'est peut-être une question con, mais pourquoi ce besoin de transformer du html en odt ?

    De odt vers html, je peux comprendre : on fait un document, puis on le publie sur le net.
    Dans l'autre sens, je ne vois pas trop, des exemples ?
    • [^] # Re: Pourquoi ?

      Posté par (page perso) . Évalué à 10.

      Moi j'en vois un. Un site publie des articles...on a envie de les garder comme des documents ou d'en inclure un ou deux dans des documents existants. Dans ce cas, cet export est utile. On voit qu'il existe deux greffons pour DotClear et Trac, deux frameworks utilisés pour poster des articles/documentation. Ça pourrait être utile pour les wiki (mediawiki, dokuwiki, ...) également.
      Sur un wiki il est facile de travailler à plusieurs et d'avoir un historique des changements. Lorsqu'on le souhaite on peut demander un export vers un format bureautique ouvert. Et utiliser l'XHTML directement permet d'avoir une librairie généralisée, sans ajout de code compliqué au code du wiki et où une correction de bug dans la librairie se répercute automatiquement sur tous.
      • [^] # Re: Pourquoi ?

        Posté par (page perso) . Évalué à 6.

        Pile poil. Au passage, c'est aussi moi qui ai fait l'export ODT pour Dokuwiki, mais ce plugin-là n'utilise pas xhtml2odt parce que Dokuwiki a sa propre API.

        L'idée, dans le cas d'un wiki comme Doku ou Trac, est d'écrire sa doc dedans, en collaboratif, et de produire ensuite un document ODT au format de la société ou de l'association pour l'envoyer à l'extérieur.

        Dans le cas de Dotclear, ça peut être intéressant pour archiver son blog. J'ai même une personne assez connue de la communauté qui m'a demandé si ça pourrait marcher sur son blog qui a plus de 2000 articles, car il voudrait le publier sur La Poule ou l'Œuf.
    • [^] # Re: Pourquoi ?

      Posté par . Évalué à 5.

      Au hasard : créer des ODT depuis une interface web facilement ?
      • [^] # Re: Pourquoi ?

        Posté par (page perso) . Évalué à 4.

        oui, voilà.

        Exemple: Sur un serveur d'entreprise, tu crées une base de données avec liste de produits, adresse clients etc…
        suffit alors de quelques click pour générer un document type devis, lettre type etc… qu'on peut ensuite retoquer sous OOo.

        J'ai précisémment besoin d'un truc comme ça, tiens….
        • [^] # Re: Pourquoi ?

          Posté par . Évalué à 3.

          J'utiliserais plutôt un truc du style [http://www.odtphp.com/] pour ton besoin.
          • [^] # Re: Pourquoi ?

            Posté par . Évalué à 3.

            En effet, pour ce besoin précis, odtphp est tout aussi indiqué, tout dépend ensuite des données à gérer, de la finalité de l'export...
      • [^] # Re: Pourquoi ?

        Posté par . Évalué à 3.

        Exemple déjà en application: la version française de Wikipedia propose la création de ''livres'' à partir d'articles du site.
        En gros on sélectionne différents articles, dont on peut régler l'ordre d'apparition dans le futur livre. Une fois cette sélection faite, on peut obtenir une sortie au choix au format pdf, ou au format odt.

        J'ignore ce qu'ils utilisent pour la conversion html vers ODT.
        Quand j'avais essayé, la version odt comportait parfois des problèmes de mise en page. Mais sinon, j'avais trouvé la fonctionnalité assez intéressante.
    • [^] # Re: Pourquoi ?

      Posté par . Évalué à 2.

      Pour faciliter le travail entre différents services ou avec tes clients.
      Tu es dans une équipe et vous avez un wiki interne.
      Avec xhtml2odt, on peut imaginer faciliter la production de livrables
      (en tout cas sur la forme ;-) ).
      Ça peut aussi aider à convaincre les gens d'utiliser le wiki aussi :
      « regarde, tu fais pas le travail deux fois, tes documents/livrables (de la méthode machin/UP/RUP/RIP) sont produits automatiquement ! »
      • [^] # Re: Pourquoi ?

        Posté par (page perso) . Évalué à 2.

        Yep exactement.

        Perso chez nous on utilise un wiki2odt pour produire les docs commerciaux en réutilisant au maximum l'information et en pouvant travailler à plusieurs, voir les pages à relire etc.... (cf aussi ma note sur le projet lpod plus bas).
        • [^] # Re: Pourquoi ?

          Posté par . Évalué à 1.

          Bonjour,
          Dans le milieu universitaire (et plus largement d'enseignement), module qui s'annonce extrêmement pratique. Je travaille très régulièrement à partir d'articles de presse. Allez donc reformater une page copiée-collée de n'importe quel journal en ligne, vous verrez assez vite l'énorme intérêt de ce script!

          Pour illustrer cela, faite un petit essai dans vos journaux en ligne favoris. En général, pour chaque article, vous avez la possibilité d'imprimer. Vous obtenez donc une version imprimable... mais avec de nombreux cadres. Deux options: faute de temps (souvent): impression dans un fichier PDF, et ensuite c'est la galère pour la mise en page dans des dossiers à distribuer aux étudiants. Ou bien le copier-coller dans OOo, et là... pfff, il faut supprimer les cadres, appliquer des styles qui mettent le texte n'importe où, on obtient des lignes non justifiées, parfois l'ensemble du texte n'apparaît pas...

          Bref, merci de cette proposition que je vais suivre de très près!
          Bonne continuation!
          • [^] # Re: Pourquoi ?

            Posté par . Évalué à 1.

            Dans OOo: Ctrl-Shift-v (Collage spécial) puis texte seul ?
  • # démo

    Posté par . Évalué à 2.

    est-ce qu'il y a un site sur lequel on peut tester la fonctionnalité pour avoir une idée du résultat ?
  • # Licence

    Posté par (page perso) . Évalué à 5.

    J'aimerais apporter une précision sur la licence : c'est GPL v2 ou ultérieure. Dans un souci de compatibilité maximale.
    • [^] # Re: Licence

      Posté par (page perso) . Évalué à 7.

      J'en profite pour ajouter que je ne suis pas opposé à un changement de licence si c'est vraiment nécessaire, tant qu'il s'agit d'une licence libre copyleft. Je veux bien aller jusqu'à la LGPL si ça peut aider un projet important à exporter en ODT.
      • [^] # Re: Licence

        Posté par (page perso) . Évalué à 7.

        Je plussoie pour l'ouverture d'esprit :)
      • [^] # Re: Licence

        Posté par . Évalué à -1.

        Si ta vraie préoccupation, c'est que ODT soit utilisé, utilise du BSDlike qui permettra une utilisation moins contrainte. La valeur, c'est ODT, pas ton script qui est recodé en 5 jours par un dev motivé.

        Maintenant, si tu penses que tu auras des patchs intéressants, reste dans du (L)GPL mais j'ai des doutes :)
        • [^] # Re: Licence

          Posté par (page perso) . Évalué à 4.

          > La valeur, c'est ODT, pas ton script qui est recodé en 5 jours par un dev motivé.

          Marrant comme méthode de persuasion. Je suis pas sûr que ce soit toujours très efficace.

          Je pense que le copyleft a pas mal d'intérêts, donc je vais rester en (L)GPL. Par contre, je reconnais que plus j'y réfléchis, plus je trouve que la LGPL est plus pertinente que la GPL pour le projet dont il s'agit ici.

          À voir, peut-être que je changerais dans le futur, si il y a un réel besoin. En attendant, xhtml2odt reste GPLv2+.
          • [^] # Re: Licence

            Posté par (page perso) . Évalué à 1.

            BSD c'est du "copyleft".

            "It was a bright cold day in April, and the clocks were striking thirteen" - Georges Orwell

          • [^] # Re: Licence

            Posté par . Évalué à -1.

            >>> Marrant comme méthode de persuasion

            Ca n'a rien à voir avec de la persuasion, il faut arrêtez la parano que ton script reste en GPL ou pas, ca n'a aucune importance pour moi. Je n'ai jamais demandé que tu utilises la BSD.

            J'émettais justes quelques commentaires sur la dépêche (comme le permet le système DLFP):

            - Que le dév, même s'il reste intéressant pour un besoin très spécifique, n'est quand même pas énorme. Ce n'est pas un gros logiciel.

            - Que tu n'auras probablement pas beaucoup de patch externe,

            - Que dans ce genre de script, la BSD est une licence très valable qui donne plus de liberté, (comme permettre l'inclusion de la lib dans un logiciel à source privée, ce qui aurait comme conséquence de mettre à disposition plus d'ODT, ce qui est aussi important qu'un éventuel patch)

            Maintenant, l'attitude que tu as de dire :"je verrouille en GPL, on verra s'il y a une demande" est parfaitement valable.

            Perso, je publie ce genre de script en WTFPL http://sam.zoy.org/wtfpl/
  • # Autre utilitaire comparable

    Posté par . Évalué à 2.

    À ma connaissance, il existait déjà un utilitaire effectuant cette conversion: Pandoc

    http://johnmacfarlane.net/pandoc/

    Mais la conversion vers l'ODT n'est apparue que sur une version récente. Je n'ai donc jamais testé cette fonctionnalité, je n'en ai d'ailleurs pas l'utilité, je me sers essentiellement de markdown2pdf, que je trouve fabuleux comme moyen de créer des documents impeccables à partir d'un éditeur de texte.

    Et il y a aussi un script html2markdown qui permet de récupérer des pages web, mais le résultat est assez variable.

    http://www.k1ka.be/desidia/?2009-11-01_Conversion_entre_form(...)
    • [^] # Re: Autre utilitaire comparable

      Posté par (page perso) . Évalué à 1.

      Pandoc est très intéressant, je ne connaissais pas.

      Par contre, vu que c'est un exécutable Haskell, c'est plus difficilement intégrable dans un plugin d'export pour une appli web qu'une feuille de style XSL. Différents usages, donc.
      • [^] # Re: Autre utilitaire comparable

        Posté par . Évalué à 2.

        C'est en effet le seul regret que j'ai vis-à-vis à ce programme, d'être écrit dans ce langage de bantou :) qui a pour effet de décourager les extensions que son architecture autorise pourtant.
  • # Bravo

    Posté par . Évalué à 3.

    Bonjour,

    bravo pour cette idée et cette réalisation. Ca a le mérite d'être original.
  • # Merci

    Posté par . Évalué à 3.

    Merci beaucoup pour cette contribution, que je viens d'utiliser.

    Ca marche impec, un grand merci :) !
  • # Dépendance PHP 5.3

    Posté par (page perso) . Évalué à 2.

    On vient de me prévenir que le script PHP a une bête dépendance sur PHP 5.3 à cause de getopt, le module de lecture des arguments de la ligne de commande. C'est une erreur que je vais corriger très rapidement, en attendant utilisez plutôt le script python pour tester.
    Merci !
  • # Il semble que tu savais que ça existait pour Spip depuis quelque temps

    Posté par . Évalué à 2.

    À ce jour, il n'existe pas à ma connaissance d'autre projet de conversion dans ce sens, alors que les programmes permettant de faire l'inverse sont nombreux ;

    Heu... ? Sur une des listes de diffusion destinées à Spip, ici: http://www.mail-archive.com/spip-zone@rezo.net/msg07222.html tu présentais en février un plugin similaire. On te répondait que ça existait déjà pour Spip depuis quelque temps... Tu reconnaissais que l'autre plugin était plus intéressant...

    Pourquoi alors nous dis-tu que tu ne connais pas d'autre projet qui fait ça ?

    Je suis un peu supris.
  • # Corrections

    Posté par (page perso) . Évalué à 2.

    Depuis hier, j'ai fait un certain nombre de corrections dans les scripts fournis (Python et PHP), principalement pour la compatibilité avec des versions plus anciennes des interpréteurs et des bibliothèques.

    Donc si vous avez testé hier et que ça vous a explosé dans les doigts, c'est le moment de retester !

    Je rappelle qu'on peut récupérer un .tar.gz des sources par ce lien : http://gitorious.org/xhtml2odt/xhtml2odt/archive-tarball/mas(...) (pour ceux qui ne connaîtraient pas par coeur les méandres de Gitorious, et qui ne voudraient pas utiliser Git)

    Merci pour les encouragements, ça fait très plaisir.
  • # Projet lpod

    Posté par (page perso) . Évalué à 3.

    Un sujet connexe (mais pas équivalent) c'est le projet lpod : http://lpod-project.org qui a pour but de réaliser une API de haut niveau pour créer des documents ODF (donc aussi ODT) dans différents langages.

    À itaapy nous y participons pour le langage Python qui est l'implémentation la plus avancée pour le moment. Cf. http://www.itaapy.com/nos-solutions/recherche/lpod

    Je remarque d'ailleurs qu'on a fait un rst2odt qui transforme le reStructuredText mais pas de xhtml2odt !

    Nous avons également fait un wiki qui s'exporte en fichier odt, soit une seule page, soit un plan de pages. Release prévue cette semaine.sur http://hforge.org
    • [^] # Re: Projet lpod

      Posté par (page perso) . Évalué à 2.

      Lpod est manifestement très intéressant et mériterait plus de visibilité. Si le code de xhtml2odt peut vous aider, n'hésitez pas (il me semble que les licences sont compatibles puisque vous êtes en GPLv3).

      C'est vrai qu'on manque d'une bonne API de haut niveau sur le format OpenDocument, je vous souhaite donc tout le succès possible !

Suivre le flux des commentaires

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