Cela fait des années (non, je ne plaisante pas) que je cherche à faire un petit bout de logiciel qui prend en entrée des PDF (en provenance directement d’un scanner… ce serait top) et qui les classe en fonction du contenu des PDF.
J’ai cherché plusieurs fois des solutions, mais à chaque fois, je tombais sur des lib qui utilisaient un service cloud pour faire l’OCR des PDF. Pas acceptable pour moi.
Et là hier soir, alors que je jouais avec nextcloud, je vois un pluggin OCR. Toujours curieux, je regarde un peu ce que cela implique. Je découvre alors qu’il utilise ‘tesseract.js’. WTF… un OCR en javascript !!
Il m’a pas fallut 10 minutes pour trouver l’équivalent en python (basé sur le binaire tesseract). 10 minutes de plus, et j’avais un container opérationnel capable de lire des PNG. Ensuite, j’ai un peu bricolé, et BIM… ouverture de PDF, extraction des images (JPG) et OCR sur les images.
Et dire que c’était aussi simple que ça !
Recipe
Dockerfile
FROM alpine
ENV HOSTNAME infra
ENV PS1 "[\h] \w \$ "
RUN apk add python3 && pip3 install --upgrade pip && pip3 install virtualenv
Lib python
apk add gcc
apk add make
apk add musl-dev
apk add python3-dev
apk add zlib-dev
apk add libjpeg
apk add jpeg-dev
pip install pytesseract
apk add tesseract-ocr
pip install PyPDF2
Paramétrage tesseract
wget https://github.com/tesseract-ocr/tessdata/raw/master/fra.traineddata
mkdir -p /usr/share/tessdata
mv fra.traineddata /usr/share/tessdata
Ouverture de PDF
pip install reportlab
wget https://raw.githubusercontent.com/ronanpaixao/PyPDFTK/master/pdf_images.py
Utilisation (lecture PNG)
import pytesseract
print(pytesseract.image_to_string(Image.open('test.png'), lang='fra'))
Utilisation (ouverture de pdf)
import PyPDF2
import pytesseract
import pdf_images
input1 = PyPDF2.PdfFileReader(open("test.pdf", "rb"))
page0 = input1.getPage(0)
pdf_images.extract_images(page0)
print(pytesseract.image_to_string(Image.open('IMG_0000.jpg'), lang='fra'))