Extración de datos de pdf via OCR

Extración de datos de pdf via OCR

Postby mastintin » Wed Feb 05, 2014 11:04 am

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  Expand view  RUN


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

 
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Postby El Loco » Wed Feb 05, 2014 12:37 pm

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

Gracias.
Miguel
FWH 32/64 14.04
Harbour 3.2.0 (r1306211258)
PellesC
El Loco
 
Posts: 328
Joined: Fri May 19, 2006 4:08 pm
Location: Buenos Aires - Argentina

Re: Extración de datos de pdf via OCR

Postby horacio » Wed Feb 05, 2014 9:22 pm

No me doy cuenta donde puedo bajar el acrobat que no sea el reader. Alguien sabe, Muchas gracias
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Extración de datos de pdf via OCR

Postby mastintin » Thu Feb 06, 2014 3:07 pm

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
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Postby horacio » Thu Feb 06, 2014 3:13 pm

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

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Extración de datos de pdf via OCR

Postby AIDA » Fri Feb 07, 2014 3:18 am

Excelente :mrgreen:


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

I love Fivewin

séʌǝɹ ןɐ ɐʇsǝ opunɯ ǝʇsǝ
User avatar
AIDA
 
Posts: 879
Joined: Fri Jan 12, 2007 8:35 pm

Re: Extración de datos de pdf via OCR

Postby pgfdz » Fri Feb 07, 2014 10:38 am

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
pgfdz
 
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Extración de datos de pdf via OCR

Postby mastintin » Fri Feb 07, 2014 2:08 pm

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.
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Postby hmpaquito » Sat Feb 08, 2014 1:54 pm

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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Extración de datos de pdf via OCR

Postby jnavas » Thu May 21, 2015 10:56 pm

Paco.
Gracias, saludos cordiales, alguna sintaxis o codigo PRG implementado para su utilización
User avatar
jnavas
 
Posts: 479
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Re: Extración de datos de pdf via OCR

Postby Carlos Mora » Fri May 22, 2015 10:44 am

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  Expand view  RUN

/*
 * 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  Expand view  RUN

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: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Extración de datos de pdf via OCR

Postby Carlos Mora » Fri May 22, 2015 11:11 am

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"
Carlos Mora
 
Posts: 989
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: Extración de datos de pdf via OCR

Postby mastintin » Fri May 22, 2015 3:25 pm

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
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Extración de datos de pdf via OCR

Postby karinha » Mon Nov 30, 2015 5:03 pm

Master que me falta?

Code: Select all  Expand view  RUN

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  Expand view  RUN

   LOCAL numPagPDFObj := CreateObject( "acroexch.pddoc" )
 


Gracias, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7874
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Extración de datos de pdf via OCR

Postby jnavas » Mon Apr 03, 2017 3:52 am

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 )
User avatar
jnavas
 
Posts: 479
Joined: Wed Nov 16, 2005 12:03 pm
Location: Caracas - Venezuela

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: VictorCasajuana and 9 guests

cron