none
Error de servidor The Adobe Acrobat Reader has not been found on this system RRS feed

  • Pregunta

  • Hola:

    Tengo una aplicación que genera documentos pdf con una libreria que muestra los documentos de dos maneras: como .viewPDF o como .ResponsePDF

    El primero que es el que me interesa genera un documento que se muestra como una ventana emergente que aparece en el lado de cliente, separada del navegador.
    El segundo que es el que no me interesa saca en el propio explorador el documento pdf. con lo que desaparece el menu y solo se puede continuar dando a la flecha atrás, pero la flecha atras en teoría está desactivada en mi aplicación.

    En local funcionan los dos pero cuando subo la aplicación al hosting el primer modo lanza el error

    Error de servidor en la aplicación '/'.
    --------------------------------------------------------------------------------
    The Adobe Acrobat Reader has not been found on this system. The document cannot be displayed. 

    Lo cual me hace pensar que en el hosting no tiene instalado el acrobat reader. He hablado con ellos y me dicen que es un problema de mi aplicación.

    Estoy intentando una alternativa como utilizar alguna libreria que me permita desplegar el documento pdf, pero he probado y no encuentro nada.

    Agradeceré a quien me pueda orientar para que el documento se pueda desplegar independiente de la aplicación como funciona en local, o incluso que se pueda bajar como archivo aparte. O bien si tengo que insistir para que instalen el reader en el server como lo está en mi máquina.

    Saludos al grupo.

    miércoles, 19 de abril de 2017 18:25

Respuestas

  • Puedes usar cualquiera de las librerías que generan PDFs, como por ejemplo iTextSharp, o si el PDF es de tipo informe, generarlo mediante una herramienta de informes tal como el ReportViewer. Tanto en un caso como el otro, si configuras bien la herramienta, puedes hacer que el PDF te lo devuelva dentro de un array de bytes. Y una vez que tienes el array de bytes, lo puedes devolver desde la aplicación ASP.NET a través del Response igual que si fuera un fichero, y puedes poner las cabeceras HTTP con las mismas opciones que les pones cuando devuelves un fichero. Por ejemplo, si en el Content-Disposition le pones "attachment", en el navegador le sale al usuario la clásica ventanita de si quiere abrirlo o salvarlo a un fichero.

    Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);

    miércoles, 19 de abril de 2017 21:54

Todas las respuestas

  • Puedes usar cualquiera de las librerías que generan PDFs, como por ejemplo iTextSharp, o si el PDF es de tipo informe, generarlo mediante una herramienta de informes tal como el ReportViewer. Tanto en un caso como el otro, si configuras bien la herramienta, puedes hacer que el PDF te lo devuelva dentro de un array de bytes. Y una vez que tienes el array de bytes, lo puedes devolver desde la aplicación ASP.NET a través del Response igual que si fuera un fichero, y puedes poner las cabeceras HTTP con las mismas opciones que les pones cuando devuelves un fichero. Por ejemplo, si en el Content-Disposition le pones "attachment", en el navegador le sale al usuario la clásica ventanita de si quiere abrirlo o salvarlo a un fichero.

    Response.AppendHeader("content-disposition", "attachment; filename=" + fileName);

    miércoles, 19 de abril de 2017 21:54
  • Gracias, Alberto.

    Poco después de exponer el tema tras manejar varias posibilidades, llegué a la conclusión de que la mejor manera era empaquetar el documento generado en pdf en un archivo y enviarlo al cliente para descargarlo en local en la línea de lo que tú dices con lo que creo que al problema está resuelto pues la aplicación no se interrumpe.

    El generador PDF es Report.net. Por si a alguien le es de utilidad, el código es el siguiente:

            Dim pdfDocumento As Report = rptDocumento 'El documento previamente generado por report.net
            Dim strNombreArchivoPDF As String = ""
            strNombreArchivoPDF = "miArchivo.pdf"
            Dim strRutaArchivo As String = ""
            strRutaArchivo = "\App_Data\CarpetaTemporal\" & strNombreArchivoPDF
            pdfDocumento.Save(Server.MapPath(strRutaArchivo))
            With Response
                .Charset = "UTF-8"
                .ContentType = "application/pdf"
                .AddHeader("Content-Disposition", "attachment; filename=" & strNombreArchivoPDF & "")
                .Clear()
                .WriteFile(Server.MapPath(strRutaArchivo))
                .Flush()
                File.Delete(Server.MapPath(strRutaArchivo))
                .End()
            End With

    Saludos al grupo.



    jueves, 20 de abril de 2017 13:44
  • Un par de precauciones:

    - En una aplicación web pueden entrar dos usuarios a la vez, con lo que uno le pisaría el archivo temporal al otro. Si vas a usar el archivo temporal, tienes que generarle un nombre único cada vez que lo generes.

    - Ojo con lo de salvar el archivo en una subcarpeta de la propia aplicación web. Tiene un par de pegas. La primera es que si lo pasas a producción en IIS, de forma predeterminada no tiene permiso de escritura sobre sí misma. En tiempo de desarrollo no se nota, porque cuando lo ruedas en Visual Studio tiene todos los permisos. Si te dejan modificar los permisos en el servidor IIS, no hay problema, pero si es un hosting en el que no puedes cambiarlos, no funcionará bien.

    - Cuando esto se ejecuta varias veces y se ha modificado un cierto número de archivos bajo el directorio de la aplicación, ASP.NET la reinicia y se pierden todos los estados de sesión.

    Por estos motivos, y por razones de rendimiento, es preferible que no grabes un archivo temporal y luego le devuelvas el archivo al usuario desde el disco. En lugar de eso, busca en el manual las sobrecargas del método Save del pdfDocumento, que seguro que tiene una que permite salvar en un Stream. Ahí le pasas como argumento el Response.OutputStream (y lo mueves más abajo, después de haber cambiado los headers), y con eso el contenido se envía directamente al navegador sin pasar por un archivo en disco (y el navegador no nota ninguna diferencia, desde su punto de vista sigue siendo un archivo).

    jueves, 20 de abril de 2017 18:52
  • Muchas gracias, Alberto.

    Estudiaré detenidamente lo que me dices.

    En cuanto al nombre del fichero eso sí que lo tenía previsto porque el nombre que se genera es único o al menos de muy difícil o imposible repetición para cada documento con una serie de parámetros que se reflejan en el nombre como fecha en formato 00-00-0000, num de documento, num de persona registrada...

    De momento va funcionando muy bien, pero ya te digo que pondré en práctica lo que me dices.

    Un saludo

    jueves, 20 de abril de 2017 19:59