Page 2 of 3

Re: extractor de texto de un PDF

PostPosted: Mon Jun 10, 2013 8:32 pm
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:

Re: extractor de texto de un PDF

PostPosted: Mon Jun 10, 2013 8:38 pm
by Antonio Linares
Paralo desde el administrador de tareas. Se puede parar por programación, pondré un ejemplo :-)

Re: extractor de texto de un PDF

PostPosted: Mon Jun 10, 2013 8:45 pm
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:

Re: extractor de texto de un PDF

PostPosted: Mon Jun 10, 2013 9:16 pm
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()

Re: extractor de texto de un PDF

PostPosted: Mon Jun 10, 2013 9:21 pm
by AIDA
si el archivito pdf esta en c: :?

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



Saluditos :wink:

Re: extractor de texto de un PDF

PostPosted: Mon Jun 10, 2013 11:16 pm
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

Re: extractor de texto de un PDF

PostPosted: Tue Jun 11, 2013 11:06 pm
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:

Re: extractor de texto de un PDF

PostPosted: Tue Jun 11, 2013 11:10 pm
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

Re: extractor de texto de un PDF

PostPosted: Tue Jun 11, 2013 11:38 pm
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:

Re: extractor de texto de un PDF

PostPosted: Wed Jun 12, 2013 12:20 am
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.

Re: extractor de texto de un PDF

PostPosted: Wed Jun 12, 2013 12:40 am
by AIDA
a si esta

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

no me sale ningun achivito ".out" :?



Saluditos :wink:

Re: extractor de texto de un PDF

PostPosted: Wed Jun 12, 2013 5:11 pm
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..

Re: extractor de texto de un PDF

PostPosted: Wed Jun 12, 2013 7:57 pm
by Antonio Linares
Aida,

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

Re: extractor de texto de un PDF

PostPosted: Fri Jun 14, 2013 3:28 pm
by AIDA
Hola Antonio :D

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

cuidate mucho :mrgreen:

Saluditos :wink:

Re: extractor de texto de un PDF

PostPosted: Fri Jun 14, 2013 8:42 pm
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  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