FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Extraci贸n de datos de pdf via OCR
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Extraci贸n de datos de pdf via OCR
Posted: 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 (fw): Select all Collapse
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
Posts: 328
Joined: Fri May 19, 2006 04:08 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: 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
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Extraci贸n de datos de pdf via OCR
Posted: Wed Feb 05, 2014 09:22 PM

No me doy cuenta donde puedo bajar el acrobat que no sea el reader. Alguien sabe, Muchas gracias

Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Thu Feb 06, 2014 03: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

Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: Extraci贸n de datos de pdf via OCR
Posted: Thu Feb 06, 2014 03:13 PM

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

Saludos

Posts: 880
Joined: Fri Jan 12, 2007 08:35 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Fri Feb 07, 2014 03: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菨
Posts: 145
Joined: Wed Nov 03, 2010 09:16 AM
Re: Extraci贸n de datos de pdf via OCR
Posted: 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
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Fri Feb 07, 2014 02: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.
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Sat Feb 08, 2014 01: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

Posts: 492
Joined: Wed Nov 16, 2005 12:03 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Thu May 21, 2015 10:56 PM

Paco.
Gracias, saludos cordiales, alguna sintaxis o codigo PRG implementado para su utilizaci贸n

Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: 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 (fw): Select all Collapse
/*
聽* 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 (fw): Select all Collapse
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
鈥淚f you think education is expensive, try ignorance"
Posts: 989
Joined: Thu Nov 24, 2005 03:01 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: 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
鈥淚f you think education is expensive, try ignorance"
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Fri May 22, 2015 03: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.
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Mon Nov 30, 2015 05:03 PM
Master que me falta?

Code (fw): Select all Collapse
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 (fw): Select all Collapse
   LOCAL numPagPDFObj := CreateObject( "acroexch.pddoc" )


Gracias, saludos.
Jo茫o Santos - S茫o Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 492
Joined: Wed Nov 16, 2005 12:03 PM
Re: Extraci贸n de datos de pdf via OCR
Posted: Mon Apr 03, 2017 03: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 )