extractor de texto de un PDF

User avatar
AIDA
Posts: 782
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Post by AIDA »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

Antonio Linares
www.fivetechsoft.com
User avatar
AIDA
Posts: 782
Joined: Fri Jan 12, 2007 8:35 pm

Re: extractor de texto de un PDF

Post by AIDA »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

Re: extractor de texto de un PDF

Post by AIDA »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

Re: extractor de texto de un PDF

Post by AIDA »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

Re: extractor de texto de un PDF

Post by AIDA »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

Re: extractor de texto de un PDF

Post by AIDA »

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
sysctrl2
Posts: 833
Joined: Mon Feb 05, 2007 7:15 pm
Contact:

Re: extractor de texto de un PDF

Post by sysctrl2 »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

Re: extractor de texto de un PDF

Post by AIDA »

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
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: extractor de texto de un PDF

Post by Antonio Linares »

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

#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
Post Reply