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 est alors secondé par un autre script 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
- etc...
- tesseract (l'outil d'ocr pour windows, puisqu'il n'a pas besoin d'être installé)
- pdfs (ici, chaque pdf à convertir va provoquer la création d'un répertoire du même nom)
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