Dominique Meeùs
Dernière modification le  
retour au sommaire Linux

Questions de formats

Types de fichiers et actions

Dans Nautilus, si on demande les propriétés d’un fichier, l’onglet Ouvrir avec permet de choisir et modifier les actions (l’ouverture par une application) sur les fichiers du même type.

L’action par défaut serait inscrite dans /etc/gnome/defaults.list alias /usr/share/applications/defaults.list. Je n’ai pas encore trouvé où sont cachés les autres choix d’application proposés.

Conversions

Papier vers PDF

L’application xSane permet de scanner en PDF. L’application gscan2pdf, qui est aussi basée sur Sane, est plus sophistiquée dans la mesure où elle supporte de multiples formats dont PDF et Djvu, elle permet des PDF ou Djvu de plusieurs pages (avec un bon scanner) et elle peut soumettre l’image du texte à la reconnaissance de caratères pour intégrer le texte dans un layer le PDF ou le Djvu.

PDF vers jpeg ou autres

Le paquet xpdf-utils contient une commande pdfimages qui lit les images dans un fichier PDF et les sauve en format d’image. L’expérience montre que des graphiques ne sont pas considérés comme des images. Mais on peut utiliser l’une ou l’autre des solutions suivantes pour transformer le PDF entier en image et y découper le graphique avec un éditeur d’image.

La commande pdftoppm transforme un PDF en image Portable Pixmap (PPM). Par exemple

pdftoppm -f 1 -l 3 monpdf.pdf imgpdf

convertira le fichier monpdf.pdf de la page (f = first) 1 à la page (l = last) 3 dans les images imgpdf-000001.ppmimgpdf-000002.ppm et imgpdf-000003.ppm.

Pour imprimer, vous pourriez préférer ajouter le communtateur -mono (qui donnera des fichiers pbm) ou -gray (qui donnera des fichiers pgm). S’il y a des à plats de couleur, le -mono donnera un tramage fruste. Mieux vaut demander -gray.

J’ai actuellement (début avril 2007) la visionneuse de PDF Evince 0.6 qui n’imprime pas correctement en paysage. J’ai utilisé cette conversion en pgm pour imprimer un document pdf paysage.

La commande gs de Ghostscript admet en entrée bien sûr le PostScript, mais aussi le PDF qui en est dérivé (si c’est un PDF standard — il peut y avoir des problèmes avec l’en-tête d’un PDF créé sur un Mac). En sortie, on a divers modèles d’imprimantes dont des « imprimantes » virtuelles comme jpeg. On peut donc avec ghostscript « imprimer » un document PDF en une image jpeg. La commande gs -h affiche les devices disponibles.

gs -sDEVICE=jpeg -sOutputFile=image.jpeg document.pdf

On peut indiquer les pages à « imprimer » au moyen des commutateurs -dFirstPage= et -dLastPage= qui sont spécifiques au traitement des documents PDF. Les commutateurs -dNOPAUSE et -dBATCH sont utiles pour produire sans intervention une série d’images à partir d’un PDF de plusieurs pages. Par exemple, avec

gs -dNOPAUSE -sDEVICE=tiffgray -sOutputFile=output%02d.tiff -dBATCH -r300 DMseChoq.pdf j’ai converti un article de dix pages en PDF (pure image, on ne pouvait pas y copier du texte pour le coller) en dix images tiff que j’ai ensuite converties en texte txt avec Tesseract. Le tout en quelques secondes. Wow !

PDF vers texte

Dans Ubuntu, les documents PDF sont affichés avec Evince qui permet de copier du texte pour le coller dans une autre application.

Ça pose un problème pour le texte en colonnes. La sélection prend toutes les colonnes à la fois. Si on colle dans gedit, on a sur chaque ligne le morceau des trois colonnes. J’ai bien réussi à m’en sortir en passant par OpenOffice.org Calc. Lorsque je colle la copie de la sélection Evince en colonnes, Calc me propose de la convertir. Il suffit de sélectionner largeur fixe et on a le texte en trois colonnes. J’ai copié et collé successivement les trois colonnes dans Bluefish pour en tirer un document html continu. (Le format html est le plus indiqué ici parce qu’il ne faut pas retirer les fins de lignes dures héritées de la sélection dans Evince.)

Il y a aussi une application pdftotext qui semble assez bien se débrouiller avec les colonnes, avec un minimum d’erreurs. Elle supprime même les traits de césure en fin de ligne !

Cependant, il y a des PDF spéciaux qui s’affichent en Evince mais qui ne permettent pas la sélection de texte et qui ne donnent rien de lisible en pdftotext. C’est le cas des essais d’exporter des données de Thunderbird (une fiche du carnet d’adresse, ce que Thunderbird ne prévoit pas) par le biais d’une impression.

PDF vers html

Utiliser la commande pdftohtml. S’il y a des images, elles sont sauvées en format jpeg. Documentation : manpage. Syntaxe intuitive :

pdftohtml monfichier.pdf monfichier.html

Si le PDF est un peu compliqué, la commande peut avorter avec une erreur. Passer alors par l’intermédiaire du format texte comme ci-dessus. J'ai eu aussi une conversion parfaitement réussie (?) d'un très long texte. Cependant tous les espaces étaient devenus nbsp; (ce que n'ai immédiatement remplacé dans un éditeur) et toutes les lignes du PDF étaient des <br>. Il n'y avait même pas de double <br> pour repérer les paragraphes, il aurait fallu refaire tout le code à la main.

PostScript vers texte

Evince affiche aussi les fichiers PostScript. (J’ai vu Evince n’afficher que la première page d’un bouquin en PostScript foireux, en annonçant page 1 sur 1 et sans commande Page suivante. Une application plus primitive, gv, amélioration de Ghostview, donnait toutes les pages.)

Il y a une application pstotext qui donne le contenu en caractères d’un fichier PostScript sur la sortie standard. Si on veut un fichier, il faut rediriger la commande : pstotext book.ps > book.txt. Il y a aussi une option pour indiquer un fichier de sortie mais elle doit impérativement venir devant le fichier d’entrée : pstotext -output book.txt book.ps. Il n’y a pas d’option utf-8. La sortie est en iso-8859-1 ou Latin-1.

PostScript vers PDF

La technique Ghostscript ci-dessus peut être appliquée vers l’ « imprimante » pdfwrite par la commande abrégée ps2pdf.

Marque-pages (bookmarks) vers xml et html

La norme XBEL

XBEL (the XML Bookmark Exchange Language) est un dialecte xml d’échange de marque-pages. Certains navigateurs (browsers) l’utilisent comme format natif de marque-pages et différents programmes peuvent l’importer et l’exporter. Il y a des paquets Debian (et Ubuntu) xbel et xbel-utils pour l’utiliser.

Netscape, Mozilla, Firefox 1.x et 2.x vers XBEL

L’extension Bookmarks Synchonizer fait ça pour les Firefox 1.x et 2.x. (Pas pour Firefox 3). Mais on peut faire ça aussi « à la main ».

Les browsers de cette famille stockent les marque-pages dans le fichier bookmarks.html, un html un peu « particulier » de Mozilla. Le paquet xbel-utils fournit une commande pour transformer ce fichier en fichier XBEL :

ns_parse bookmarks.html bookmarks.xbel

Firefox 3 vers XBEL

Firefox 3 utilise une technique différente. Les marque-pages sont sockés avec l’historique dans le fichier de base de données places.sqlite du profil de l’utilisateur. Pour Firefox 3, l’extension SyncPlaces fait la conversion dans un XBEL de qualité, par défaut syncplaces_xbel.xml. Sinon la fonction Organiser les marque-pages du menu Marque-pages de Firefox 3 permet de les exporter dans un fichier bookmarks.html de l’ancien format de bookmarks Mozilla. On peut alors convertir celui-ci par la commande ns_parse comme ci-dessus.

Afficher le fichier XBEL dans un browser

Si on veut afficher dans un browser le contenu intelligible du fichier XBEL, il faut lui associer une feuille de style appropriée. Dans mon fichier syncplaces_xbel.xml j’ajoute la ligne

<?xml-stylesheet type="text/xsl" href="xbel2html.xsl"?>

et je sauve le fichier ainsi modifié sous le nom de xbel.xml. Je place alors les fichiers xbel.xml et xbel2html.xsl sur mon site par FTP. Si vous cliquez xbel.xml dans un browser moderne, vous devriez voir afficher mes marque-pages, mais il peut arriver que la longueur du fichier dépasse ce que mon hébergeur veut bien servir sur requête http. Vous devriez alors enregistrer les deux fichiers xbel.xml et xbel2html.xsl sur votre disque pour pouvoir afficher localement le premier. Ça vous permet aussi de voir dans un éditeur de texte à quoi ils ressemblent.

Cette combinaison xbel.xml et xbel2html.xsl donne une très longue page sans possibilité d’ouvrir et de fermer les dossiers ni de naviguer autrement qu’en lisant tout ou en utilisant une commande de recherche. Afficher le xml par une feuille de style ou de transformation ouvre la possibilité de contrôler la présentation. Dans ma feuille de style xbel2html.xsl j’ai mis des cadres pour mieux visualiser la hiérarchie. La technologie XSLT devrait permettre au moins de produite une table des matières pour s’y retrouver mieux.

XBEL vers html

Si on veut simplement les marque-pages dans une grande page html avec des balises <ul> et <li>, Il suffit de faire (si le paquet xbel-utils est installé)

xbel2html xbel.xml > xbel.html.

XBEL vers html en passant par Freemind

La commande

xsltproc -o bookmarks.mm /usr/share/doc/freemind/accessories/xbel2mm.xsl bookmarks.xbel

transforme un fichier XBEL (bookmarks.xbel) en un dossier (bookmarks.mm) de l’application d’organisation d’idées Freemind. (Vérifier où se trouve le fichier xsl dans votre installation de Freemind.) On peut alors voir ses marque-pages, naviguer, modifier et cetera dans Freemind. Freemind exporte en html. C’est un moyen assez détourné puisqu’il faut avoir installé le paquet xsltproc, installer l’application Freemind et apprendre un minimum à s’en servir. En outre, Freemind dépend de Java et la page html produite utilise Javascript. C’est ce qui donne le bookfreemind.html. (Fait en mai 2008, les marque-pages ne sont plus très à jour.) C’est le meilleur résultat du point de vue navigation parce que c’est une page html tout à fait arborescente où l’on peut ouvrir et fermer les dossiers et sous-dossiers de marque-pages. Par contre, Freemind perd les descriptions des marque-pages de Firefox, que XBEL conserve. (On pourrait probablement améliorer xbel2mm.xsl dans ce sens.)

XBEL vers html en PHP

J’ai adapté un script PHP, xbel.php, qui lit le même fichier xbel.xml) pour le rendre en html. Le script est d’Amir Kamal qui est lui-même parti du script de Roberto Giungato. Mon code est xbel-php.txt. (C’est accessoirement une manière de tromper le serveur : ce serveur refuse de servir de longs fichiers, mais xbel.php est un petit fichier qui nous donne accès à un grand contenu.) Il y a aussi un appel à un script en JavaScript qui permet d’ouvrir ou de fermer les dossiers et les sous-dossiers, mais le repérage par PHP des éléments XBEL bute sur les caractères accentués. On voit donc que c’est prometteur mais que ça ne marche pas. Cela dépasse pour le moment ma compétence dans les problèmes de PHP et d’UTF-8. Si vous avez une idée, elle est la bienvenue.

Quoted-printable vers UTF-8

Mon GSM Nokia 6021 écrit avec des accents. Je récupère les données d’agenda avec Wammu pour les exporter vers l’agenda Lightning, extension de Thunderbird (ou vers l’agenda Sunbird d’une machine Windows à laquelle j’ai accès occasionnellement). Wammu exporte l’agenda de Nokia en format ICS version 1 où les textes sont encodés en quoted-printable sur deux octets, par exemple =C3=A9 pour é ou =C5=93 pour œ. Les textes sont précédés de CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:. Cependant Lightning et Sunbird importent ce quoted-printable sans décodage et ça donne des choses comme « Passage =C3=A0 l’heure d’=C3=A9t=C3=A9 », ce qui n’est pas particulièrement agréable à lire.

Les utilitaires de décodage que j’ai essayés (uudeview ou mimencode) ne semblent pas comprendre cet encodage sur deux octets. Ils décodent chaque octet séparément ou rien du tout. J’ai donc écrit un script qptoutf8 (pour quoted printable to UTF-8) qui utilise une longue commande de remplacement de sed pour tous les caractères accentués — pas tout UTF-8 ! (La longue commande sed est répartie sur autant de lignes que de caractères pour la lisibilité.) La commande qptoutf8 agenda lit un fichier agenda.ics, y remplace le quoted-printable sur deux octets par des caractères UTF-8 (remplace aussi d’abord les mentions ;ENCODING=QUOTED-PRINTABLE par rien du tout) et écrit le résultat lisible dans agenda-utf-8.ics. Je donne le code de qptoutf8 dans qptoutf8.txt.

Nokia 6021 par Wammu vers Lightning ou Sunbird

Il faut convertir en UTF-8 le quoted printable comme expliqué ci-dessus. C’est le premier mais pas le seul problème.

Le deuxième problème est que les heures sont données avec un Z en fin de ligne que Lightning et Sunbird n’interprètent pas correctement, ce qui donne des décalages horaires. Il faut supprimer cette lettre Z et le problème disparaît. Mais dans le fichier ics fourni par Wammu, les lignes se terminent par CR LF. Pour la commande sed, la fin de la ligne est marquée par le LF. Donc le dernier caractère est le CR et le Z à supprimer est en réalité l’avant-dernier. Il s’agit donc de supprimer tout Z suivi d’un caractère quelconque (".") en fin de ligne. On indique à sed la fin de ligne par un $. La commande a ajouter au script pour supprimer le Z est donc sed -e ’s/Z.$//g’ \

Le troisième problème est celui des notes qui ne sont pas des rendez-vous, qui sont attachées à des jours mais sans heures déterminées. Si je marque dans mon Nokia 6021 mon intention de prendre des vacances du 1er au 15 juillet, cela devient du 1er au 14 dans Lightning et Sunbird. Pourquoi la fondation Mozilla veut-elle me supprimer un jour de congé ? Dans le fichier ics que Wammu tire du Nokia 6021, on a DTSTART;VALUE=DATE:20080701 et DTEND;VALUE=DATE:20080715. (Les variables DTSTART et DTEND sont par défaut de type date-time. Comme ici on veut donner une date seule, on déroge au type par la clause VALUE=DATE.) Pour Lightning et Sunbird, ces dates sans heures deviennent des dates à 00:00 heure et un événement jusqu’au 15 à 00:00 heure n’est affiché que jusqu’au 14. Donc ce qui était 15 inclus dans mon Nokia devient 15 exclu pour les agendas à la sauce Mozilla. C’est un problème que je n’ai pas encore résolu. La piste serait peut-être d’imposer 00:01, mais ça risque devenir un rendez-vous à heure déterminée. Une autre piste serait d’ajouter un jour à toutes les dates de fin. Pour cela je dois d’abord augmenter encore un peu ma compétence en sed.

Image vers texte (reconnaissance optique de caractères, ROC, optical character recognition, OCR)

Ça y est, le vrai OCR sous Linux est arrivé ! J’ai installé tesseract.ocr avec les fichiers de données pour différentes langues à partir du dépot Universe. Si on veut la toute dernière version, voir http://doc.ubuntu-fr.org/tesseract-ocr.

On scanne une page d’un livre en français

disons image.tiff. On commande

tesseract image.tiff textedelimage -l fra

(où bien sûr -l fra veut dire langue : français — je suppose qu’on a les fichiers de données de langue pour le français) et ça donne en trois secondes le fichier textedelimage.txt du texte d’image.tiff sans une seule faute. (Enfin, pour les textes de bonne qualité et si les lignes sont bien horizontales sur le scanner.) Qu’on se le dise, maintenant sous Linux il y a un vrai OCR gratuit mais de qualité professionnelle, à l’égal des plus chers !

Je suis arrivé à interfacer Tesseract avec XSane grâce à des indications et à un script trouvés sur ubuntu-fr.org. Pour le script, il faut le copier de leur page xsane2tess ou bien ici sur mon site et le sauver dans /usr/bin sous le nom xsane2tess en le rendant exécutable. Le script a besoin d’un dossier ~/tmp qu’il faut créer au besoin. Il faut installer le paquet imagemagick. (Si on préfère graphicsmagick, j’ai écrit dans mon fichier xsane2tess-g.txt une variante adaptée. Mais souvent imagemagick est déjà installé.) Dans XSane, Préférences, Configuration, OCR, indiquer comme Commande, xsane2tess -l fra (pour le français, adapter pour d’autres langues), -i comme option d’entrée et -o comme option de sortie. Dans la fenêtre principale de XSane, demander Enregistrer, proposer un nom de fichier, choisir le type TEXT et Trait au lieu de Couleur. Et voilà, on peut passer du scanner au texte en une seule opération les doigts dans le nez. (Si on avait demandé Visionneuse, il est toujours possible de sauver l’image visionnée à travers l’OCR. C’est une des commandes du menu Fichier de la visonneuse.)

Attention, dans les préférences de XSane, à l’importance du fra dans la commande xsane2tess -l fra. Avec ce choix de langue, Tesseract reconnaît assez bien aussi l’anglais. Pour mettre toutes les chances de mon côté, j’ai cependant mis xsane2tess -l eng. J’ai ensuite oublié de changer eng en revenant au français. Le résultat est pauvre. Beaucoup d’accents sont perdus. (Cela montre l’importance du dictionnaire dans la reconnaissance.) Les mots longs sont faciles à corriger avec un correcteur d’orthographe, mais il est fastidieux de retrouver tous les a qui demandent un accent grave. Bref, pour le français, il faut impérativement l’indication de langue fra et, plutôt que de l’oublier, on pourrait préférer ne pas la changer pour des langues avec peu d’accents commme l’anglais ou le néerlandais.

J’ai pu reconnaître aussi par Tesseract un PDF pure image en le convertissant en TIFF comme expliqué ci-dessus.

J’avais installé ocrad et gocr. Aucun des deux n’est comparable aux grands logiciels commerciaux, mais je trouvais ocrad un peu plus fiable. Le fichier d’entrée doit être en format pbm. Si on demande à Xsane de scanner en trait (noir et blanc) et de sauver en pnm, ce sera du pbm. Il faut dire à ocrad qu’on veut de l’UTF-8 (par exemple), quel est le ficher d’entrée et celui de sortie. Exemple :

ocrad scantexte.pnm -F utf8 -o textetexte.txt.

Images vers icones Microsoft

Le paquet icoutils fournit divers outils pour récupérer et convertir de et vers des images en format .ico de Microsoft. Par exemple, la commande

icotool --create --output favicon.ico monsite32.png monsite64.png monsite16.png

ou icotool -c -o favicon.ico monsite32.png monsite64.png monsite16.png

crée une icone favicon.ico à partir d’images monsite… de diverses dimensions (par exemple 32, 64 ou 16 pixels au carré).

Visionner

PDF et PostScript

Sous Gnome, Evince affiche les images mais aussi les fichiers PDF et PostScript.

Documents Microsoft Word

On peut évidemment ouvrir un document Word dans OpenOffice.org. Mais c’est une application lourde à démarrer. Parfois on ne désire aucunement éditer le document mais seulement se rappeler ce qu’il y a dedans, par exemple pour décider de l’archiver ou de le détruire. Voici un moyen d’en examiner rapidement le contenu dans Firefox. Installer le paquet wv. Écrire le script suivant :

#!/bin/bash
wvWare -x /usr/lib/wv/wvHtml.xml $1 > temp.html
firefox temp.html
rm temp.html
#

Je l’ai sauvé sous le nom de viewdoc dans mon dossier /home/moi/bin et je l’ai rendu exécutable. Pour visionner fichier.doc, par exemple, je n’ai qu’à lancer

~/bin/viewdoc fichier.doc

pour en voir apparaître le contenu dans Firefox. Bien sûr Firefox n’est lui-même pas des plus rapides à démarrer. Ce sera rapide si Firefox est déjà ouvert.

Imprimer

Papier d’impression par défaut dans Firefox et Thunderbird

Firefox et Thunderbird sont souvent installés avec le papier Lettre US (en anglais Letter) par défaut. On peut le modifier dans un dialogue de mise en page ou d’impression, mais ce n’est pas mémorisé pour la fois suivante. Pour le changer, il faut éditer pref.js dans le dossier de profil de l’application. Attention, notez ceci puis fermez Firefox et Thunderbird avant d’éditer leur pref.js. Chercher toutes les lignes avec print_paper et modifiez-les comme suit

user_pref("print.print_paper_data", 9);

// Je ne sais pas ce que ça veut dire, non documenté, j’ai mis comme print_paper_size

user_pref("print.print_paper_height", "297");

// 297 mm de hauteur

user_pref("print.print_paper_name", "A4");

// A4

user_pref("print.print_paper_size", 9);

// Documenté (http://doc.xmarc.net/xmarc7/es/Fire/refman/print_paper_size_identifiers.htm) : 9 c’est A4

user_pref("print.print_paper_size_type", 1);

// Je ne sais pas ce que ça veut dire, inchangé

user_pref("print.print_paper_size_unit", 1);

// En millimètres

user_pref("print.print_paper_width", "210");

// 210 mm de largeur

non seulement les lignes ci-dessus mais aussi les lignes similaires avec un nom d’imprimante comme

user_pref("print.printer_My-Printer-Model.print_paper_data", 9);

Par contre, il est normal d’avoir dans pref.js une liste où sont définis des papiers différents paper.0, paper.1, paper.2 et cetera. Il ne faut pas changer ces définitions.

Polices

Polices de menu dans Firefox

Certaines versions de Firefox lisent mal la définition de l’écran à l’installation et se retrouvent avec des polices d’écran disproportionnées. On peut le corriger en éditant un fichier de style userChrome.css dans le répertoire chrome de son répertoire de profil. J’ai des polices de menu convenables avec

* {font-size: 12px !important;}

Retour en haut de la page