Page 2 of 3
Re: extractor de texto de un PDF
Posted: Mon Jun 10, 2013 8:32 pm
by AIDA
Huyyyyyyyyyy el programita lee tu pdf pero lo estoy escuchando
esta largo escucho el contenido del PDF
por que pasas eso
Saluditos

Re: extractor de texto de un PDF
Posted: 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
Posted: 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
Saluditos

Re: extractor de texto de un PDF
Posted: 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
Posted: 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
Saluditos

Re: extractor de texto de un PDF
Posted: 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
Posted: 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

Re: extractor de texto de un PDF
Posted: 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
Posted: Tue Jun 11, 2013 11:38 pm
by AIDA
okis ya por fin lo puedo ver
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

Re: extractor de texto de un PDF
Posted: 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
Posted: 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

Re: extractor de texto de un PDF
Posted: 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
Posted: 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
Posted: Fri Jun 14, 2013 3:28 pm
by AIDA
Hola Antonio
ya te mande el PDF a tu box privado de facebook
cuidate mucho
Saluditos

Re: extractor de texto de un PDF
Posted: 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
#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