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. 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 places.sqlite.
Cependant 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. On peut alors convertir
celui-ci par la commande ns_parse comme ci-dessus.
C’est grâce à Bookmarks Synchonizer que
j’ai découvert XBEL et c’est grâce au fait que cette extension ne
fonctionne plus que j’en ai appris beaucoup plus, et donc qu’on peut
facilement se passer de cette extension.
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 bookmarks.xbel 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. Si vous voulez voir ce qu’il a dans le
ventre, cliquez avec le bouton droit et enregistrez-le chez vous pour le lire
dans un éditeur de texte. De même avec xbel2html.xsl.
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. Autre version, en xml + php (un script
bookmarks.php lit le même fichier xbel.xml), avec
une meilleure navigation mais des problèmes de caractères accentués.
Afficher le xml par une feuille de style ou un script en php
ouvre la possibilité de contrôler la présentation. Le script
bookmarks.php essaie de donner un système de navigation. Dans ma
feuille de style xbel2html.xsl j’ai mis des cadres pour mieux
visualiser la hiérarchie. Mais 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.
Vous pouvez comparer le rendu de xbel.xml et de 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 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. (Sinon, on
pourrait perfectionner le bookmarks.php.) Par contre, Freemind
perd les descriptions des marque-pages de Firefox, que XBEL conserve. (On
pourrait probablement améliorer xbel2mm.xsl dans ce sens.)
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;}