Ir al contenido


Foto

ocr de pdf con delphi?


  • Por favor identifícate para responder
11 respuestas en este tema

#1 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 26 mayo 2012 - 05:52

A ver amigos, hoy me pregunto un cliente si se puede hacer lo siguiente:

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...
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 28 mayo 2012 - 04:10

Bueno, "escaneado con posibilidad de ocr" no existe, o está pasado por ocr con lo cual es texto y leerlo es "sencillo", o si está solo escaneado, es un JPEG dentro de un PDF, que parece ser el caso.

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!
  • 0

#3 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 28 mayo 2012 - 06:25

Gracias, Sergio por el dato, y como lees el archivo pdf si esta pasado por ocr?

(y) (y)


  • 0

#4 Garada

Garada

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 28 mayo 2012 - 03:43

Si no me equivoco a partir de la versión 1.5 del PDF permite capas (layers) y se puede tener una con la imagen y otra con el texto reconocido. Lo que permite buscar texto o seleccionar el texto de la imagen.

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
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 29 mayo 2012 - 07:51

Gracias, Sergio por el dato, y como lees el archivo pdf si esta pasado por ocr?

(y) (y)


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í).
  • 0

#6 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 30 mayo 2012 - 01:44

Gracias, lo estoy checando, ya que tambien ese mismo cliente me satura de trabajo, jejeje y ahorita urgen otras cosas, segun el, asi que lo voy a buscar con calma despues de termianr esto que le urge, porque se que lo del pdf lo va a quere de urgencia y pos ya conocemos a los clientes, jejeje

saludos, no cierro el post porque en cuanto encuentr algo vuelvo apostear, gracias y seguimos pendientes:

;) ;) (b)
  • 0

#7 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 31 mayo 2012 - 12:15

Saludos RAZADI..

Echale un OJO al contenido del siguiente link.. tal vez te sirva..

http://www.clubdelph...=66028&langid=1
  • 0

#8 memofer

memofer

    Member

  • Miembros
  • PipPip
  • 32 mensajes

Escrito 08 junio 2013 - 06:18

Una pregunta para el buen Sergio,
¿puedo ver PDFs en Delphi?
:cheesy:
  • 0

#9 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 10 junio 2013 - 08:04

Una pregunta para el buen Sergio,
¿puedo ver PDFs en Delphi?
:cheesy:


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.
  • 0

#10 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 12 junio 2013 - 07:15

Pues yo no uso el activeX de adobe, no necesito ver el PDF dentro de mi aplicación.

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):



delphi
  1. function  EjecutaFic(fic: string; mute: boolean = false): boolean;
  2. var
  3.   code: integer;
  4.   txt: string;
  5. begin
  6.   Result:= false;
  7.   //Pruebo a abrir el fichero...
  8.   code:= ShellExecute(Application.Handle,'', PChar(fic), nil, nil, SW_SHOW);
  9.  
  10.   if (code<0) or (code>32) then
  11.     Result:= true  //Todo ha ido bien
  12.   else begin
  13.     case code of //Algo ha ocurrido
  14.       0: txt := 'El sistema operativo se ha quedado sin memoria o recursos.';
  15.       2: txt := 'El archivo especificado no se ha encontrado.';
  16.       3: txt := 'La ruta especificada no es válida.';
  17.       5: txt := 'El sistema operativo denegó el '+
  18.                 'acceso al fichero especificado.';
  19.       8: txt := 'No hay suficiente memoria para completar la operación';
  20.       10: txt := 'Versión de Windows errónea.';
  21.       11: txt := 'El fichero .EXE es inválido (non-Win32 .EXE or '
  22.                           + 'error in .EXE image).';
  23.       12: txt := 'La aplicación se diseñó para un sistema operativo distinto.';
  24.       13: txt := 'La aplicación se diseño para MS-DOS 4.0';
  25.       15: txt := 'Intento de carga de un programa real-mode.';
  26.       16: txt := 'Intento de cargar una segunda instancia de una aplicación '+
  27.                 'sin segmentos de datos non-readonly.';
  28.       19: txt := 'Intento de carga de un fichero de aplicación comprimido.';
  29.       20: txt := 'Fallo en el fichero DLL (Dynamic-link library).';
  30.       26: txt := 'Violación de compartición.';
  31.       27: txt := 'El nombre de fichero asociado es incompleto o no es válido.';
  32.       28: txt := 'La transacción DDE no se pudo completar debido a que la petición expiró.';
  33.       29: txt := 'La transacción DDE falló.';
  34.       30: txt := 'La transacción DDE no se pudo completar debido a que otras '+
  35.                 'transacciones DDE estaban siendo procesadas.';
  36.       31: begin  //No hay programa asociado, abro formulario de abrir con...
  37.             shellexecute(Application.handle,'open','RUNDLL32.EXE',PChar('shell32.dll,OpenAs_RunDLL '+fic),nil,sw_shownormal);
  38.             Result:= true;
  39.             exit;
  40.           end;
  41.       32: txt := 'No se pudo encontrar la DLL especificada.';
  42.       else
  43.         txt := 'Error inesperado';
  44.     end;
  45.     //Si no estamos en mute, lanzo un mensaje con el error encontrado
  46.     if not mute then
  47.       ShowMessage('Error '+IntToStr(code)+': '+txt);
  48.   end;
  49. end;


  • 0

#11 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 12 junio 2013 - 07:28

Gracias a todos por sus aportaciones, indagando en este universo fantástico de información "Internet" encontré este código que al probarlo jalo bien, a lo que necesito me falta mucho que arreglar, pero ya esta el inicio, lo comparto para aquellos que estén en el mismo caso, gracias amigos  (y) (y) (y)



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, OleCtrls, AcroPDFLib_TLB, StdCtrls, acrobat_tlb;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     AcroPDF1: TAcroPDF;
  12.     Memo1: TMemo;
  13.     Label1: TLabel;
  14.     Label2: TLabel;
  15.     Label3: TLabel;
  16.     Label4: TLabel;
  17.     Label5: TLabel;
  18.     Button1: TButton;
  19.     OpenDialog1: TOpenDialog;
  20.     GroupBox1: TGroupBox;
  21.     procedure Button1Click(Sender: TObject);
  22.   private
  23.     { Private declarations }
  24.   public
  25.     { Public declarations }
  26.   end;
  27.  
  28. var
  29.   Form1: TForm1;
  30.  
  31. implementation
  32.  
  33. uses ComObj;
  34.  
  35. {$R *.dfm}
  36. {$TYPEDADDRESS OFF}
  37. var
  38.   PDDoc: Acrobat_TLB.CAcroPDDoc;
  39.   PDPage: Variant;
  40.   PDHili: Variant;
  41.   PDTextS: Variant;
  42.   acrobat: Variant;
  43.   Result: Boolean;
  44.   NTL, i, j, Pagecount: Integer;
  45.   zeilen: string;
  46.   stichwortcounter: Integer;
  47.   Size: Integer;
  48.   gesamtstring: AnsiString;
  49.   zwreal: Real;
  50.  
  51. procedure TForm1.Button1Click(Sender: TObject);
  52.   function removecrlf(workstring: string): string;
  53.   var
  54.     i: Integer;
  55.   begin
  56.     removecrlf := '';
  57.     for i := 0 to Length(workstring) do begin
  58.       if workstring[i] = #13 then
  59.         workstring[i] := ' ';
  60.       if workstring[i] = #10 then
  61.         workstring[i] := ' ';
  62.     end;
  63.     {}
  64.     removecrlf := workstring;
  65.   end;
  66. begin
  67.   if not opendialog1.Execute then Exit;
  68.  
  69.   memo1.Clear;
  70.  
  71.   gesamtstring := '';
  72.   stichwortcounter := 0;
  73.   Size := 0;
  74.   try
  75.     {Crear el objeto}
  76.     acrobat := CreateOleObject('AcroExch.pdDoc');
  77.     {Abrir el archivo PDF en el objeto}
  78.     Result := acrobat.Open(opendialog1.FileName);
  79.     {}
  80.     if Result = False then begin
  81.       messagedlg('Error', mtWarning, [mbOK], 0);
  82.       Exit;
  83.     end;
  84.     {}
  85.     for j := 0 to acrobat.GetNumPages - 1 do begin
  86.       memo1.Lines.Add('----------------------------------------------');
  87.       {Primera página del conjunto de documentos activos (primera página)}
  88.       PDPage := acrobat.acquirePage(j);
  89.       {Crear un objeto destacado con 2.000 elementos}
  90.       PDHili := CreateOleObject('AcroExch.HiliteList');
  91.       Result := PDHili.Add(0, 4096);
  92.       {Crear una marca en todo el texto}
  93.       PDTextS := PDPage.CreatePageHilite(PDHili);
  94.       {}
  95.       ntl := PDTextS.GetNumText;
  96.       {}
  97.       for i := 0 to ntl - 1 do begin
  98.         zeilen := PDTextS.GetText(i);
  99.         if (Length(zeilen) > 0) and (zeilen <> '') then
  100.           memo1.Lines.Add(removecrlf(zeilen));
  101.         gesamtstring := gesamtstring + removecrlf(zeilen);
  102.         {sólo para las estadísticas}
  103.         Size := Size + SizeOf(zeilen);
  104.         Inc(stichwortcounter);
  105.         {}
  106.         Application.ProcessMessages;
  107.       end;
  108.  
  109.       {Libero las variables}
  110.       pdhili        := Unassigned;
  111.       pdtextS        := Unassigned;
  112.       pdpage        := Unassigned;
  113.       label2.Caption := IntToStr(stichwortcounter);
  114.       label4.Caption := IntToStr(Size);
  115.       label2.Refresh;
  116.       label4.Refresh;
  117.     end;
  118.  
  119.  
  120.   except
  121.     on e: Exception do begin
  122.       messagedlg('Error: ' + e.Message, mtError, [mbOK], 0);
  123.       Exit;
  124.     end;
  125.   end;
  126.   if Size > 1024 then begin
  127.     zwreal := Size / 1024;
  128.     str(zwreal: 2: 1,zeilen);
  129.     label4.Caption := zeilen;
  130.     label5.Caption := 'KB';
  131.   end;
  132.   memo1.Lines.SaveToFile(Extractfilepath(Application.exename) + '\debug.txt');
  133. end;
  134.  
  135. 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

(b) (b) (b) (b) (b)
  • 0

#12 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 12 junio 2013 - 08:46

gracias por compartir la solución amigo..........
  • 0




IP.Board spam blocked by CleanTalk.