extractor de texto de un PDF

Re: extractor de texto de un PDF

Postby AIDA » Mon Jun 10, 2013 8:32 pm

Huyyyyyyyyyy el programita lee tu pdf pero lo estoy escuchando :shock:

esta largo escucho el contenido del PDF :?


por que pasas eso :?:


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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Mon Jun 10, 2013 8:38 pm

Paralo desde el administrador de tareas. Se puede parar por programación, pondré un ejemplo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: extractor de texto de un PDF

Postby AIDA » Mon Jun 10, 2013 8:45 pm

si ya lo pare

de pronto inicio a escucharse el audio del texto del PDf que me mandaste
pero no creo el TXT :shock:


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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Mon Jun 10, 2013 9:16 pm

El fichero debe estar en el directorio raiz de C:

Puedes cambiar el lugar en donde quieras que se cree modificando mi programa, busca por CurDrive()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: extractor de texto de un PDF

Postby AIDA » Mon Jun 10, 2013 9:21 pm

si el archivito pdf esta en c: :?

pero sigo escuchándolo y si uso otro pdf se atora :shock:



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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Mon Jun 10, 2013 11:16 pm

El que lo lea es algo que no es necesario, lo hice solo por probarlo, con llamar a la funcion GetText() consigues que se cree el fichero de texto
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: extractor de texto de un PDF

Postby AIDA » Tue Jun 11, 2013 11:06 pm

Hola

Me imagino que lo que se escucha es el curl.txt pero no lo encuentro en C: y por ningún lado como si estuviera invisible


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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Tue Jun 11, 2013 11:10 pm

Tienes permisos de escritura en C:\ ?

Quita la llamada a hb_CurDrive() en el código y asi se creará en donde estes ejecutando el EXE, o ponle el path que desees
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: extractor de texto de un PDF

Postby AIDA » Tue Jun 11, 2013 11:38 pm

okis ya por fin lo puedo ver :mrgreen:

ahora probare con un documento de los que tengo que sacar datos

y te comento


ya use un pdf que me dieron de ejemplo y el txt sale con pura basura :(


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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Wed Jun 12, 2013 12:20 am

Aida,

Algo que descubrí hace unos dias es que el contenido de un PDF es semi ascii, asi que puedes abrirlo con tu editor de código fuente (yo uso el visor del Total Commander) y busca por "/Filter /FlateDecode". Si no aparece, busca por "/Filter" y mira cual es la siguiente palabra.

De un PDF a otro el "filtro" que se use puede cambiar. El código que yo he publicado es para analizar el filtro /FlateDecode solamente y aun asi en ese pdf que te envié, descubri que habia que hacer una conversion posterior. Igual en tus PDFs no hace falta.

Junto al fichero TXT que se crea, se crea un archivo ".out" qu contiene el texto tal cual, sin ninguna interpretación. Igual ahi se ve bien.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: extractor de texto de un PDF

Postby AIDA » Wed Jun 12, 2013 12:40 am

a si esta

"/Filter /FlateDecode/length 7146/type/xobject

no me sale ningun achivito ".out" :?



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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby sysctrl2 » Wed Jun 12, 2013 5:11 pm

Aida,

entre las librerías del maestro William Morales,

tenemos una forma, de convertir pdf a txt

una vez en texto se puede extraer los datos

yo lo he hecho con archivos de hasta de 1500 paginas

si te interesa estamos en el skype o envianos un correo.
Saludos..
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Wed Jun 12, 2013 7:57 pm

Aida,

Si me envias por email uno de tus pdfs le echo un vistazo a ver si hay algo diferente :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: extractor de texto de un PDF

Postby AIDA » Fri Jun 14, 2013 3:28 pm

Hola Antonio :D

ya te mande el PDF a tu box privado de facebook :)

cuidate mucho :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: 877
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Postby Antonio Linares » Fri Jun 14, 2013 8:42 pm

Aida,

Prueba con esta versión. A mi me genera un fichero c:\curl.out en donde esta el texto :-)
No copio el resultado aqui por confidencialidad de los datos, si quieres te lo envio por email o facebook

Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   local oVoice := TOleAuto():New( "Sapi.SPVoice" )
   local cText := GetText( "c:\curl.pdf" )
   
   oVoice:Speak( "c:\curl.txt", 4 )

return nil

function GetText( cPdfFile )

   local cPDF := MemoRead( cPdfFile )
   local nStart := At( "stream", cPDF )
   local nEnd := At( "endstream", cPDF )
   local cBuf := Replicate( Chr( 0 ), ( nEnd - nStart ) * 10 )
   local cText, nResult, cTemp
   local hFile, cResult := ""
   local n := 1

   if ! File( hb_CurDrive() + ":\" + cFileNoExt( cPdfFile ) + ".out" )
      hFile = fcreate( hb_CurDrive() + "
:\" + cFileNoExt( cPdfFile ) + ".out", "wb" )
   else
      hFile = fopen( hb_CurDrive() + "
:\" + cFileNoExt( cPdfFile ) + ".out", "wb" )
   endif  

   while "
stream" $ cPDF
      nStart = At( "
stream", cPDF )
      nEnd = At( "
endstream", cPDF )
     
      if nStart == 0
         cPDF = "
"
         exit
      endif
         
      cBuf = Replicate( Chr( 0 ), ( nEnd - nStart ) * 10 )
      cText = SubStr( cPDF, nStart + 6, nEnd - nStart )

      if Left( cText, 1 ) == Chr( 0x0d ) .and. ;
         SubStr( cText, 2, 1 ) == Chr( 0x0a )
         nStart += 2
      elseif Left( cText, 1 ) == Chr( 0x0a )
         nStart++
      endif

      if SubStr( cText, nEnd - 2, 1 ) == Chr( 0x0d ) .and. ;
         SubStr( cText, nEnd - 1, 1 ) == Chr( 0x0a )
         nEnd -= 2
      elseif SubStr( cText, nEnd - 1, 1 ) == Chr( 0x0a )
         nEnd--
      endif

      HB_ZUNCOMPRESS( SubStr( cPDF, nStart + 6, nEnd - nStart ), @cBuf, @nResult )
      cTemp = cBuf
      /*
      while "
[" $ cTemp
         // OutputDebugString( "
dentro del bucle Translate" + CRLF )
         if ! "
]" $ cTemp
            exit
         endif  
         cResult += Translate( SubStr( cTemp, At( "
[", cTemp ), At( "]", cTemp ) - At( "[", cTemp ) + 1 ) )
         cTemp = SubStr( cTemp, At( "
]", cTemp ) + 1 )
      end  
      */

      // OutputDebugString( Str( Len( cPDF ) ) )
      // OutputDebugString( If( Empty( cPDF ), "
* Empty", " * not empty" ) + CRLF )
      ProcessOutput( hFile, cBuf )
      cPDF = SubStr( cPDF, nEnd + Len( "
endstream" ) + 1 )
   end

   // OutputDebugString( "
done" )
   FClose( hFile )
   MemoWrit( hb_CurDrive() + "
:\" + cFileNoExt( cPdfFile ) + ".txt", cResult )

return cResult

function Translate( cText )

   local cCode, cResult := "
"
   local nStart, nEnd, n
   
   cText = SubStr( cText, 2, Len( cText ) - 2 )
   
   while "
<" $ cText
      nStart = At( "
<", cText )
      nEnd = At( "
>", cText )
      cCode = SubStr( cText, nStart + 1, nEnd - nStart - 1 )
      for n = 1 to Len( cCode ) step 4
         cResult += Chr( hb_HextoNum( SubStr( cCode, n, 4 ) ) )
      next  
      if nEnd != 0
         cText = SubStr( cText, nEnd + 1 )
      else
         cText = "
"
      endif      
   end  
   
return cResult + "
"    

#pragma BEGINDUMP

#include <hbapi.h>
#include <wtypes.h>

#define oldchar 15

float ExtractNumber(const char* search, int lastcharoffset)
{
        float flt=-1.0;
        int i = lastcharoffset;
        char buffer[oldchar+5];

        while (i>0 && search[i]==' ') i--;
        while (i>0 && (isdigit(search[i]) || search[i]=='.')) i--;
        ZeroMemory(buffer,sizeof(buffer));
        strncpy(buffer, search+i+1, lastcharoffset-i);
        if (buffer[0] && sscanf(buffer, "
%f", &flt))
        {
                return flt;
        }
        return -1.0;
}
BOOL seen2(const char* search, char* recent)
{
if (    recent[oldchar-3]==search[0]
     && recent[oldchar-2]==search[1]
         && (recent[oldchar-1]==' ' || recent[oldchar-1]==0x0d ||
recent[oldchar-1]==0x0a)
         && (recent[oldchar-4]==' ' || recent[oldchar-4]==0x0d ||
recent[oldchar-4]==0x0a)
         )
        {
                return TRUE;
        }
        return FALSE;
}

#include <hbapifs.h>

int iPos = 0;

static int xputc( unsigned char c, FILE * fo )
{
   return hb_fsWriteAt( ( HB_FHANDLE ) fo, &c, 1, iPos++ );
}

void ProcessOutput(FILE* file, char* output, size_t len)
{
        //Are we currently inside a text object?
        BOOL intextobject = FALSE;

        //Is the next character literal (e.g. \\ to get a \ character or \( to get ( ):
        BOOL nextliteral = FALSE;

        //() Bracket nesting level. Text appears inside ()
        int rbdepth = 0;

        //Keep previous chars to get extract numbers etc.:
        char oc[oldchar];
        int j;
        size_t i;

        for (j=0; j<oldchar; j++)
           oc[j]=' ';

        for( i=0; i<len; i++)
        {
                unsigned char c = output[i];

                if (intextobject)
                {
                        if (rbdepth==0 && seen2("
TD", oc))
                        {
                                //Positioning.
                                //See if a new line has to start or just a tab:
                                float num = ExtractNumber(oc,oldchar-5);
                                if (num>1.0)
                                {
                                        xputc(0x0d, file);
                                        xputc(0x0a, file);
                                }
                                if (num<1.0)
                                {
                                        xputc('\t', file);
                                }
                        }
                        if (rbdepth==0 && seen2("
ET", oc))
                        {
                                //End of a text object, also go to a new line.
                                intextobject = FALSE;
                                xputc(0x0d, file);
                                xputc(0x0a, file);
                        }
                        else if (c=='(' && rbdepth==0 && !nextliteral)
                        {
        int num;
                                //Start outputting text!
                                rbdepth=1;
                                //See if a space or tab (>1000) is called for by looking
                                //at the number in front of (
                                num = ExtractNumber(oc,oldchar-1);
                                if (num>0)
                                {
                                        if (num>1000.0)
                                        {
                                                xputc('\t', file);
                                        }
                                        else if (num>100.0)
                                        {
                                                xputc(' ', file);
                                        }
                                }
                        }
                        else if (c==')' && rbdepth==1 && !nextliteral)
                        {
                                //Stop outputting text
                                rbdepth=0;
                        }
                        else if (rbdepth==1)
                        {
                                //Just a normal text character:
                                if (c=='\\' && !nextliteral)
                                {
                                        //Only print out next character no matter what. Do not interpret.
                                        nextliteral = TRUE;
                                }
                                else
                                {
                                        nextliteral = FALSE;
                                        if ( ((c>=' ') && (c<='~')) || ((c>=128) && (c<255)) )
                                        {
                                                xputc(c, file);
                                        }
                                }
                        }
                }
                //Store the recent characters for when we have to go back for a number:
                for (j=0; j<oldchar-1; j++) oc[j]=oc[j+1];
                oc[oldchar-1]=c;
                if (!intextobject)
                {
                        if (seen2("
BT", oc))
                        {
                                //Start of a text object:
                                intextobject = TRUE;
                        }
                }
        }
}

HB_FUNC( PROCESSOUTPUT )
{
   ProcessOutput( ( FILE * ) hb_parnl( 1 ), ( char * ) hb_parc( 2 ), hb_parclen( 2 ) );
}

#pragma ENDDUMP
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41315
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

PreviousNext

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 81 guests