Foros Néfele 4 Harbour › Foros › Dudas › Descargar Archivo PDF
Etiquetado: pdf descarga fastreports
- Este debate tiene 7 respuestas, 3 mensajes y ha sido actualizado por última vez el 4 años, 1 mes por Eduardo Trasviña. This post has been viewed 985 times
-
AutorEntradas
-
-
23-10-2020 a las 22:32 #1404Eduardo TrasviñaParticipante
Hola equipo Nefele.
Quiero descargar un archivo mediante mi aplicacion de nefele y no puedo lograrlo, el codigo es muy simple, genero un pdf con fastreports (si se genera), y luego si no hay errores intento bajarlo con ocgi:sendfile, lo comparto.
123456789101112131415161718192021222324252627282930313233cfile := "orale.pdf"WITH OBJECT oFr := TFastReport():New():lAbortOnErrors := .t.:cResIco := "nefele":lDelFRVars := .T.:Create():oEngineOptions:lSilentMode := .t.:cFileName := "primero.fr3":AddVariable("nombre", "prueba de campo nombre"):AddVariable("segundo", "segunda linea"):PrepareReport():SetProperty( "PDFExport", "ShowDialog", .F. ):SetProperty( "PDFExport", "FileName", cfile ):SetProperty( "PDFExport", "Compressed", .T. ):SetProperty( "PDFExport", "EmbeddedFonts", .T. ):SetProperty( "PDFExport", "PrintOptimized",.T. ):SetProperty( "PDFExport", "Subject", "Pruebas Lalo" ):DoExport( "PDFExport" )cerrores := aJoin(:GetErrors):End()END WITHIF Empty(cerrores)oCGI:console(Application:cDirectory)oCGI:SendFile(Application:cDirectory, cfile)ELSEoCGI:console(cerrores)oCGI:SendPage( cerrores)ENDIFRevise el archivo SendFile.txt que esta en cgi-bin y esto me muestra.
123KO ::1 22/10/2020 15:50:14 - C:\Apache24\cgi-bin\tmp\orale.pdf|Fichero no EncontradoOK ::1 22/10/2020 16:10:55 - C:\Apache24\cgi-bin\orale.pdf|OK ::1 22/10/2020 16:12:04 - C:\Apache24\cgi-bin\orale.pdf|No me manda error, todo bien, solo que no lo descarga, alguna sugerencia ? me falta algo ?
Saludos!!
-
24-10-2020 a las 00:56 #1406Alfredo SanzSuperadministrador
¿Puedes compartir el código donde haces el sendfile?
-
24-10-2020 a las 19:35 #1407Eduardo TrasviñaParticipante
Gracias por tu rapida respuesta Alfredo.
Mi proyecto esta un poco grande, tiene dependencias de varias funciones que hacen llamadas a la base de datos (MariaDB), para hacerlo mas practico hice un pequeño proyecto, que solo tuviera la prueba de la descarga de PDF, en esta prueba mando llamar al evento de generacion y descarga de pdf desde diferentes eventos.
1.- llamada desde un ;:cOnClickEdit de un elemento de listview, NO funciono, observando con el inspector (F12) del navegador veo esto
2.- llamada desde un :cOnClick de un button, SI funciono, lo crea y lo descarga.
Comparto el codigo del proyecto de prueba, este es el MainPage.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177#include "Xailer.ch"#include "Nefele.ch"//------------------------------------------------------------------------------//Función principal de la app WebPROCEDURE MainPage()LOCAL adatos:={}, alineaAAdd(adatos,{"Juan lopez" , "Rio Fuerte" , "345" , "Caborca" , "6688231245"})AAdd(adatos,{"Salvador Perez" , "Av. insurgentes" , "4112", "Ciudad de Mexico", "5514359845"})AAdd(adatos,{"Francisco Apodaca", "Blvd. Antonio Rosales" , "33" , "Cd. Obregon" , "6482402519"})AAdd(adatos,{"Arturo Artola" , "Blvd. Francisco Madero", "555" , "Guadalajara" , "3332854604"})// Comenzamos instanciando la Página Web que queremos crearWith Object TWebPage():New():lValign := .f.:lContainer := .f.:lAlerts := .f.WITH object WPanel():New(:WO):cTitle := "Clientes":aWidth[ _grande ] := 10:aOffset[ _grande ] := 1:oStyle:cPadding := 0:oStyle:cBorder_radius := "10px"WITH OBJECT WForm():New( :WO ):cId := "forma_clientes":cFunction := "#alert('Saliendo')"WITH OBJECT WBevel():New(:WO):cId := "bevel_uno":nStyle := xc_RowWITH OBJECT WListView():New(:WO):cId := "lista_clientes":cType := xc_Popout:lTitleItem := .t.:nItemInPage := 8:cAjaxBevel := "nflcargo"for each alinea IN adatosWITH OBJECT :AddItem() AS wItemListView:cId := alinea:__enumindex:cIcon := "person":cTitle := alinea[1]:nRowId := alinea[1]:cIconEdit := "edit":lEdit := .t.:cOnClickEdit := "envia_pdf":aText := {"Calle: "+alinea[2], "Numero: "+alinea[3], "Ciudad: "+alinea[4], "Telefono: "+alinea[5]}END WITH // ITEM DE LISTVIEWNEXT:Create()END WITH:Create()END WITHWITH OBJECT WBevel():New(:WO):cId := "bevel_dos":nStyle := xc_RowWITH object WEdit():New( :WO ):cId := "cliente":cHint := ".":cTitle := "cliente":nLength := 4:Create()END WITHWITH object WEdit():New( :WO ):cId := "nombre":cHint := ".":cTitle := "Nombre":nLength := 50:Create()END WITH:Create()END WITHWITH object WButton():New(:WO):cText := "es el submit":cIcon := "addbox":lLarge := .T.:lSubmit := .T.:nFix := "100%":cOnClick := "envia_pdf":Create()ENDWITH object WButton():New(:WO):cText := "Genera PDF":cIcon := "pdf":lLarge := .T.:nFix := "100%":cOnClick := "envia_pdf":Create()END:Create()END WITH // Form:Create()END WITH // Listview principaloCgi:SendPage( :Create() ) // Se crea el HTML final y se envía al navegador saliendo del ejecutable CGIEnd WithRETURN//------------------------------------------------------------------------------CLASS TFastReport FROM XFastReportPROPERTY cDllPath INIT Application:cDirectory // Se debe especificar el Path de la DLLPROPERTY cResIco INIT "aaSistema" // Se especifica Icono para que FastReport No lo busque por default en Application:oMainForm:oIcon porque truenaEND CLASS//------------------------------------------------------------------------------FUNCTION envia_pdf()LOCAL oFr, cpaso, cfile, cerroresoCGI:console("En prueba_impresion, antes de iniciar objeto fr")cfile := "orale.pdf" // Se almacena el nombre del archivo en variable, porque si se manda directamente No lo crea: SetProperty("PDFExport", "FileName", ::oDataSet:FilePDF)WITH OBJECT oFr := TFastReport():New():lAbortOnErrors := .t.:cResIco := "nefele":lDelFRVars := .T.:Create():oEngineOptions:lSilentMode := .t. // EVITA QUE: Si hay errores FR intenta presentarlos en pantalla y ocasiona que se congele el CGI (mejor se consulten los errores con :cLastError):cFileName := "primero.fr3":AddVariable("nombre", "prueba de campo nombre"):AddVariable("segundo", "segunda linea"):PrepareReport():SetProperty( "PDFExport", "ShowDialog", .F. ):SetProperty( "PDFExport", "FileName", cfile ):SetProperty( "PDFExport", "Compressed", .T. ):SetProperty( "PDFExport", "EmbeddedFonts", .T. ) // En TRUE aumenta mucho el tamaño del PDF:SetProperty( "PDFExport", "PrintOptimized",.T. ) // En TRUE aumenta mucho el tamaño del PDF:SetProperty( "PDFExport", "Subject", "Pruebas Lalo" ):DoExport( "PDFExport" )cerrores := aJoin(:GetErrors):End()END WITHIF Empty(cerrores)oCGI:console(Application:cDirectory)oCGI:SendFile(Application:cDirectory, cfile)ELSEoCGI:console(cerrores)oCGI:SendPage( cerrores)ENDIFoCGI:console("En prueba_impresion, ya enviada la exportacion")RETURN (nil)//------------------------------------------------------------------------------Este es el Main.
1234567891011121314151617181920212223242526272829#include "Xailer.ch"#include "Nefele.ch"//------------------------------------------------------------------------------//Arranque y parametrización del CGI. Cada vez que se llama al CGI entra por aquíPROCEDURE CGI_Init()// Instanciamos el Objeto TCGI que se encargara de procesar la llamada recibida desde el navegador y// que nos ha suministrado Apache al llamar al ejecutableoCgi := TCgi():New()// Ejecutamos el objectooCgi:Run()RETURN//------------------------------------------------------------------------------// El RUN anterior entra por aquí y llama al Method correspondienteClass TCgi FROM XCgi// Este es nuestro Router para evitar inyección de código malicioso y aportar la máxima seguridad.// Solo se permite la llamada a los Method de oCgi aquí nombrados que a su vez llaman a Procedure, Function o Method'sMETHOD MainFunction() Inline MainPage()METHOD envia_pdf() Inline envia_pdf()END CLASS//------------------------------------------------------------------------------Aprovechando el espacio, si pudieran orientarme en como hacer que lo abra en el mismo navegador chrome, que no lo descargue.
gracias por su tiempo y las atenciones.
- Esta respuesta fue modificada 4 años, 1 mes por Alfredo Sanz.
-
26-10-2020 a las 15:34 #1412Pedro AmaroSuperadministrador
Si deseas que el PDF se vea directamente en el Navegador necesitas tener una wBevel modal creado previamente en la página.
Luego la llamada para la creación del PDF123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189#include "Xailer.ch"#include "Nefele.ch"//------------------------------------------------------------------------------//Función principal de la app WebPROCEDURE MainPage()LOCAL adatos:={}, alineaAAdd(adatos,{"Juan lopez" , "Rio Fuerte" , "345" , "Caborca" , "6688231245"})AAdd(adatos,{"Salvador Perez" , "Av. insurgentes" , "4112", "Ciudad de Mexico", "5514359845"})AAdd(adatos,{"Francisco Apodaca", "Blvd. Antonio Rosales" , "33" , "Cd. Obregon" , "6482402519"})AAdd(adatos,{"Arturo Artola" , "Blvd. Francisco Madero", "555" , "Guadalajara" , "3332854604"})// Comenzamos instanciando la Página Web que queremos crearWith Object TWebPage():New():lValign := .f.:lContainer := .f.:lAlerts := .f.// Creamos un modal para que luego presente el PDF descargadoWITH Object WBevel():New(:WO):cId := "vistamodal":nStyle := xc_Modal:cModalHeight := "550px":Create()END WITHWITH object WPanel():New(:WO):cTitle := "Clientes":aWidth[ _grande ] := 10:aOffset[ _grande ] := 1:oStyle:cPadding := 0:oStyle:cBorder_radius := "10px"WITH OBJECT WForm():New( :WO ):cId := "forma_clientes":cFunction := "#alert('Saliendo')"WITH OBJECT WBevel():New(:WO):cId := "bevel_uno":nStyle := xc_RowWITH OBJECT WListView():New(:WO):cId := "lista_clientes":cType := xc_Popout:lTitleItem := .t.:nItemInPage := 8:cAjaxBevel := "vistamodal" // Le indicamos que la llamada es por Ajax y que la respuesta ira en vistamodal// :AddParam({"Height","@$('#vistamodal').innerHeight()"}) Esto no funcionara hasta la versión 0.3.1 de Néfelefor each alinea IN adatosWITH OBJECT :AddItem() AS wItemListView:cId := alinea:__enumindex:cIcon := "person":cTitle := alinea[1]:nRowId := alinea[1]:cIconEdit := "edit":lEdit := .t.:cOnClickEdit := "envia_pdf":aText := {"Calle: "+alinea[2], "Numero: "+alinea[3], "Ciudad: "+alinea[4], "Telefono: "+alinea[5]}END WITH // ITEM DE LISTVIEWNEXT:Create()END WITH:Create()END WITHWITH OBJECT WBevel():New(:WO):cId := "bevel_dos":nStyle := xc_RowWITH object WEdit():New( :WO ):cId := "cliente":cHint := ".":cTitle := "cliente":nLength := 4:Create()END WITHWITH object WEdit():New( :WO ):cId := "nombre":cHint := ".":cTitle := "Nombre":nLength := 50:Create()END WITH:Create()END WITHWITH object WButton():New(:WO):cText := "es el submit":cIcon := "addbox":lLarge := .T.:lSubmit := .T.:nFix := "100%":cOnClick := "envia_pdf":Create()ENDWITH object WButton():New(:WO):cText := "Genera PDF":cIcon := "pdf":lLarge := .T.:nFix := "100%":cOnClick := "envia_pdf":Create()END:Create()END WITH // Form:Create()END WITH // Listview principaloCgi:SendPage( :Create() ) // Se crea el HTML final y se envía al navegador saliendo del ejecutable CGIEnd WithRETURN//------------------------------------------------------------------------------CLASS TFastReport FROM XFastReportPROPERTY cDllPath INIT Application:cDirectory // Se debe especificar el Path de la DLLPROPERTY cResIco INIT "aaSistema" // Se especifica Icono para que FastReport No lo busque por default en Application:oMainForm:oIcon porque truenaEND CLASS//------------------------------------------------------------------------------FUNCTION envia_pdf()LOCAL oFr, cpaso, cfile, cerroresLOCAL cHeight := oCGI:GetCgiValue("Height","500")oCGI:console("En prueba_impresion, antes de iniciar objeto fr")cfile := "orale.pdf" // Se almacena el nombre del archivo en variable, porque si se manda directamente No lo crea: SetProperty("PDFExport", "FileName", ::oDataSet:FilePDF)WITH OBJECT oFr := TFastReport():New():lAbortOnErrors := .t.:cResIco := "nefele":lDelFRVars := .T.:Create():oEngineOptions:lSilentMode := .t. // EVITA QUE: Si hay errores FR intenta presentarlos en pantalla y ocasiona que se congele el CGI (mejor se consulten los errores con :cLastError):cFileName := "primero.fr3":AddVariable("nombre", "prueba de campo nombre"):AddVariable("segundo", "segunda linea"):PrepareReport():SetProperty( "PDFExport", "ShowDialog", .F. ):SetProperty( "PDFExport", "FileName", cfile ):SetProperty( "PDFExport", "Compressed", .T. ):SetProperty( "PDFExport", "EmbeddedFonts", .T. ) // En TRUE aumenta mucho el tamaño del PDF:SetProperty( "PDFExport", "PrintOptimized",.T. ) // En TRUE aumenta mucho el tamaño del PDF:SetProperty( "PDFExport", "Subject", "Pruebas Lalo" ):DoExport( "PDFExport" )cerrores := aJoin(:GetErrors):End()END WITHIF Empty(cerrores)oCGI:console(Application:cDirectory)// Como lo que queremos es que el PDF se vea en el Modal lo enviamos con SendPage// Pero utilizamos la Función EmbedFile para que nos cree el HTML necesarios para// que se visualize, con cHeight le damos el mismo alto que el contenedoroCGI:SendPage(EmbedFile( cfile, Application:cDirectory,,, cHeight ))ELSEoCGI:console(cerrores)oCGI:SendPage( cerrores)ENDIFoCGI:console("En prueba_impresion, ya enviada la exportacion")RETURN (nil)//------------------------------------------------------------------------------- Esta respuesta fue modificada 4 años, 1 mes por Pedro Amaro.
- Esta respuesta fue modificada 4 años, 1 mes por Pedro Amaro.
-
24-10-2020 a las 20:52 #1409Alfredo SanzSuperadministrador
Hola.
Después del :cOnClickEdit prueba a ponerle
:cAjaxBevelEdit := "nflcargo"
Ya me contarás qué tal.
-
24-10-2020 a las 22:33 #1410Eduardo TrasviñaParticipante
Aunado al cambio que me señalaste le quite la propiedad :cAjaxBevel := "nflcargo" que tenia declarado en el ListView y asi ya funciono, solucionado Alfredo, mil gracias.
Saludos!!
-
24-10-2020 a las 23:01 #1411Alfredo SanzSuperadministrador
Ok. Tengo ganas de ver alguna de las pantallas de tu aplicación 🙂
-
26-10-2020 a las 20:55 #1416Eduardo TrasviñaParticipante
Si, claro, te anticipo que mis pantallas son muy basicas, no tengo grandes conocimientos en html, css, js, ajax.
Te cuento que tanto me gusto como hicieron y funciona Nefele que estoy haciendo un proyecto piloto sobre algo real tal vez ya un poco grande, es mas que un "hola mundo" jeje, pero de momento el paciente esta en quirofano no muy presentable todavia.
Voy a preparar alguna imagenes para compartir, con mucho gusto.
Aprovecho para comentar que el espacio que abrieron en este foro para los ejemplos esta buenisimo!!, los felicito.
Saludos!!
-
-
AutorEntradas
- Debes estar registrado para responder a este debate.