Utilisateur:Kipmaster/djvu-ocr

La bibliothèque libre.

But et utilisation[modifier]

But : Il s'agit de faire l'ocr d'un fichier Djvu (avec tesseract), et d'enregistrer cet ocr dans le fichier Djvu lui-meme.

Cela permet ensuite de pouvoir importer l'ocr sur Wikisource automatiquement avec python djvutext.py -index:Livre:Katia.djvu -djvu:Katia.djvu -pages:5-100

Utilisation : perl djvuocr.pl fichier.djvu[1]

Pré-requis : le script a besoin de tesseract et djvulibre-bin. Sous Ubuntu, la commande suivante installe les paquets nécessaires :

sudo apt-get install tesseract-ocr tesseract-ocr-fra djvulibre-bin

code[2][modifier]

fichier : djvuocr.pl

#!/usr/bin/perl


if ( $#ARGV < 0 ) {
  print "donner en premier argument un lien vers le fichier Djvu\n" ;
  exit 0 ;
}

$inputdjvu = $ARGV[0] ;
$imagetmp = "/tmp/temp.tif" ;
$djvutmp = "/tmp/outdjvu" ;

print "traitement de $inputdjvu\n" ;

# determiner le nombre de pages
$nbpages = `djvused "$inputdjvu" -e 'n'` ;
print "nombre total de pages : $nbpages" ;

for ($i=1 ; $i <= $nbpages ; $i++) {
  print "OCR de la page $i\n" ;

  # extraction de la page sous forme image
  `ddjvu -format=tiff -page="$i" "$inputdjvu" $imagetmp` ;

  `tesseract $imagetmp /tmp/outocr -l fra` ;
  print "OCR done\n" ;

  open(TXT, '/tmp/outocr.txt') ;
  open(TXTDJVU, ">$djvutmp") ;

  print TXTDJVU "(page 0 0 1 1\n" ;
  while ($line=<TXT>) {
    $line =~ s/\"/\\\"/g ;
    print TXTDJVU "(line 0 0 1 1 \"$line\")\n" ;
  }
  print TXTDJVU ")\n" ;

  close (TXT) ;
  close (TXTDJVU) ;

  # ecriture du txt dans le djvu
  `djvused "$inputdjvu" -e 'select $i; remove-txt' -s` ;
  `djvused "$inputdjvu" -e 'select $i; set-txt $djvutmp' -s` ;
}


# note : structure qui fonctionne
# print TXTDJVU "(page 0 0 1 1\n" ;
#   print TXTDJVU "     (line 0 0 1 1 \"toto\")\n" ;
#   print TXTDJVU "     (line 0 0 1 1 \"toto la la\")\n";
#   print TXTDJVU ")\n" ;

  1. Attention : ne pas lancer deux instances du script en parallèle sur deux livres différents (pour gagner du temps), les couches textes des deux livres se mélangent entre elles, et il faut tout recommencer.
  2. Pour faire la reconnaissance d’un texte ancien avec des ſ (s longs), il est plus efficace de modifier langue de reconnaissance de fra en Fraktur. Après avoir ajouté cette langue, comme indiqué pour la langue fra, il faut modifier la ligne du script : `tesseract $imagetmp /tmp/outocr -l fra` ; en `tesseract $imagetmp /tmp/outocr -l Fraktur` ;. On peut reconnaître également des textes multilingues en ajoutant les langues par ordre de priorités séparées par le signe + `tesseract $imagetmp /tmp/outocr -l fra+eng` ;.