Journal odfimages : traiter les images dans des documents bureautiques

Posté par (page perso) .
Tags : aucun
26
10
juil.
2010
Bonjour, nal !

Comme aucun outil n'existait pour cela, j'ai décidé de coder trois petits utilitaires pour traiter les images dans des documents bureautiques standard (OpenDocument, donc). Concrètement : extraire, compresser ou détacher les images d'un document.

Cette suite d'outils, à laquelle j'ai donné le nom wachement original de « odfimages », se compose donc de trois programmes :
  • odfimgextract pour extraire les images d'un document dans un répertoire donné ;
  • odfimgdetach pour détacher les images d'un document, c'est à dire les extraire, et construire un nouveau document qui ne les contient pas, mais y fait référence en tant que fichiers externes ;
  • odfimgcompress pour effectuer diverses opérations de compression sur les images à l'intérieur d'un document : réduction de la résolution, changement de format…

Distribution

Pour le moment, tout ça est à tester : n'hésitez pas à aider et à me signaler tout problème ou suggestion en commentaire. Ça se passe ici, prenez le dernier snapshot. Quand j'aurai le temps, je ferai un vrai site web pour ces outils.

Ah oui, au fait, c'est sous GPL v3+.

Technique

Techniquement, c'est codé en Python, et ça utilise la Python Imaging Library — uniquement pour odfimgcompress —, SAX pour traiter le XML en série et le module standard zipfile pour extraire les données. Les pages de manuel sont codées en DocBook, et compilées par XSL pour produire les nroff. Et puis tout ça est sous Git.

odfimgextract est le plus simple des trois outils : il extrait bêtement du document tous les fichiers qui ont une extension d'image. Pas besoin de faire plus compliqué, je pense.

odfimgdetach, lui, va lire le manifeste du document — c'est un document XML qui liste les fichiers embarqués — pour trouver les fichiers de type image. Il les extrait, les retire du manifeste, puis réécrit les références à ces images dans le contenu du document.

Enfin, odfimgcompress commence par lire le contenu du document — vu que c'est lui qui contient les dimensions physiques des cadres d'image — et, selon les options choisies, effectue divers traitement sur les images embarquées trouvées. En cas de changement de format, et donc aussi de nom, il réécrit les déclarations de ces images dans le manifeste.

Commentaires

La spécification OpenDocument n'est pas si longue que ça, et, pour de petits besoins comme ceux-ci, elle serait presque agréable à parcourir.

Futur

Il me reste encore pas mal de travail :
  • faire un site web ;
  • écrire un autre outil odfimgattach pour intégrer les images externes auxquelles un fichier fait référence ;
  • faire un paquet Debian.

Ces outils tournent peut-être sous des système non Unix. Personnellement je m'en moque, cette portabilité n'est pas un de mes objectifs — en revanche je ne fais rien pour ne pas être portable —, mais si quelqu'un veut essayer, ce sera bienvenu.

Seul le format OpenDocument est pris en charge, et aucun autre format ne sera ajouté.

Quand ce sera un peu plus mûr, je ferai une dépêche.
  • # Inspiration

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

    Au fait, cette idée m'est venue de deux sources :
    — pdfimages, des poppler-utils ;
    — un collègue qui voulait acheter un FileOptimizer® pour Microsoft Office®, qui fait sans doute plus que ça, mais dont au moins une fonction est de compresser les images à l'intérieur d'un document.
    • [^] # Re: Inspiration

      Posté par . Évalué à 8.

      J'adore la seconde raison. Il y a souvent des options « vraiment génial que l'on ne trouve que chez X » qui sont en fait tellement simple que l'on en parle pas sous des environnement moins marketisé ou qui sont implémentables.

      Je te félicite pour ce travail même si personnellememnt je ne m'en servirais probablement pas.

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # 2 remarques

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

    >il extrait bêtement du document tous les fichiers qui ont une extension d'image

    Faire un petit appel à magic pour confirmer la nature du fichier ne serait peut-être pas du luxe (on peut imaginer un odt emportant un fichier truqué pour corrompre l'os que tu sais).

    Deuxième remarque un petit lien vers ton repo illustrerai positivement ce journal.
  • # Outil pour sysadmin en mal d'espace disque

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

    Hello,

    ça faisait quelquetemps que je cherchais un application du type odfimgcompress. J'avais fait un script mais ce n'était pas toujours génial.

    Cet outil en ligne de commande est clairement orienté sysadmin car la secrétaire de direction ne s'en servira probablement jamais du fait de sa non-maîtrise de la ligne de commande (enfin, je n'exclus rien mais en règle générale, c'est le cas).

    En revanche, le sysadmin va clairement te dire merci pour le gain de place que ton outil va permettre. Dans les organisations, en règle générale, les documents bureautiques qui contiennent des images ne sont pas forcément très bien conçus par leurs utilisateurs. Ces derniers cherchent avant tout à ce qu'il y ait une image et qu'elle rentre dans la page au bon endroit. Le reste (taille, résolution, algo de compression), ils s'en foutent et effectivement, il faut avoir quelques outils pour s'en occuper. Au final, on se retrouve souvent avec des odp de 50Mo pour 5 diapos ou bien un simple rapport en odt de 30 pages de texte pur faisant 25Mo parce que le logo utilisé en bas de la page 1 et qui fait 1cmx2cm est un "png" (Ooo compresse dans ce format les images par défaut) en 2048x1024 pixels.

    Avec odfimgcompress, le sysadmin qui en a marre que certains utilisateurs explosent leur quota d'espace disque ou viennent le voir sans arrêt pour qu'il relève la taille maximale d'envoi d'un email (et qui en a surtout marre de devoir les sensibiliser en permanence à la gestion de la taille des fichiers) pourra gagner enfin de l'espace disque en optimisant la taille des fichiers bureautique.

    Maintenant, pour juguler le problème à la base, il faudrait modifier le comportement d'OpenOffice en indiquant la résolution par défaut des images (et que ce soit paramétrable par un sysadmin) ou en offrant à l'utilisateur un moyen simple de la choisir (avec une extension comme Sun Presentation Minimizer ou bien carrément intégré comme on fait pour choisir la résolution des PDF). Ensuite, une petite explication sur la résolution et la taille des images à destination de l'utilisateur final et c'est joué ! N'oublions pas que ces derniers pestent souvent parce qu'ils ne peuvent pas envoyer tel ou tel document par email parce que celui-ci dépasse la taille maximale d'envoi. Comme, en règle générale, on écrit pour se faire lire, un document bureautique a de grandes chances d'être envoyé par email.

    Donc, merci...
    • [^] # Re: Outil pour sysadmin en mal d'espace disque

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

      Cet outil en ligne de commande est clairement orienté sysadmin car la secrétaire de direction ne s'en servira probablement jamais du fait de sa non-maîtrise de la ligne de commande (enfin, je n'exclus rien mais en règle générale, c'est le cas).

      Je plussoie. Avoir une version graphique serait un plus, mais je ne veux pas m'en occuper pour l'instant, je veux d'abord stabiliser l'interface en ligne de commande de base.
    • [^] # Re: Outil pour sysadmin en mal d'espace disque

      Posté par . Évalué à 2.

      De la même manière que pour les PDF on peut les optimiser avec goshtscript ou avec djvu.

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # Github ?

    Posté par . Évalué à 1.

    Je ne conteste pas ton choix d'héberger ton dépot Git sur ton propre serveur, mais je regrette quand même que ça ne soit pas hébergé sur un truc comme Github ou Gitorious.

    Je viens de trouver un bug dans odfimgcompress (un truc tout con, par ailleurs), qui fait que l'outil plante sur des images dont la taille est indiquée en points (pt). Je n'ai aucun moyen pour le moment de faire un rapport de bug correct et une merge request pour corriger ça.

    Évidemment, tu pourrais installer un Redmine, un Trac, un Bugzilla, etc. pour ça. Mais tout l'intérêt des solutions comme Github est justement que c'est fait automatiquement et que le processus de signalement de bugs et de contribution peut-être réalisé facilement dès la mise en ligne du projet. Là, il n'y a aucun moyen simple de contribuer mon bugfix (pas de mailing list, pas de bug tracker) à part un mail ou un commentaire sur DLFP.

    En parlant de ça, voilà un patch : http://paste.pocoo.org/show/cO7P8av32VVE2c3180xi/ .
    • [^] # Re: Github ?

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

      L'intérêt de git est pas d'être acentré ?
    • [^] # Re: Github ?

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

      Je viens de trouver un bug dans odfimgcompress (un truc tout con, par ailleurs), qui fait que l'outil plante sur des images dont la taille est indiquée en points (pt).

      Merci !

      Je n'ai aucun moyen pour le moment de faire un rapport de bug correct et une merge request pour corriger ça.

      Ah mais si, c'est tout l'intérêt de Git, pas besoin de dépôt central. D'ailleurs, un dépôt officiel, il y en a un, le mien, qui est aussi utilisable par qui que ce soit que n'importe quel dépôt sur SourceForge ou Dieu sait où. C'est à dire en lecture seule.

      Donc, l'intérêt de Git, c'est que tu peux faire des modifications chez toi, puis me les proposer, au choix :
      — en exposant ta branche sur un dépôt, puis en m'envoyant une requête de pull ;
      — en m'envoyant un git-format-patch.

      Requête de pull ou de merge, ça veut dire la même chose : le but est de faire un merge, mais pour ça, i faut d'abord récupérer la branche tierce, avec un fetch, et le pull, c'est fetch puis merge, donc on parle bien de la même chose. En revanche je ne vois pas en quoi une requête de pull est conditionnée au fait d'être exposé sur un gros dépôt. Une requête de pull, ça se résume à :
      Salut, j'ai corrigé des trucs dans ton projet, si tu veux tu peux les récupérer sur la branche contrib de mon dépôt <git://git.example.com/odfimages.git> en faisant :
      git pull git://git.example.com/odfimages.git contrib
  • # LPOD ?

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

    LPOD[1] est une librairie ODF, elle permet de créer, manipuler des documents ODF en python, perl et ruby.

    L'outil lpod-show.py permet d'extraire les images.

    [1] http://lpod-project.org
    [2] http://lpod-project.org/tools
    • [^] # Re: LPOD ?

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

      Très intéressant, je vais peut-être utiliser cette bibliothèque, tiens.

      En revanche, pour extraire les images, en réalité cet outil extrait tout, et n'est donc pas plus fin qu'un bête unzip. :-)
  • # RE: odfimages

    Posté par . Évalué à 1.

    mmh, voici des outils qui ont l'air très intéressants. Bravo et bon courage pour la suite. J'en profite pour demander si vous pensez qu'il serait possible de faire aussi un outil permettant de changer automatiquement la police dominante d'un document sans toucher aux polices secondaires.

    Typiquement c'est utile pour les gens qui comme moi utilisent l'extension Cmaths, et qui ont des documents truffés de formules, avec une police différente pour le texte et pour les formules ;), mais sans doute également pour les gens qui utilisent des modèles de documents, avec des polices spéciales et inamovibles qui forment le cadre..
    • [^] # Re: RE: odfimages

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

      C'est extrêmement simple, pour un document bien fait : un changement dans un style. Pas vraiment besoin d'un outil dédié pour cela, je pense.

Suivre le flux des commentaires

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