Extración de datos de pdf via OCR

Post Reply
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Extración de datos de pdf via OCR

Post by mastintin »

Comparto con todos un código que puede venir bien a alguien . Usa automatización ole con Acrobat ( ojo no vale el reader ) y extrae el texto de un pdf mediante OCR . Luego podemos extraer datos de ese texto .
Un posible uso es mediante automatización escanear formularios de clientes , examenes , etc ,( código ya puesto en el foro ) y recoger los datos de estos escaneos para luego tratarlos . ( correcion automática de examenes tipo test por ejemplo )

Code: Select all


Function extraerTextoPDF(cFilePdf)

// crearemos un objeto de tipo "pddoc" para el acceso al PDF

local numPagPDFObj := CreateObject("acroexch.pddoc")
local rutaFicheroPDF := cFilePdf
local lResultadoApertura := numPagPDFObj:Open(rutaFicheroPDF)
local numPaginas
local lResultadoCierre
local objPDF
local numeroPagina

// intentamos abrir el fichero pdf de acrobat

  If !lResultadoApertura
    numPagPDFObj := nil
    MsgInfo( "Error al intentar abrir el fichero pdf indicado. " + ;
        "Puede que no sea un PDF de adobe o que el " + ;
        "fichero esté corrupto." )
    Return .f.
  EndIf

// obtenemos el número de páginas del documento pdf

  numPaginas = numPagPDFObj:GetNumPages()

  lResultadoCierre = numPagPDFObj:Close()

  If !lResultadoCierre
    numPagPDFObj := nil
    MsgInfo( "Error al intentar cerrar el fichero pdf indicado. " )
    Return .f.
  EndIf

  numPagPDFObj := nil

  objPDF = CreateObject("acroexch.pddoc")

  lResultadoApertura = objPDF:Open(rutaFicheroPDF)
  For numeroPagina = 0 To numPaginas - 1

   obtenerTextoPaginaPDF(  numeroPagina , objPDF )
   mensa("Extrayendo : " +alltrim(str( numeroPagina + 1 ))+ ;
        " de " +alltrim(str( numPaginas )) )

  Next
  objPDF := nil
  mensa()
  msginfo("Nº de páginas extraídas del pdf:" +alltrim(str( numPaginas  )) )


Return nil


Function obtenerTextoPaginaPDF( numPagina, ObjPDF )
 local i
 local pagPDF
 local pagHilitelist
 local resultadoHilitelist
 local pagActual
 local datosPDF := ""

//  creamos un objeto de página pdf, desde una página especificada
  pagPDF := objPDF:AcquirePage(numPagina)

//  crearemos un objeto "hilitelist", lo utilizaremos para extraer el texto
  pagHilitelist := CreateObject("acroexch.hilitelist")

  resultadoHilitelist = pagHilitelist:Add(0, 9000)

  pagActual = pagPDF:CreatePageHilite(pagHilitelist)

  For i = 0 To pagActual:GetNumText() - 1

      datosPDF = datosPDF + pagActual:GetText(i)

  Next

  msginfo( datospdf )

  ExtraerDatodelTexto ( datospdf ,"orden de domiciliación:" , CRLF )

  pagPDF := Nil
  pagHilitelist := Nil
  pagActual := Nil

Return .t.

//------------------------------------------------------------------------------

FUNCTION ExtraerDatodelTexto ( cTexto ,cTextoAntes , cTextoDespues )

LOCAL nLenTextoAntes := Len( cTextoAntes )
LOCAL nLenTextoDespues := Len( cTextoDespues )
LOCAL nInicio := At(cTextoAntes,cTexto)  + nLenTextoAntes
LOCAL nFin :=  At(cTextoDespues,cTexto)
LOCAL cDato := ""

IF nFin  == 0
   nFin := nil
endif

  IF nInicio != 0
     cDato := SubStr( cTexto , nInicio , nFin )
  ELSE
     msginfo("no se encuentra el delimitador inicial")
     cDato := ""
  endif
  msginfo( cDato )


RETURN nil

 
El Loco
Posts: 220
Joined: Fri May 19, 2006 4:08 pm

Re: Extración de datos de pdf via OCR

Post by El Loco »

Mastintin, espectacular!!!.... funciona de diez.

Gracias.
Miguel
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Extración de datos de pdf via OCR

Post by horacio »

No me doy cuenta donde puedo bajar el acrobat que no sea el reader. Alguien sabe, Muchas gracias
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Post by mastintin »

aqui tienes una version de prueba , luego a pagar ....eso si, para una empresa vale cada céntimo que cuesta .
https://www.acrobat.com/free-trial-download.html
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Extración de datos de pdf via OCR

Post by horacio »

Muchísimas gracias Mastintin, haré unas pruebas y si a la empresa le interesa veremos de comprarlo. Gracias nuevamente.

Saludos
User avatar
AIDA
Posts: 782
Joined: Fri Jan 12, 2007 8:35 pm

Re: Extración de datos de pdf via OCR

Post by AIDA »

Excelente :mrgreen:


Saluditos :wink:
Que es mejor que programar? creo que nada :)
Atropellada pero aqui ando :P

I love Fivewin

séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
pgfdz
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Extración de datos de pdf via OCR

Post by pgfdz »

Hola.
Os cuento mi experiencia con OCR. He instalado un programa que se llama FreeOCR y resulta que sólo pone la interface gráfica, que el ocr lo hace con una línea de comandos que se llama tesseract.exe y que se puede invocar desde cualquier programa.
Tesseract es opensouce, (corregirme si me equivoco), y funciona muy bien.

http://www.paperfile.net/help.html

Al instalarlo crea un directorio en c:\freeOCR y allí está el exe que necesitamos.

c:\FreeOCR>tesseract.exe
Usage:tesseract.exe imagename outputbase [-l lang] [-psm pagesegmode] [configfil
e...]
pagesegmode values are:
0 = Orientation and script detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform block of vertically aligned text.
6 = Assume a single uniform block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
-l lang and/or -psm pagesegmode must occur before anyconfigfile.

c:\FreeOCR>

Un saludo
Paco García
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Post by mastintin »

pgfdz wrote:Hola.
Os cuento mi experiencia con OCR. He instalado un programa que se llama FreeOCR y resulta que sólo pone la interface gráfica, que el ocr lo hace con una línea de comandos que se llama tesseract.exe y que se puede invocar desde cualquier programa.
Tesseract es opensouce, (corregirme si me equivoco), y funciona muy bien.

....

Un saludo
Esta es una buena opción cuando solo se requiere recoger datos , y el cliente no está dispuesto a pagar acrobat . Cuando es para por ejemplo un colegio ( puede pagar el valor de Acrobat ) y lo que se pretende es una solución mas completa ,a ese programa tendrías que sumar una dll o otro programa para el scaneo y archivo de los documentos . Cuantos mas programas externos a configurar mas posibilidad existe que falle algo .
Con OLE Acrobat puedes "automatizar" toda la tarea , ósea, pongo un taco de hojas ( "exámenes") a scanner en un escáner con alimentador y en nuestro programa le damos aceptar en un botón y , realizo el scaneo, le paso el ocr , detecto el código del documento ( podría ser en nif de un alumno por ejemplo ) , le asigno un nombre , lo archivo donde yo quiera y anoto la relación código documento -> /path/nobre.pdf en el registro de la base de datos correspondiente , todo con un solo programa auxiliar . Ten en cuenta que acrobat a demás permite "sellar" los documentos con un certificado digital que los valida ante cualquier organismo oficial , creación de formularios automatizados y muchas mas cosas . Que conste que no Vendo Acrobat :-))) , pero me ha tocado lidiar con el tema de formularios y demás y existe todo un mundo de posibilidades.
Gracias por la recomendación , para proyectos donde no se pueda disponer de Acrobat ( Alto precio ) es una buena opción.
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Extración de datos de pdf via OCR

Post by hmpaquito »

Mastintin (y otros)

Gracias por el aporte. Aunque ahora mismo no lo necesito... es bueno saber que por ahí "hay abierta una puerta" :D

Gracias nuevamente
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Extración de datos de pdf via OCR

Post by jnavas »

Paco.
Gracias, saludos cordiales, alguna sintaxis o codigo PRG implementado para su utilización
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Extración de datos de pdf via OCR

Post by Carlos Mora »

Hola Juan,
jnavas wrote:alguna sintaxis o codigo PRG implementado para su utilización
Yo he usado el código de Mastintín tal como está, quité la función Mensa() y le puse el nombre de un pdf existente a la variable y me funcionó. Te pego el código por si quieres probarlo:

Code: Select all

/*
 * Proyecto: Scanner
 * Fichero: OCR.prg
 * Descripción:
 * Autor:
 * Fecha: 22/05/2015
 */

#include 'FiveWin.ch'
FUNCTION extraerTextoPDF(  )

   // crearemos un objeto de tipo "pddoc" para el acceso al PDF

   LOCAL numPagPDFObj := CreateObject( "acroexch.pddoc" )
   LOCAL rutaFicheroPDF := "C:\Nominas.pdf"                    // <------ Acá tu fichero de pruebas
   LOCAL lResultadoApertura := numPagPDFObj:Open( rutaFicheroPDF )
   LOCAL numPaginas
   LOCAL lResultadoCierre
   LOCAL objPDF
   LOCAL numeroPagina

   // intentamos abrir el fichero pdf de acrobat

   IF !lResultadoApertura
      numPagPDFObj := nil
      MsgInfo( "Error al intentar abrir el fichero pdf indicado. " + ;
         "Puede que no sea un PDF de adobe o que el " + ;
         "fichero esté corrupto." )
      RETURN .F.
   ENDIF

   // obtenemos el número de páginas del documento pdf

   numPaginas = numPagPDFObj:GetNumPages()

   lResultadoCierre = numPagPDFObj:Close()

   IF !lResultadoCierre
      numPagPDFObj := nil
      MsgInfo( "Error al intentar cerrar el fichero pdf indicado. " )
      RETURN .F.
   ENDIF

   numPagPDFObj := nil

   objPDF = CreateObject( "acroexch.pddoc" )

   lResultadoApertura = objPDF:Open( rutaFicheroPDF )
   FOR numeroPagina = 0 TO numPaginas - 1

      obtenerTextoPaginaPDF(  numeroPagina, objPDF )

   NEXT
   objPDF := nil
   msginfo( "Nº de páginas extraídas del pdf:" + AllTrim( Str( numPaginas  ) ) )

RETURN NIL


FUNCTION obtenerTextoPaginaPDF( numPagina, ObjPDF )

   LOCAL i
   LOCAL pagPDF
   LOCAL pagHilitelist
   LOCAL resultadoHilitelist
   LOCAL pagActual
   LOCAL datosPDF := ""

   //  creamos un objeto de página pdf, desde una página especificada
   pagPDF := objPDF:AcquirePage( numPagina )

   //  crearemos un objeto "hilitelist", lo utilizaremos para extraer el texto
   pagHilitelist := CreateObject( "acroexch.hilitelist" )

   resultadoHilitelist = pagHilitelist:Add( 0, 9000 )

   pagActual = pagPDF:CreatePageHilite( pagHilitelist )

   FOR i = 0 TO pagActual:GetNumText() - 1

      datosPDF = datosPDF + pagActual:GetText( i )

   NEXT

   msginfo( datospdf )

   ExtraerDatodelTexto ( datospdf,"orden de domiciliación:", CRLF )

   pagPDF := Nil
   pagHilitelist := Nil
   pagActual := Nil

RETURN .T.

//------------------------------------------------------------------------------

FUNCTION ExtraerDatodelTexto ( cTexto,cTextoAntes, cTextoDespues )

   LOCAL nLenTextoAntes := Len( cTextoAntes )
   LOCAL nLenTextoDespues := Len( cTextoDespues )
   LOCAL nInicio := At( cTextoAntes, cTexto )  + nLenTextoAntes
   LOCAL nFin :=  At( cTextoDespues, cTexto )
   LOCAL cDato := ""

   IF nFin  == 0
      nFin := nil
   ENDIF

   IF nInicio != 0
      cDato := SubStr( cTexto, nInicio, nFin )
   ELSE
      msginfo( "no se encuentra el delimitador inicial" )
      cDato := ""
   ENDIF
   msginfo( cDato )

RETURN NIL


 
Mastintín,

Te hago una consulta: Si el pdf tiene texto (que en acrobat se puede copiar y pegar como texto) me funciona correctamente, pero si lo que tengo son imágenes puras, no me lee nada y me casca:

Code: Select all

Application
===========
   Path and name: V:\Carlos\Scanner\Scanner.exe (32 bits)
   Size: 2,874,368 bytes
   Compiler version: Harbour 3.2.0dev (Rev. 18881)
   FiveWin  Version: FWH 13.09
   Windows version: 6.1, Build 7601 Service Pack 1

   Time from start: 0 hours 0 mins 0 secs 
   Error occurred at: 05/22/15, 12:40:38
   Error description: Error BASE/1004  No exported method: GETNUMTEXT
   Args:
     [   1] = U   

Stack Calls
===========
   Called from:  => GETNUMTEXT( 0 )
   Called from: OCR.prg => OBTENERTEXTOPAGINAPDF( 79 )
   Called from: OCR.prg => EXTRAERTEXTOPDF( 51 )

 
aparentemente lo que falla es pagPDF:CreatePageHilite( pagHilitelist ). ¿Alguna idea?

Si el fichero contiene texto funciona como un tiro.

Gracias!
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Extración de datos de pdf via OCR

Post by Carlos Mora »

Mastintin,

Te pido un favor ¿Tienes algun pdf que sea imagen escaneada y que el Acrobat lo lea? Es que estoy probando y no hay caso, no logro que me lea nada. Si le pongo alguno con texto interno, va perfectamente.

Es como si no hiciese OCR, solo coge los textos.

Un saludo
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
User avatar
mastintin
Posts: 1502
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Post by mastintin »

Carlos Mora wrote:Mastintin,

Te pido un favor ¿Tienes algun pdf que sea imagen escaneada y que el Acrobat lo lea? Es que estoy probando y no hay caso, no logro que me lea nada. Si le pongo alguno con texto interno, va perfectamente.

Es como si no hiciese OCR, solo coge los textos.

Un saludo
No sabía decirte . Te pongo un ejemplo de uso que está funcionando .
Se generan unas ordenes SEPA con los datos preimpresos para que los clientes los firmen , estas ordenes están numeradas y se escanean a pdf para su custodia .
cuando se realiza su escaneo , se realiza un proceso de Acrobat_>herramientas->reconocimiento de texto->en archivo y se guardan . El programa es capaz de comprobar dentro de los ficheros pdf el numero de referencia.
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Extración de datos de pdf via OCR

Post by karinha »

Master que me falta?

Code: Select all

Application
===========
   Path and name: C:\FWH1505\samples\OCR.exe (32 bits)
   Size: 3,082,752 bytes
   Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20150603)
   FiveWin  Version: FWHX 15.05
   Windows version: 6.1, Build 7601 Service Pack 1

   Time from start: 0 hours 0 mins 0 secs 
   Error occurred at: 11/30/15, 15:01:12
   Error description: Error TOleAuto/65535  : TOLEAUTO:NEW
   Args:
     [   1] = C   acroexch.pddoc
     [   2] = U   
     [   3] = U   

Stack Calls
===========
   Called from:  => THROW( 0 )
   Called from: source\rtl\win32ole.prg => TOLEAUTO:NEW( 0 )
   Called from: source\rtl\win32ole.prg => CREATEOBJECT( 0 )
   Called from: OCR.prg => EXTRAERTEXTOPDF( 15 )
 
Linea 15:

Code: Select all

   LOCAL numPagPDFObj := CreateObject( "acroexch.pddoc" )
 
Gracias, saludos.
João Santos - São Paulo - Brasil
User avatar
jnavas
Posts: 399
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela
Contact:

Re: Extración de datos de pdf via OCR

Post by jnavas »

Saludos
Compilando con HB + FWH17.02
pplication
===========
Path and name: C:\fwh17\samples\orc.exe (32 bits)
Size: 3,676,672 bytes
Compiler version: Harbour 3.2.0dev (r1603082110)
FiveWin version: FWH 17.02
C compiler version: Borland/Embarcadero C++ 7.0 (32-bit)
Windows version: 5.1, Build 2600 Service Pack 3

Time from start: 0 hours 0 mins 0 secs
Error occurred at: 04/02/17, 23:54:18
Error description: Error TOleAuto/-1 CO_E_CLASSSTRING: TOLEAUTO:NEW
Args:
[ 1] = C acroexch.pddoc
[ 2] = U
[ 3] = U

Stack Calls
===========
Called from: => THROW( 0 )
Called from: xhb\xhbole.prg => TOLEAUTO:NEW( 0 )
Called from: xhb\xhbole.prg => CREATEOBJECT( 0 )
Called from: orc.prg => EXTRAERTEXTOPDF( 15 )
Post Reply