Mon blog

python et datalove <3

Le script du jour n°5

J'adore lire de vieux manuels trouvés sur les internets. Le souci, c'est que la plupart du temps ces fichiers sont simplement des scans de livre et ne sont donc qu'un catalogue d'images.

Ainsi, il est impossible de faire une recherche dans le texte, ou de copier-coller facilement un bout de phrase intéressant.

Allez savoir pourquoi, j'ai décidé de tenter d'utiliser tesseract-ocr pour tenter de transformer quelques pages en texte, histoire de récupérer du texte, et de tester un ocr libre :o)

Bien entendu, cela ne fut pas aussi simple : tesseract-ocr ne sait pas lire des fichiers pdf directement... Et là, je suis tombé un peu par hasard sur un script permettant de découper un fichier pdf page par page, puis de transformer celles-ci en image (png ou jpg suivant vos envies / besoins) !

Ce script situé ici : https://gist.github.com/yura/670974 est alors secondé par un autre script ( https://gist.github.com/agurz/7c72653bf1923804f26b8c0211de4669 ) pour windows.

J'ai donc apporté ma pierre à l'édifice et j'ai rajouté de quoi convertir les images en fichiers texte grâce à l'ocr, puis reconstituer un fichier texte unique avec un bon vieux cat...

#!/bin/bash

# Script to convert PDF file to JPG images
#
# Dependencies:
# * pdftk
# * imagemagick
# * ghostscript
# * tesseract

PDF=$1

echo "Processing $PDF"
DIR=pdfs/`basename "$1" .pdf`

mkdir "$DIR"

echo '  Splitting PDF file to pages...'
pdftk "$PDF" burst output "$DIR"/page_%03d.pdf
pdftk "$PDF" dump_data output "$DIR"/metadata.txt

echo '  Converting pages to PNG files...'
for i in "$DIR"/*.pdf; do
  convert -colorspace RGB -interlace none -density 300 -quality 100 "$i" "$DIR"/`basename "$i" .pdf`.png
done

echo '  Converting PNG files to TXT files...'
for i in "$DIR"/*.png; do
  tesseract "$i" "$DIR"/`basename "$i" .png`
done

echo '  Mergin TXT files to final file...'
for i in "$DIR"/page*.txt; do
  cat "$i" >> "$DIR"/_final.txt
done

echo 'All done'

Une chose importante à noter c'est la structure de mes répertoires :

  • répertoire principal
    • /pdfs (ici, chaque pdf à convertir va provoquer la création d'un répertoire du même nom)
      • pdf_1.pdf
      • /pdf_1
        • _final.txt (le fichier texte final)
        • page_001.pdf (les pages du fichier pdf)
        • page_001.png (les pages converties en image)
        • page_001.txt (les pages converties en texte)
        • ...
        • page_xxx.pdf (les pages du fichier pdf)
        • page_xxx.png (les pages converties en image)
        • page_xxx.txt (les pages converties en texte)
        • doc_data.txt (fichier utilitaire)
        • metadata.txt (fichier utilitaire)
      • pdf_2.pdf
      • /pdf_2
    • /tesseract (l'outil d'ocr pour windows, puisqu'il n'a pas besoin d'être installé)

La version Windows équivalente :

: Script to convert PDF file to PNG images
:
: Dependencies:
: * pdftk
: * imagemagick
: * ghostscript
: * tesseract

@echo off & setlocal EnableDelayedExpansion

set PDF=%1

echo Processing %PDF%

for %%i in ("%PDF%") do (
  set DIR=%~dp0\pdfs\%%~ni
  set NAME=%%~ni
)

if not exist "%DIR%" mkdir "%DIR%"

echo   Splitting PDF file to pages...
pdftk "%PDF%" burst output "%DIR%\page_%%03d.pdf"
pdftk "%PDF%" dump_data output "%DIR%\metadata.txt"

echo   Converting pages to PNG files...
for %%f in ("%DIR%\*.pdf") do (
  for %%i in ("%%f") do set PNG=%DIR%\%%~ni.png
  magick -density 300 -quality 100 "%%f" "!PNG!"
)

echo   Converting PNG files to TXT files...
for %%f in ("%DIR%\*.png") do (
  for %%i in ("%%f") do tesseract\tesseract.exe %%f %DIR%\%%~ni
)

echo   Mergin TXT files to final file...
for %%f in ("%DIR%\page*.txt") do (
  for %%i in ("%%f") do type %%f >> %DIR%\_final.txt
)


echo All done