
ocr de pdf con delphi?
#1
Posted 26 May 2012 - 05:52 PM
se los pongo literal -"Oye si yo te doy un archivo pdf que fue escaneado con posibilidad de OCR, puedes buscar dentro de este datos?"
a lo que yo le respondí, "si podría ser posible, sería cuentios de saber que información se este buscando y en que posicion buscarla", yo muy "chicho" y llegando a revisar en mi fabuloso delphi XE2, 2007 y 7 que tengo instalados y "ups" a canijo y como le hago para leer un pdf...
Ustedes amigos, han hecho algo similiar? o algun tip, que me pueda ayudar a ver que puedo hacer al respecto...
de antemano gracias por su ayuda...
#2
Posted 28 May 2012 - 04:10 AM
Así que necesitas convertir los PDF a JPEG primero, para eso hay herramientas tipo comando de msdos que sacan todas las imagenes de un PDF, se llama pdfimages.
Una vez tengas los JPEG/BMP/PNG o lo que sea, te toca hacer tú el OCR, bien con un componente que te lo haga o haciendote tu mismo la red neuronal (hay componentes, pero yo no conozco directamente ninguno), o pidiendoselo por COM a un programa de OCR que esté instalado Y permita ser usado remotamente (tampoco sé si esto existe).
Esto último del OCR es lo difícil, claro!
#3
Posted 28 May 2012 - 06:25 AM


#4
Posted 28 May 2012 - 03:43 PM
razadi, ¿Es eso lo que tienes, un PDF con la capa del OCR?
Si es así, ¿has probado a usar el Active-X del Adobe Reader para buscar en el documento? (Component, Import Component, ...)
O en cambio lo que tienes es un PDF sólo con la imagen y quieres añadirle la capa del OCR. Si es eso, ni idea. XD
#5
Posted 29 May 2012 - 07:51 AM
Gracias, Sergio por el dato, y como lees el archivo pdf si esta pasado por ocr?
![]()
Tienes comandos similares que te convierten un PDF de texto a txt, busca por google, yo he usado varios pero de memoria no recuerdo cual era mejor (si no lo localizas comentalo y te busco el que usamos por aquí).
#6
Posted 30 May 2012 - 01:44 PM
saludos, no cierro el post porque en cuanto encuentr algo vuelvo apostear, gracias y seguimos pendientes:



#7
Posted 31 May 2012 - 12:15 PM
Echale un OJO al contenido del siguiente link.. tal vez te sirva..
http://www.clubdelph...=66028&langid=1
#8
Posted 08 June 2013 - 06:18 PM
¿puedo ver PDFs en Delphi?

#9
Posted 10 June 2013 - 08:04 AM
Una pregunta para el buen Sergio,
¿puedo ver PDFs en Delphi?
No soy sergio pero me permito meter mi cucharota jajajaja. Es posible ver PDFs en Delphi. Es algo realmente super sencillo. Solo debes importar el Activex que proporciona Acrobat y listo.
#10
Posted 12 June 2013 - 07:15 AM
En su lugar, abro el PDF en una ventana aparte usando el programa asociado a .PDF en el sistema con esta función genérica (sirve para abrir cualquier fichero):
function EjecutaFic(fic: string; mute: boolean = false): boolean; var code: integer; txt: string; begin Result:= false; //Pruebo a abrir el fichero... code:= ShellExecute(Application.Handle,'', PChar(fic), nil, nil, SW_SHOW); if (code<0) or (code>32) then Result:= true //Todo ha ido bien else begin case code of //Algo ha ocurrido 0: txt := 'El sistema operativo se ha quedado sin memoria o recursos.'; 2: txt := 'El archivo especificado no se ha encontrado.'; 3: txt := 'La ruta especificada no es válida.'; 5: txt := 'El sistema operativo denegó el '+ 'acceso al fichero especificado.'; 8: txt := 'No hay suficiente memoria para completar la operación'; 10: txt := 'Versión de Windows errónea.'; 11: txt := 'El fichero .EXE es inválido (non-Win32 .EXE or ' + 'error in .EXE image).'; 12: txt := 'La aplicación se diseñó para un sistema operativo distinto.'; 13: txt := 'La aplicación se diseño para MS-DOS 4.0'; 15: txt := 'Intento de carga de un programa real-mode.'; 16: txt := 'Intento de cargar una segunda instancia de una aplicación '+ 'sin segmentos de datos non-readonly.'; 19: txt := 'Intento de carga de un fichero de aplicación comprimido.'; 20: txt := 'Fallo en el fichero DLL (Dynamic-link library).'; 26: txt := 'Violación de compartición.'; 27: txt := 'El nombre de fichero asociado es incompleto o no es válido.'; 28: txt := 'La transacción DDE no se pudo completar debido a que la petición expiró.'; 29: txt := 'La transacción DDE falló.'; 30: txt := 'La transacción DDE no se pudo completar debido a que otras '+ 'transacciones DDE estaban siendo procesadas.'; 31: begin //No hay programa asociado, abro formulario de abrir con... shellexecute(Application.handle,'open','RUNDLL32.EXE',PChar('shell32.dll,OpenAs_RunDLL '+fic),nil,sw_shownormal); Result:= true; exit; end; 32: txt := 'No se pudo encontrar la DLL especificada.'; else txt := 'Error inesperado'; end; //Si no estamos en mute, lanzo un mensaje con el error encontrado if not mute then ShowMessage('Error '+IntToStr(code)+': '+txt); end; end;
#11
Posted 12 June 2013 - 07:28 AM



unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, AcroPDFLib_TLB, StdCtrls, acrobat_tlb; type TForm1 = class(TForm) AcroPDF1: TAcroPDF; Memo1: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Button1: TButton; OpenDialog1: TOpenDialog; GroupBox1: TGroupBox; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses ComObj; {$R *.dfm} {$TYPEDADDRESS OFF} var PDDoc: Acrobat_TLB.CAcroPDDoc; PDPage: Variant; PDHili: Variant; PDTextS: Variant; acrobat: Variant; Result: Boolean; NTL, i, j, Pagecount: Integer; zeilen: string; stichwortcounter: Integer; Size: Integer; gesamtstring: AnsiString; zwreal: Real; procedure TForm1.Button1Click(Sender: TObject); function removecrlf(workstring: string): string; var i: Integer; begin removecrlf := ''; for i := 0 to Length(workstring) do begin if workstring[i] = #13 then workstring[i] := ' '; if workstring[i] = #10 then workstring[i] := ' '; end; {} removecrlf := workstring; end; begin if not opendialog1.Execute then Exit; memo1.Clear; gesamtstring := ''; stichwortcounter := 0; Size := 0; try {Crear el objeto} acrobat := CreateOleObject('AcroExch.pdDoc'); {Abrir el archivo PDF en el objeto} Result := acrobat.Open(opendialog1.FileName); {} if Result = False then begin messagedlg('Error', mtWarning, [mbOK], 0); Exit; end; {} for j := 0 to acrobat.GetNumPages - 1 do begin memo1.Lines.Add('----------------------------------------------'); {Primera página del conjunto de documentos activos (primera página)} PDPage := acrobat.acquirePage(j); {Crear un objeto destacado con 2.000 elementos} PDHili := CreateOleObject('AcroExch.HiliteList'); Result := PDHili.Add(0, 4096); {Crear una marca en todo el texto} PDTextS := PDPage.CreatePageHilite(PDHili); {} ntl := PDTextS.GetNumText; {} for i := 0 to ntl - 1 do begin zeilen := PDTextS.GetText(i); if (Length(zeilen) > 0) and (zeilen <> '') then memo1.Lines.Add(removecrlf(zeilen)); gesamtstring := gesamtstring + removecrlf(zeilen); {sólo para las estadísticas} Size := Size + SizeOf(zeilen); Inc(stichwortcounter); {} Application.ProcessMessages; end; {Libero las variables} pdhili := Unassigned; pdtextS := Unassigned; pdpage := Unassigned; label2.Caption := IntToStr(stichwortcounter); label4.Caption := IntToStr(Size); label2.Refresh; label4.Refresh; end; except on e: Exception do begin messagedlg('Error: ' + e.Message, mtError, [mbOK], 0); Exit; end; end; if Size > 1024 then begin zwreal := Size / 1024; str(zwreal: 2: 1,zeilen); label4.Caption := zeilen; label5.Caption := 'KB'; end; memo1.Lines.SaveToFile(Extractfilepath(Application.exename) + '\debug.txt'); end; end.
Y aquí un manual de como usarlo, vienen ejemplos en VB pero nada que nuestro bello lenguaje no pueda hacer, saludos y espero les sirva





#12
Posted 12 June 2013 - 08:46 AM