Utilisateur:ElioPrrl/ocr djvu.py

Description modifier

Ce script permet de faire l’OCR d’un fichier DjVu à partir des images TIFF qui ont servi à le générer. Il nécessite d’avoir déjà installés :

  • Python 3 ;
  • Tesseract-OCR ;
  • DjVuLibre.
Entrées
  • les images TIFF de chaque page du livre (par exemple crées avec ScanTailor) ;
  • le fichier DjVu créé à partir de ces images TIFF (par exemple créé avec DjVuToy).
Sortie
  • le fichier DjVu océrisé avec Tesseract.

Utilisation modifier

Mettons que vous êtes dans la situation suivante :

Vous disposez des images TIFF de chaque page d’un livre de 500 pages, toutes rangées dans un même dossier, disons C:\Utilisateurs\Moi\TIFFS-Wikisource. Si ce n’est pas déjà fait, assurez-vous qu’elles portent toutes un nom formés sur le même patron et qu’elles sont rangées dans l’ordre (mettons pageTIFF-001.tif pour la première page, pageTIFF-002.tif pour la seconde, etc.[⚠ 1]), et créez un fichier DjVu à partir de ces images TIFF (par exemple avec DjVuToy), par exemple nommé monlivre.djvu et rangé dans un dossier C:\Utilisateurs\Moi\DjVu-Wikisource.

  1. Créez un fichier ocr_djvu.py sur votre ordinateur, et copiez-y le code ci-dessous ;
  2. Dans la section Variables à déclarer par l’utilisateur, remplacez les par vos chemins et noms de fichiers (les exemples donnés en commentaire dans le code correspondent à la situation décrite ci-dessus[⚠ 1]) ;
  3. Dans la section Plage du DjVu à océriser, remplacer 1 et 500 par le numéro de la première image et de la dernière image contenant du texte (si vous ne savez pas quelles pages en contiennent, remplacez seulement 500 par le nombre d’images) ;
  4. Exécutez le fichier ocr_djvu.py de la manière que vous préférez.

Sur ma machine, pour un livre format poche scanné à 300DPI, ce script traite une petite quinzaine de pages par minute.

Code modifier

import os
import pytesseract

## Variables à déclarer par l'utilisateur
# Emplacement de Tesseract
# (par exemple : C:\Program Files\Tesseract-OCR\tesseract)
pytesseract.pytesseract.tesseract_cmd = r'…'
# Emplacement de DjVuLibre
# (par exemple : C:\Program Files\DjVuLibre)
DjVuTools = r'…'
# Emplacement et nom complet (avec extension) du DjVu à océriser
# (par exemple : C:\Utilisateurs\Moi\DjVu-Wikisource\monlivre.djvu)
djvu = r'…'
# Emplacement et préfixe (= nom sans le numéro de page et l'extension) des images TIFF
# (par exemple : C:\Utilisateurs\Moi\TIFFS-Wikisource\pageTIFF-)
prefixe_tiff = r'…'
# Emplacement et nom complet du fichier texte temporaire n°1
# (par exemple : C:\Utilisateurs\Moi\DjVu-Wikisource\temp1.txt)
ftemp = r'…'
# Emplacement et nom complet du fichier texte temporaire n°2
# (par exemple : C:\Utilisateurs\Moi\DjVu-Wikisource\temp2.txt)
ftempbis = r'…'

## Plage du djvu à océriser
page_debut = 1
page_fin = 500


## Traitement
# pour chaque image :
for i in range(page_debut, page_fin+1):
	# nom de l’image (changez "3" en "2" ou "4" si vos pages sont numérotées avec moins ou plus de 3 chiffres)
	image = prefixe_tiff + "{:0=3}".format(i) + ".tif"
	# on l’océrise
	print("Page " + str(i), end=" : ")
	ocr = pytesseract.image_to_string(image, lang="fra")
	# on garde l’OCR dans un fichier txt
	ocr_text = open(ftemp, 'w', encoding="utf8")
	ocr_text.write(ocr)
	ocr_text.close()
	print("OCR", end=", ")
	# on convertit l’OCR pour qu’il soit lisible par djvused
	ocr_text = open(ftemp, 'r', encoding="utf8")
	djvu_text = open(ftempbis, 'w', encoding="utf8")
	page = "(page 0 0 1 1\n"
	for ligne in ocr_text:
		page += '(line 0 0 1 1 "%s")\n' % ligne.replace('\\', '\\\\').replace('"', '\\"').strip()
	page += ")\n"
	djvu_text.write(page)
	ocr_text.close()
	djvu_text.close()
	print("XML", end=", ")
	# on ajoute le texte au DjVu
	os.system(DjVuTools + "\djvused -e \"select " + str(i) + "; remove-txt\" " + djvu + " -s")
	os.system(DjVuTools + "\djvused -e \"select " + str(i) + "; set-txt " + ftempbis + "\" " + djvu + " -s")
	print("DjVu.")
# Suppression des fichiers temporaires
os.remove(ftemp)
os.remove(ftempbis)
  1. a et b J’ai supposé que le livre faisait entre 100 et 999 pages ; s’il est plus court ou plus long, et que vous images sont numérotées non pas 001, 002, etc., mais 01, 02, etc. ou 0001, 0002, etc., il faut changer, dans la première ligne de la boucle for, le 3 par la longueur des numéros, comme expliqué en commentaire.