symac

Ajouter une couche OCR à un PDF image avec des solutions libres

Il y a quelques temps j'ai été amené à traiter des fichiers PDF numérisés sans couche OCR avec la demande de leur ajouter cette couche manquante pour permettre une recherche plein texte et un copier/coller des contenus. Comme je n'ai pas trouvé de solution simple clé en main avec des outils libres je vais stocker ici pour mémoire les étapes que j'ai enchaînées (script aussi disponible sur github)

filename=$1
filenamebase=$(basename -- "$filename")
filenamebase="${filenamebase%.*}"
lang=$2
rotate=$3
echo "FILENAME : "$filename
echo "FILENAME BASE : "$filenamebase

echo "LANG : "$lang

# 1. Génération des PNG
if [ $rotate == 1 ]
then
    echo "Génération des PNG (rotation)"
    gs -q -dSAFER -dBATCH -dNOPAUSE -r300 -sDEVICE=pnggray -dTextAlphaBits=4 -sOutputFile=src_png/$filenamebase/img_%0.4d.png -c "<</Orientation 3>> setpagedevice" -f src_pdf/$filename
else
    echo "Génération des PNG (pas de rotation)"
    gs -q -dSAFER -dBATCH -dNOPAUSE -r300 -sDEVICE=pnggray -dTextAlphaBits=4 -sOutputFile=src_png/$filenamebase/img_%0.4d.png -f src_pdf/$filename
fi

# 2. Génération de la liste de fichiers
ls src_png/$filenamebase/*png > src_png/$filenamebase/liste.txt

# 3. Application de tesseract
tesseract -l $lang src_png/$filenamebase/liste.txt output/$filenamebase pdf

# 4. Réduction de la taille du fichier
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook  -dNOPAUSE  -dBATCH -sOutputFile=output_small/$filename -f "output/$filename"

Le principe est assez simple, on enchaîne les étapes suivantes :

  • création d'un PNG par page du PDF initial à l'aide de ghostscript
  • création d'un fichier texte qui contient la liste exhaustive des PNG constituant le document
  • génération d'un PDF ocrisé à partir de la liste des PNG via Tesseract, c'est là que se fait l'OCR à proprement parler
  • le PDF généré à l'étape précédente est un peu lourd, on utilise donc ghostscript avec les settings ebook pour obtenir un résultat plus léger tout en restant exploitable. Sans l'application de ce traitement on se retrouve avec un PDF qui contient les PNG, alors qu'après ce traitement, ce sont des JPG compressés qui sont intégrés, réduisant grandement la taile.