Pdf a variable - SOLUCIONADO

Post Reply
User avatar
leandro
Posts: 1744
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 34 times
Been thanked: 10 times
Contact:

Pdf a variable - SOLUCIONADO

Post by leandro »

Buenas noches para todos

Como dice el encabezado, requiero pasar un archivo pdf a una variable de tipo caracter; buscando el foro encontré varias opciones las cuales relaciono a continuación:

Primera forma:

Code: Select all | Expand


    cText := memoread( "c:\xpmake\factura.pdf" )
    memoedit(cText)
 

De esta forma me coloca la información en una variable, pero únicamente me devuelve lo siguiente:

Code: Select all | Expand


%PDF-1.3
2 0 obj
<<
/Type /Page /Parent 1 0 R
/Resources 3 0 R
/MediaBox [ 0 0 595.00 842.00 ]
/Contents 4 0 R
>>
endobj
3 0 obj
<<
/ColorSpace << /DeviceRGB /DeviceGray >>
/ProcSet [ /PDF /Text /ImageB /ImageC ]
/XObject
<<
/Image1 6 0 R
>>
>>
endobj
4 0 obj << /Length 5 0 R

>>
stream

q
595.0 0 0 842.0 0 0 cm
/Image1 Do
Q
endstream
endobj
5 0 obj
43
endobj
6 0 obj
<<
/Type /XObject
/Subtype /Image
/Name /Image1
/Filter [ /DCTDecode ]
/Width 2450
/Height 3200
/BitsPerComponent 8
/ColorSpace/DeviceRGB
/Length 141487
>>
stream
ÿØÿà
 


Abrí el archivo con un editor de texto y me di cuenta que muestra correctamente la información hasta que llega a los caracteres desconocidos NUL DLE, adjunto imagen.

Image

Segunda forma:

Code: Select all | Expand


    fMimeEnc( "c:\xpmake\factura.pdf", "c:\xpmake\factura")
    cText := MemoRead( "c:\xpmake\factura" )
    memoedit(cText)
 


De esta manera me devuelve un archivo codificado, más o menos así (solo parte del dato es muy largo)

Code: Select all | Expand


JVBERi0xLjMNCjIgMCBvYmoNCjw8DQovVHlwZSAvUGFnZSAvUGFyZW50IDEgMCBSDQovUmVzb3Vy
Y2VzIDMgMCBSDQovTWVkaWFCb3ggWyAwIDAgNTk1LjAwIDg0Mi4wMCBdDQovQ29udGVudHMgNCAw
IFINCj4+DQplbmRvYmoNCjMgMCBvYmoNCjw8DQovQ29sb3JTcGFjZSA8PCAvRGV2aWNlUkdCIC9E
ZXZpY2VHcmF5ID4+DQovUHJvY1NldCBbIC9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIF0NCi9Y
T2JqZWN0DQo8PA0KL0ltYWdlMSA2IDAgUg0KPj4NCj4+DQplbmRvYmoNCjQgMCBvYmogPDwgL0xl
bmd0aCA1IDAgUiANCg0KPj4NCnN0cmVhbQ0KDQpxDQo1OTUuMCAwIDAgODQyLjAgMCAwIGNtDQov
SW1hZ2UxIERvDQpRIA0KZW5kc3RyZWFtDQplbmRvYmoNCjUgMCBvYmoNCjQzDQplbmRvYmoNCjYg
MCBvYmoNCjw8DQovVHlwZSAvWE9iamVjdA0KL1N1YnR5cGUgL0ltYWdlDQovTmFtZSAvSW1hZ2Ux
DQovRmlsdGVyIFsgL0RDVERlY29kZSBdDQovV2lkdGggMjQ1MA0KL0hlaWdodCAzMjAwDQovQml0
c1BlckNvbXBvbmVudCA4DQovQ29sb3JTcGFjZS9EZXZpY2VSR0INCi9MZW5ndGggMTQxNDg3DQo+
Pg0Kc3RyZWFtDQr/2P/gABBKRklGAAEBAQBgAGAAAP/bAEMAyIqWr5Z9yK+jr+HVyO7/////////
///////////////////////////////////////////////////////////bAEMB1eHh////////
///////////////////////////////////////////////////////////////////////////A
ABEIDIAJkgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAAC
AQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZ
GiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOU
lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T1
9vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAAB
.....

continua
 

Quisiera saber en qué forma está codificada esta información?

Para resumir y si alguien pudiera darme una mano. Lo que necesito hacer es leer un archivo pdf y codificarlo en base64 para ser enviado a un WS.

Muchas gracias
Last edited by leandro on Wed May 15, 2019 2:24 pm, edited 1 time in total.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
karinha
Posts: 7933
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Been thanked: 3 times
Contact:

Re: Pdf a variable

Post by karinha »

Una idéa,

Code: Select all | Expand


FUNTION LeerPdf()

   cPath := 'c:\temp\Pedido.pdf'
   cTemp := 'c:\temp\temp001.tmp'
 
   FMimeEnc(cPath,cTemp)

   cMemo:=memoread(cTemp)
   cMemo:=STRTRAN(cMemo,CRLF,'')

   REPLACE temp->mImag with cMemo

   ferase(cTemp)
   ferase(cPath)

   cMemo := temp->mImag

   cTemp := 'c:\temp\temp002.tmp'
   cPath := 'c:\temp\Pedido.pdf'

   MEMOWRIT(cTemp,cMemo)
         
   FMimeDec(cTemp,cPath)
         
   ferase(cTemp)

RETURN NIL

Ó,

Function Pdf2Str(cFilePdf)

   Local cMemo := ""

   cMemo := MemoRead(cFilePdf)

   cMemo := StrToHex(cMemo)

Return cMemo

// gera um arquivo PDF atraves de uma string

Function Str2Pdf(cMemo,cFilePdf)

   Local cTexto := cMemo

   cTexto := HexToStr(cTexto)

   fErase(cFilePdf)

   MemoWrit(cFilePdf,cTexto)

Return .t.
 


Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
leandro
Posts: 1744
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 34 times
Been thanked: 10 times
Contact:

Re: Pdf a variable

Post by leandro »

karinha, muchas gracias.

Sirvió la idea :D

Quedó así:

Code: Select all | Expand


    fMimeEnc( "c:\xpmake\factura.pdf", "c:\xpmake\factura")
    cText := MemoRead( "c:\xpmake\factura" )
    cText := STRTRAN(cText,CRLF,'') //con esta línea se soluciono el problema
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Pdf a variable - SOLUCIONADO

Post by carlos vargas »

ummm, eso de pasar archivos binarios a variables de tipo caracter es como buscar un problema donde no hay, no nos indicas para que deseas pasar el archivo a la variable, yan que en cuanto se encuentre un caracter no imprimible la cadena se corta, dejando incompleta la información, lo usual es convertir el contenido binario a hexadecimal lo cual duplicara el tamaño de archivo (10k por ejemplo pasa a ser 20k) ya contenido en la variable, la otra posibilidad es usar el encode mime el cual incrementa el tamaño en aproximadamente 30%, si lo que desaeas hacer con el pdf es modificar algun campo con valores que tu deseas (una especie de merge) pues lo ideal es usar pdftk el cual te permite incorporar valores a campos definidos en un pdf. si es asi pues nos dices y te ayudamos con ese fin, sino pues con lo anterior pues ya estas servido.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Pdf a variable - SOLUCIONADO

Post by carlos vargas »

pos ya mire el fin:
Para resumir y si alguien pudiera darme una mano. Lo que necesito hacer es leer un archivo pdf y codificarlo en base64 para ser enviado a un WS.


pues sip, para esos es usalmente usado el base64 (por ejemplo en los email los atachment asi vienen adjuntado al texto del mismo.)

Code: Select all | Expand


Content-Type: image/jpeg;
  name="logo_castillo.jpg"
Content-Transfer-Encoding: base64
Content-ID: <16470FFD-38D0-4BDC-84B1-EE2642C79249>

/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAG/A+gDASIA
AhEBAxEB/8QAHwABAAIDAAMBAQEAAAAAAAAAAAkKBwgLBAUGAwIB/8QAUxAAAAYDAAEDAwEEBQYK
BA0FAQIDBAUGAAcICRESEwoUIRUWIjFBFyM5UbcYMkJhd3gkJTg6UmJ2tba4GjNXdSYnNjdDU3Fy
gYKWmNXXGTVUpP/EAB0BAQABBAMBAAAAAAAAAAAAAAACAQMHCAQFBgn/xABTEQACAQMCBAMEBgcD
BwkGBwABAgMABBEFIQYSMUEHE1EiYXGBCBQykaGxFSNCUnLB8DNi0RYkNHOy4fFDU4KDkpOiwsMX
JjZjlKMlVFZ1laWz/9oADAMBAAIRAxEAPwC/xjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMU
pjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUpjGMUp
jGMUpjGMUpjGMUpjGMUpjMObr6E0jzlVFbtvPaFO1jWyAsDd5aZhuydSqyBSnVZQEOQVZqxyRSGA
4RcBHyUico+4jUwAI5Xf6g+pL17Xxka9yTqKR2BIp/Mg32PtoXNYp5VS+4E3kXR4lwFsnmKoCUxf
...
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgEBAAAAAwAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAClAAAAABAAAAAAAAAFAEQAbwBjAHUAbQBlAG4AdABTAHUAbQBtAGEA
cgB5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAOAACAf///////////////wAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK0AAAAAEAAAAAAAAA==


--------------Boundary-00=_8KII8WA1VA4000000000--

 

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
mariordz
Posts: 131
Joined: Tue Dec 26, 2006 4:50 pm
Location: Ciudad de México

Re: Pdf a variable - SOLUCIONADO

Post by mariordz »

Por si les sirve, yo tengo unos archivos almacenados en una base de datos SQL, uso la siguiente función:

Code: Select all | Expand

Function library_add
//Primero pido al usuario elija el archivo a subir a SQL
    cFileins :=  cGetFile("*.Pdf;*.Xls;*.Xlsx;*.Docx;*.Doc;*.Wmv;*.Mp4;*.Ppt;*.Pptx;*.Jpg;*.Bmp","Selecciona archivo", , "..")
    if !empty(cFileins)
        cExtension:=upper(right(cFileins,3))
        aExtep := {"PDF","XLS","XLSX","DOCX","WMV","DOC","MP4"}
        nPermi:=ascan(aExtep,cExtension)
//Valido que la extensión del archivo sea una de las permitidas
        if npermi<>0
            cNomFile := cFilename(cFileins)
           
            cCadsql0:="select filename from file_repository where filename='&cNomfile'"
           
            oRs0 := TOleAuto():New( "ADODB.Recordset" )
            oRs0:CursorType := 1 // opendkeyset
            oRs0:CursorLocation := 3 // local cache
            oRs0:LockType := 3 // lockoportunistic
   
            TRY
                cursorwait()
                oRS0:Open( cCadSql0,'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOGA+';User Id='+xUSERID+';Password='+xPASSWORD )
               
                CATCH oErr
                MsgInfo( "Error al verificar si el documento ya existe")
                msgget("Get","get",@cCadsql0)
                RETURN(.F.)
            END TRY
            oRs0nr:=oRs0:RecordCount()
            if oRs0nr=0
//Defino si es un archivo de acceso personal o público
                if msgyesno("Agregar documento de tipo público?","Tipo público")
                    lPub:="A"
                else
                    lPub:="B"
                endif
//Esta línea convierte el archivo a base64 (Este ejemplo lo encontré en el foro)
                cVarFile := hb_base64encode(hb_memoread(cFileins))
                cFech:=dtoc(date())
//Si no existe lo inserto a la tabla           
                cCadsql1:="Insert into file_repository (filename,content,fecha,tipo,owner) values ('&cNomfile','&cVarfile','&cFech','&lPub','&firma')"
           
                oRs1 := TOleAuto():New( "ADODB.Recordset" )
                oRs1:CursorType := 1 // opendkeyset
                oRs1:CursorLocation := 3 // local cache
                oRs1:LockType := 3 // lockoportunistic
   
                TRY
                    cursorwait()
                    oRS1:Open( cCadSql1,'Provider='+xPROVIDER+';Data Source='+xSOURCE+';Initial Catalog='+xCATALOGA+';User Id='+xUSERID+';Password='+xPASSWORD )
               
                    CATCH oErr
                    MsgInfo( "Error al insertar documento ")
                    msgget("Get","get",@cCadsql1)
                    RETURN(.F.)
                END TRY
                ?'El documento "'+alltrim(cNomfile)+'" ha sido insertado exitosamente'
            else
                ?'El documento "'+alltrim(cNomfile)+'" ya existe, no es posible almacenarlo en la biblioteca'
            endif
        else
//Si el usuario escribe un nombre de archivo con una extensión difrente a las permitidas no permite agregarlo a la tabla
            ?"El tipo de archivo seleccionado es invalido. Verifique y vuelva a intentar"
        endif
    endif
return
Post Reply