Dominique Meeùs
Dernière modification le
retour au sommaire Linux
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.
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.
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.ppm, imgpdf-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 !
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.
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.
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.
La technique Ghostscript ci-dessus peut être appliquée vers
l’ « imprimante » pdfwrite par la commande abrégée
ps2pdf.
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.
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 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.
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.
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.
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.)
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.
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.
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.
Ç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.
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é).
Sous Gnome, Evince affiche les images mais aussi les fichiers PDF et PostScript.
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.
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.
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;}