odt2spip : création d’articles à partir de fichiers OpenOffice Writer

Ce plugin permet de générer un article SPIP à partir du téléchargement d’un fichier au format .ODT (OpenOffice ou LibreOffice Writer). Il gère la majorité des raccourcis typographiques, détecte les différents niveaux de titre et fait l’intégration des images automatiquement.

Voir aussi la documentation de la version 3
odt2spip v3+ : création d’articles à partir de fichiers textes

Important :
La transformation des fichiers ODT impose que l’extension XSL de PHP soit active sur le serveur web

Installation

  • téléchargez le zip du plugin correspondant à votre version de SPIP
  • pour l’installation et l’activation, suivez la procédure standard : cf la documentation officielle

Utilisation

Rien que de très simple : une fois le plugin activé, dans la page de gestion d’une rubrique vous trouverez une boite de dialogue qui permet de choisir le fichier à télécharger depuis votre ordinateur : « Créer un article à partir d’un fichier ODT ».

De la même manière, si vous souhaitez remplacer le contenu d’un article existant par celui d’un fichier odt, dans les pages des articles vous trouverez la boite de dialogue « Remplacer l’article par le contenu d’un fichier ODT ».

Une fois validé l’article est automatiquement créé avec le statut « proposé à la publication », si nécessaire le fichier ODT original est attaché comme document à l’article et le plugin vous bascule sur la page de cet article.

La transformation opérée par le plugin

Ce plugin ne fait qu’une transformation du contenu du fichier en code SPIP : il n’assure aucun miracle si votre fichier initial est construit de façon non-conforme aux règles de l’utilisation d’un traitement de texte et ne fera rien que vous ne puissiez reproduire avec les raccourcis typographiques de SPIP...

Un exemple de page générée à partir d’un fichier « type » : http://tice.espe.univ-amu.fr/demo/s...

Plus de précisions :

  • il est nécessaire d’avoir utilisé les styles pour définir les titres dans le fichier OpenOffice si vous voulez que le plugin les détecte. La conversion se fait selon les règles suivante (que les puristes passent leur chemin, il n’y a ici aucun respect des aspects sémantiques habituellement liés à l’utilisation des raccourcis typographiques !) :

    • si il existe au moins un paragraphe avec le style Titre, son contenu est utilisé pour générer le titre de l’article. Sinon c’est le Titre de niveau le plus important qui est utilisé : Titre 1 > Titre 2 > Titre 3... .
    • Le premier niveau de Titres est transformé en intertitres SPIP {{{Titre niveau 1 intertitre}}}(si Titre 1 n’existe pas, Titre 2 est utilisé à sa place, Titre 3 à la place de Titre 2, et ainsi de suite)
    • le deuxième niveau est mis en gras et séparé du restant par des sauts de lignes {{Titre niveau 2 en gras}}
    • tous les autres niveaux de titre sont passés en italique et séparés par des sauts de ligne {Titres de niveau 3, 4, 5... en italique}
  • si d’aventure vous aviez décidé d’utiliser le plugin Enluminure typographique ou le plugin Intertitres hiérarchisés qui définissent et utilisent des niveaux de titres supplémentaires (vade retro satanas !), odt2spip détecte leur présence et, automatiquement, utilise les raccourcis « enrichis » tels que {2{titre niveau deux}2} ou {4{titre niveau quatre}4} (ces raccourcis sont interprétés par ces 2 plugins).
  • Le plugin récupère les images intégrées dans le fichier d’origine à condition qu’elles soient au format jpg ou png ou gif (n’espérez rien si vous avez des fichier BMP ou TIFF intégrés !), les retaille pour approximer du mieux possible la taille qu’elles avaient dans le texte, les intègre comme documents SPIP et les place avec un raccourci de la forme <imgXXX|left> ou <imgXXX|right> ou <imgXXX|center> en fonction de la position à laquelle se trouvait l’image dans le texte d’origine.
    Attention ! pour que cette fonctionnalité soit opérationnelle, il faut que les images aient été intégrées dans le texte en utilisant les fonctions d’insertion d’image (menu « Insertion » > « Image » > « A partir d’un fichier... ») et non pas via un copié/collé du contenu de l’image dans le texte (qui génère un bitmap non récupérable).
  • Les formules mathématiques (rédigées à l’aide de l’éditeur d’équation natif d’OOo Writer ou des outils complémentaires tels l’excellent Cmath) sont en principe complètement gérées : le plugin génère le code LateX et le place dans une balise math : <math>$\frac{\sqrt{2x+9}}{4y-6}=\frac{\alpha 3}{\beta 2}$</math>
  • Les notes de bas de page sont gérées sans problèmes ni restrictions.
  • Pour les tableaux, pas de problème tant que vous n’essayez pas de faire des tableaux imbriqués (c’est à dire un tableau dans une cellule de tableau) : les fusions de cellules horizontales et verticales sont gérées en principe correctement.
  • Les listes à puce et numérotées, imbriquées ou non, sont en principe correctement gérées tant qu’elles ne sont pas interrompues par d’autres éléments (donc pas de reprise de numérotation d’une liste à la suivante).

Eléments non-gérés ou supprimés

  • Pour les tableaux et les listes le plugin ne gère pas les contenus ayant un style de Titre.
  • Les fioritures de style de texte sont limitées à celles autorisées par les raccourcis typographiques : gras et italique donc pas de texte de couleur ni avec des fonds colorés (beurk !), pas de variations de police ni de taille de texte (ce qui évitera que les rédacteurs pourrissent la charte graphique du site !)
  • Les en-têtes, pieds de page, index ou table des matières sont purement et simplement supprimés.
  • Les dessins (flêches, bulles et autres formes crées avec l’outil de dessin d’OOo Writer) ne sont pas (encore ?) supportés.

Utilisation de fichiers Word :

Pour passer d’un fichier Word (format .doc ou .docx) à un fichier odt utilisable par ce plugin, il est conseillé de faire la conversion (« enregistrer sous... » au format ODT) dans LibreOffice (ou OpenOffice) et non pas dans Word (vous avez déja vu un logiciel Microsoft respecter correctement des spécifications de format standard ???)

TO DO

  • Comme d’habitude, piètre graphiste que je suis, si quelqu’un avait le courage de faire un logo moins crasseux, il est le bienvenu ! Merci popojcb !
  • Ajouter la gestion des dessins SVG intégrés dans le fichier texte (avec une version jpg obtenue par conversion automatique pour les navigateurs qui supportent pas svg..)
  • Ajouter la gestion des équations mathématiques qui sont en MathML dans le fichier texte (si vous connaissez un convertisseur MathML -> LaTeX écrit en PHP et open-source, merci de me prévenir !) Merci Amaury Adon pour m’avoir trouvé la référence de la librairie XSLT « MathML 2.0 to LaTeX »
  • Ajouter une interface de configuration pour rendre paramétrable les conversion « imposées » pour les niveaux de titre...

Notes techniques

Le moteur de transformation du fichier odt est basé sur une feuille de style XSLT (/odt2spip/inc/odt2spip.xsl) qui opère sur le fichier content.xml extrait du fichier odt envoyé et dézippé dans un répertoire temporaire /tmp/odt2spip/XXX où XXX représente l’id_auteur en cours . Cette transformation permet de produire le titre et le texte de l’article. Les images sont également extraites du fichier dézippé et intégrées comme documents attachés à cet article (après un éventuel redimensionnement). Le répertoire temporaire de l’auteur (/tmp/odt2_spip/XXX) est effacé à la fin de l’opération.

Si vous souhaitez participer au développement de ce plugin ou faire des modifications du convertisseur XSLT, le répertoire /tests de ce plugin comprend le fichier ODT « type » ainsi que le fichier xml correspondant pour réaliser vos tests.

Si vous êtes sur un SPIP mutualisé, il se peut que vous ayez des problèmes de chemins vers les fichiers lors de la transformation xslt : voir ce fil de discussion pour une éventuelle solution (pour PHP 5) problème réglé avec la version [0.14].

Versions

[version 0.11] support des formules mathématiques

[version 0.12] choix du mode d’intégration des images (img / doc)

[version 0.13] choix de la langue de publication de l’article généré

[version 0.14] compatibilité avec la mutualisation du noyau SPIP 2.0

[version 0.15] compatibilité avec la barre typo V3 (cf #forum435614) et correction de l’incompatibilité des fonctions de révision du plugin snippets avec la version 2.1 de SPIP (cf #forum434725)

[version 2.0] compatibilité SPIP 3.0

[version 2.1] permettre la mise à jour d’un article à partir d’un fichier odt (cf #forum474504)

Ce plugin existe en 2 version :

  • La version « historique » (0.15.3, fichier odt2spip_19_20_21.zip) assure un maximum de compatibilité PHP / SPIP : php5 + spip 2.* , php5 + spip 1.9.2*, php4 + spip 2.*, php4 + spip 1.9.2*.
  • la version « actuelle » : (2.1.*, fichier odt2spip_30.zip) exclusivement PHP 5 + SPIP 3.*

Mille mercis à popojcb pour le logo, à mmmxvvv et D. Bard pour les fichiers de langue.

Librairie XSLT utilisée pour la conversion des formules MathML d’OOo vers LateX : MathML 2.0 to LaTeX de Vasil Yaroshevich http://www.raleigh.ru/MathML/mmltex...

Pour ce qui est du traitement des sauts de lignes/sauts de paragraphes, merci de lire http://contrib.spip.net/odt2spip-cr... avant de poster une réclamation ! : merci à dreline pour avoir réglé ce problème !

Discussion

69 discussions

  • Bonjour
    J’ai un site SPIP 4.2, squelette Html5 Alpha, hébergé sous php8 et j’ai mis ainsi à jour la dernière version de odt2spip.
    Il y a une limitation à des fichiers libre office de 10 Mo. Y a-t-il moyen de revoir le code pour dépasser cette limite ? Si oui, comment ? J’ai accès à mes fichiers mais je ne connais rien en codage.
    D’avance merci
    Cordialement
    Odile

    Répondre à ce message

  • 1

    Bonjour.

    Merci pour ce plugin, en revanche, un truc doit m’échapper, certainement.

    Comment faire pour disposer de la commande libreoffice sur son serveur sans devoir se taper l’installation de TOUT libreoffice (soit 510 Mb de paquets), interface comprise ce qui ne fait aucun sens sur un serveur en mode CLI ? Y a t’il un paquet libreoffice-xyz spécifiquement prévu pour ce genre de cas de figure, ou ... ??? 🤔

    Merci par avance pour tes retours

    • OK, donc first ! Je me réponds à moi même : Pour éviter d’installer TOUT libreoffice sur un serveur en mode CLI, pour faire fonctionner le plugin et pouvoir également intégrer des articles au format DOCX etc... il suffit simplement d’installer le paquet libreoffice-writer-nogui. qui ajoutera juste les paquets nécessaires au serveur pour process la commande libreoffice, sans (ou du moins avec assez peu de) tout le bullshit qui va autour d’une install complète de Libre Office sur un serveur qui n’a pas d’interface graphique.

      Testé avec succès avec odt2spip v4.1.2 sur un SPIP 4.1.2 (aussi !)

    Répondre à ce message

  • 2

    Bonjour,
    Pour aller plus loin...
    Y aurait-il moyen de lier ce plugin à https://contrib.spip.net/Flux-RSS-en-articles pour récupérer en articles des fichiers ODT pointés par un flux RSS ... ? :-/

    • le mécanisme « de base » de ce plugin étant de faire la conversion du XML extrait d’un fichier odt stocké dans tmp/, il semble certainement possible de faire la même chose « en masse » et automatisé à partir d’un flux RSS qui donne des URLs des fichiers à récupérer.

      On peut imaginer un plugin spécifique qui propose un genie faisant :
      -  la lecture d’un flux RSS pour en extraire les URLs des fichiers odt
      -  le téléchargement de ces fichiers odt dans tmp/ via recuperer_url
      -  la génération d’un article à partir de chaque fichier en utilisant l’action odt2spip_importe

      ...ça fait un chouette projet mais qui semble vraiment spécifique : je ne connais pas beaucoup (aucun ?) flux RSS proposant des fichiers odt...

    • Bonjour,
      Merci pour le réponse. Très spécifique effectivement car le flux RSS serait concocté par mes soins.
      Le contexte est que dans mon établissement scolaire les assistants de direction (qui changent régulièrement) sont plus à l’aise sur un « traitement de texte » que sur Spip (oui, je sais, la formation, ...).
      Et plutôt que de recopier chaque fichier .ODT dans l’interface SPIP, ce serait qu’ils

      • créent les documents sur leur traitement de texte préféré,
      • stockent sur Google Workspace (Drive c’est transparent),
      • ensuite une WebApp Google Apps Script met à jour le flux RSS avec le nouveau fichier.

      Spip n’a qu’à importer le nouveau lien du flux et récupérer le fichier.
      Ainsi, ZÉRO manipulation Spip pour créer des articles (en l’occurrence des annonces de stages et offres d’emploi).

      Dans l’immédiat, je vais essayer de faire évoluer l’Apps Script pour déployer le contenu du document en HTML complet dans le flux RSS.

    Répondre à ce message

  • 1

    Bonjour,

    Satanas est de retour ;-)
    J’utilise enluminures typographiques (qui doit intégrer les intertitres hiérarchisés je pense).
    Selon la doc, les styles Titre 1, Titre 2, Titre 3 devraient être convertis.
    En fait, pour mon doc, seuls Titre 2 et Titre 3 sont convertis, mais pas Titre 1... (il est passé en gras)
    Des pistes ? Merci

    • c’est un problème qui apparait en général si le document a un titre ayant le style « Titre principal » à la place du style « Titre » (peu importe qu’il y ait ou non le plugin enluminure typo me semble t’il)

    Répondre à ce message

  • 3

    Bonjour,
    Quand on importe un odt (depuis une rubrique), ça crée un nouvel article.
    Y a-t-il un moyen pour que le doc importé vienne remplacer le contenu d’un article ?
    Car j’ai des liens vers un numéro d’article (et l’url qui va avec), et je désire remplacer le contenu de cet article par l’importation de l’ODT sans perdre les références.
    Merci

    • heu ? depuis la version 2.1 de ce plugin, le formulaire d’odt2spip est présent dans les pages des articles et propose de « Remplacer l’article par le contenu d’un fichier ODT » => ça devrait correspondre à ton besoin (ou alors je n’ai pas compris la question...)

    • Bonjour,
      Oupsss... j’avais trop scrupuleusement lu la doc ici, et je n’avais pas essayé depuis un article... Désolé et merci :-)

    • effectivement la doc n’avait pas été mise à jour lors de cet ajout... C’est fait : merci du signalement !

    Répondre à ce message

  • 2

    Bonjour,
    Dans mon doc odt, j’ai créé des styles hérités de Titre 2 et Titre 3 à définir aux niveaux de titre respectifs.
    Mais ils ne sont convertis qu’en texte...
    Une astuce pour qu’ils soient pris en compte ?
    Merci

    • La solution « simple » : à la place de faire un style hérité, tu redéfini les styles Titre 2 et Titre 3

      La solution « compliquée » (si tu utilise la conversion « interne ») : la feuille de style XSLT qui gère la conversion (fichier inc/odt2spip.xsl) identifie les styles de titres via leur nom de la forme : « Heading_20_X » avec X un chiffre de 1 à 10 (L58 et suivantes, https://git.spip.net/spip-contrib-extensions/odt2spip/src/branch/master/inc/odt2spip.xsl#L58)
      Tu devrais pouvoir surcharger ce fichier (une copie modifiée dans /squelettes/inc/) pour mettre les noms de tes styles hérités.
      (pour mémoire si tu dois trouver le nom des styles hérités : dézippage du fichier odt puis exploration du fichier content.xml pour trouver les balises <text:h text:style-name="Heading_20_3" text:outline-level="3">

    • Merci. J’ai pris la méthode simple pour l’instant, même s’il a fallu retravailler mon doc (j’avais besoin de Titre 2 ET d’un hérité de titre 2...),.
      Le travail sur le XSLT est intéressant, j’y regarderai.

    Répondre à ce message

  • 3

    Bonjour
    Merci pour ce plugin. Cependant...
    Après la mise à jour en 3.0.1 - test, sous SPIP 3.1.0, le plugin a fait planter tout le site.
    Le fichier odt2spip_nettoyer_repertoire_upload.php utilise la syntaxe [a,b,c] pour les tableaux, qui semble-t-il n’est pas supportée par PHP 5.3. Or mon hébergeur utilise cette version.
    J’ai contourné le pb en modifiant à la main la ligne incriminée pour remplacer par l’ancienne syntaxe.
    Je n’aime pas trop ce genre de solution. Est-ce que la prochaine mise à jour ne va pas à nouveau tout faire planter ? J’ai besoin du plugin, ça m’ennuierait de devoir le désactiver.

    Répondre à ce message

  • Bonjour,
    Ce plugin est vraiment très très utile, et un grand merci pour ça.
    Par contre, c’est pas nouveau, mais, impossible de faire correspondre les niveaux de titre entre le doc odt et l’article spip apres conversion...
    Si j’utilise :
    Titre 1, Titre 2 ; Titre 3... dans odt, je n’arrive pas (plus) à obtenir la même hiérarchisation coté spip... J’ai tenté avec et sans « Enluminures typographiques »...
    Y a t il une bonne méthode pour faire correspondre les deux ?
    Merci bien
    triton

    Version 3.0.3 - test
    spip SPIP 3.1.6

    Répondre à ce message

  • 5

    Hello

    Pour info :

    Sur un spip 3.1.6 tout neuf l’installation de ce plugin fait tout planter (page blanche) mais spip propose d’installer la version 3.0.2

    La version 2.1.3 proposée ici ne pose pas de souci.

    PS : je n’avais jamais pris le temps de remercier l’auteur de ce plugin que je propose à toutes mes formations et qui est très apprécié des rédacteurs. Donc merci !!

    • Et comme dans mon académie, il y a de nombreux sites qui utilisent odt2spip, quand ils font ma mise à jour du plugin, ils se retrouvent avec une page blanche.

      Seule solution : virer odt2spip par ftp et réinstaller la version 2.1.3 en copiant l’url du zip

      J’espère que le bug sera résolu rapidement sinon, je sens que je vais être bien occupé :-(

    • Une page blanche c’est du à une erreur PHP. Sans cette erreur difficile de savoir ce que c’est le problème. Quelle version avez vous de PHP (ecrire/ ?exec=info doit l’indiquer) ?
      Pour afficher les erreurs de PHP il faut (si le serveur le permet) activer l’affichage d’erreur (temporairement), on modifiant config/mes_options.php

      Par exemple en ajoutant dedans :

      error_reporting(E_ALL^E_NOTICE);
      ini_set ("display_errors", "On");
      define('SPIP_ERREUR_REPORT', E_ALL^E_NOTICE);
    • Il faudra tester la version 3.0.3 qui tente d’être plus tolérante avec PHP < 5.4

      http://zone.spip.org/trac/spip-zone/changeset/106983
      Pas certain que cela suffise cependant.

      Et pensez à mettre à jour vos serveurs, ça peut être utile !

    • Hello

      Le serveur est en php 5.3.3 et je n’ai pas la main pour passer à une version supérieure. Je vais néanmoins le demander.

      Sinon, la version 3.0.3 du plugin semble résoudre le problème. Merci !

    • Tant mieux pour la résolution. C’est une bonne chose.

      Cependant j’insiste sur le fait que ça commence à devenir un rien risqué de se balader avec des serveurs ayant PHP 5.3, sachant que PHP ne met à jour que PHP 5.6 minimum en terme de sécurité. Ça laisse aux mainteneurs des distributions LTS éventuellement utilisées ici qui auraient de vieux PHP la responsabilité de reporter eux-même les correctifs de sécurité dans ces vieux PHP. C’est parfois possible, mais parfois pas en fonction des évolutions du code. Parfois même peut être que le serveur utilise une distribution elle-même qui ne serait plus maintenue. Je pense cela car même votre version 5.3.3 n’est pas à jour dans sa branche, qui serait la 5.3.29 (http://php.net/eol.php).

      Mettre à jour d’un coup PHP sur ce serveur, si les autres applications autour ne sont pas à jour ne résoudrait pas vraiment les problèmes de sécurité non plus, et par ailleurs risquerait de casser des applications qui ne sont pas prévues pour les PHP trop récents (ça peut arriver).

      L’idéal semblerait plus logiquement de créer un nouveau serveur à jour sur une distribution LTS, et de migrer dessus application par application, site par site, pour ne pas tout casser d’un coup ! Et j’imagine que cela sera long et fastidieux (ou avoir de la chance !), et pas forcément la priorité de l’administrateur du serveur qui a certainement d’autres chats à fouetter dans l’académie plus prioritaires au jour le jour. Il faut peut être envisager du coup à un moment de revoir les priorités :)

      MM.

    Répondre à ce message

  • 2

    Bonjour,

    Depuis odt2spip v.3.0, il y a l’option « Serveur de conversion ».

    Si le message « La commande libreoffice n’est pas disponible sur ce serveur. » est affiché, il y a-t-il une méthode pour activer la dite commande sur le serveur ou, comme c’est plutôt mon cas, que faut-il demandé au support technique de l’hébergeur ?

    Merci d’avance,

    Cordialement,

    Hervé

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom