Page 1 of 1

Pdf a variable - SOLUCIONADO

PostPosted: Wed May 15, 2019 2:29 am
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 view

    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 view

%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 view

    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 view

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

Re: Pdf a variable

PostPosted: Wed May 15, 2019 12:55 pm
by karinha
Una idéa,

Code: Select all  Expand view

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.

Re: Pdf a variable

PostPosted: Wed May 15, 2019 2:24 pm
by leandro
karinha, muchas gracias.

Sirvió la idea :D

Quedó así:

Code: Select all  Expand view

    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
 

Re: Pdf a variable - SOLUCIONADO

PostPosted: Wed May 15, 2019 7:28 pm
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

Re: Pdf a variable - SOLUCIONADO

PostPosted: Wed May 15, 2019 7:31 pm
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 view

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

Re: Pdf a variable - SOLUCIONADO

PostPosted: Thu May 23, 2019 6:45 pm
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 view
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