Como extrar texto desde un PDF ESCANEADO en Python

publicado por: Anonymous

Tengo el siguiente codigo que extrae o separa el pdf en imagenes, la idea es extraer una pagina en especifico y de esa imagen obtener el texto.

#extrae imagenes desde pdf
import sys

#definimos el pdf ->path
pdf = file(path, "rb").read()

startmark = "xffxd8"
startfix = 0
endmark = "xffxd9"
endfix = 2
i = 0

njpg = 0
while True:
    istream = pdf.find("stream", i)
    if istream < 0:
        break
    istart = pdf.find(startmark, istream, istream+20)
    if istart < 0:
        i = istream+20
        continue
    iend = pdf.find("endstream", istart)
    if iend < 0:
        raise Exception("no se encontro el fin de stream!")
    iend = pdf.find(endmark, iend-20)
    if iend < 0:
        raise Exception("no se encontro el fin de  JPG!")

    istart += startfix
    iend += endfix


    jpg = pdf[istart:iend]
    jpgfile = file("jpg%d.jpg" % njpg, "wb")
    jpgfile.write(jpg)
    jpgfile.close()

    njpg += 1
    i = iend    
print ("finalizado")

las imagenes que obtengo mediante esa funcion son algo asi:
Modelo de imagen obtenida

gracias cualquier sugerencia o comentario !!

solución

Agrego la respuesta si a alguien le sirviera:
Como sabemos el PDF escaneado es una conjunto de imagenes, es decir para poder extrar el texto tendriamos que pasar a imagenes y estas a texto.

Pasando pdf a imagenes:

#convertir pdf a imagen
    from wand.image import Image
    #estableciendo resolucion a imagen
    with Image(filename=path_absoluta, resolution=400) as img:
        #estableciendo ancho y alto
        img.resize(1850,1850)
        img.save(filename="media/normas/temp.jpg")

Como se nota uso wand , donde path_absoluta vendria a ser la ruta del pdf deseado y el numero de pagina a convertir a imagen.

Extrayendo el texto de la imagen:

import pytesseract
    from PIL import ImageEnhance, ImageFilter
    from PIL import Image as Img
    im = Img.open("media/normas/temp.jpg")
    im = im.filter(ImageFilter.MedianFilter())

    enhancer = ImageEnhance.Contrast(im)
    #aplicando filtro para mejorar la convercion de imagen->txt
    im = enhancer.enhance(15)
    im = im.convert('1')
    im.save('sample.jpeg')

    text = pytesseract.image_to_string(Img.open('sample.jpeg'), lang='spa')

En este caso he usado la imagen anterior(temp.jpg), he usado Pillow y sus filtros para crear una nueva mejora a la imagen anterior y luego de esto extraer el texto de dicha imagen.. y listo tendriamos todo en text.

Links:

Wand

Pillow

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *