Posteado por: toniogago | 11 noviembre 2009

Renderizar el contenido del control ReportViewer directamente a PDF


Con este ejemplo, conseguiremos crear una página en ASP.NET con la que nos devolverá un informe de Reporting Services ya convertido en formato PDF. Dependiendo de como el usuario que accede a la página tenga configurado el Explorador de Internet, éste le abrirá el documento PDF o le pedirá guardarlo.

Vamos a ello.
Creamos una nueva página e introducimos en ella un control ReportViewer y le configuramos lo siguiente:

Abrimos el archivo que contiene el código y en el evento Page_Load introducimos lo siguiente:

Dim warnings As Warning() = Nothing
Dim streamids As String() = Nothing
Dim mimeType As String = Nothing
Dim encoding As String = Nothing
Dim extension As String = Nothing
Dim bytes As Byte()
bytes = ReportViewer1.ServerReport.Render("PDF", Nothing, mimeType, encoding, extension, streamids, warnings)
Dim ms As New System.IO.MemoryStream(bytes)
Response.ContentType = "Application/pdf"
Response.BinaryWrite(ms.ToArray())
Response.End()

El servidor donde lo probé es un Windows Server 2003 con SQL Server 2005 Standard Edition. Utilizo Visual Studio 2008.

Un saludo.

Anuncios

Responses

  1. […] Server (ver) y en otro expliqué cómo renderizar directamente el contendio de un informe en PDF (ver). Ahora voy a explicar cómo aduntar ese PDF al correo […]

  2. hola te agradesco por la informacion me fue de mucha ayuda

  3. buenos días no se si puedas ayudarme e implementado tu código para C# queda algo asi en la pagina de load

            Warning[] warnings = null;
            string[] streamids = null;
            string mimeType = null;
            string encoding = null;
            string extension = null;
            byte[] bytes = null;
            ReportViewer1.LocalReport.ReportPath = "Report1.rdlc";
            bytes = ReportViewer1.ServerReport.Render("PDF", null,out mimeType,out encoding,out extension,out streamids,out warnings);
            System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
            Response.ContentType = "Application/pdf";
            Response.BinaryWrite(ms.ToArray());
            Response.End();
    

    pero me sale el siguiente error

    El código de usuario no controló Microsoft.Reporting.WebForms.MissingReportSourceException
    Message=No se ha especificado el origen de la definición de informe
    Source=Microsoft.ReportViewer.WebForms
    StackTrace:
    en Microsoft.Reporting.WebForms.ServerReport.EnsureExecutionSession()
    en Microsoft.Reporting.WebForms.ServerReport.Render(String format, String deviceInfo, PageCountMode pageCountMode, String& mimeType, String& encoding, String& fileNameExtension, String[]& streams, Warning[]& warnings)
    en Microsoft.Reporting.WebForms.Report.Render(String format, String deviceInfo, String& mimeType, String& encoding, String& fileNameExtension, String[]& streams, Warning[]& warnings)
    en _Default.Page_Load(Object sender, EventArgs e) en c:\Users\Administrador\Documents\Visual Studio 2010\WebSites\ReportsWebsite1\Default.aspx.cs:línea 23
    en System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
    en System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
    en System.Web.UI.Control.OnLoad(EventArgs e)
    en System.Web.UI.Control.LoadRecursive()
    en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    InnerException:

    además no se como llamar el •ProcessingMode dentro del defaul me podrias ayudar por favor

    • Hola María.

      Tienes que indicar dónde está el informe: en el servidor o local.

      prueba a poner el siguiente código:

              ReportViewer1.ServerReport.ReportPath = "Report1.rdlc";
              ReportViewer1.ProcessingMode = ProcessingMode.Remote;
      

      También lo puedes cambiar en las propiedades del control.

      • buenas tardes ya lo hice y ahora tengo el siguiente error La ruta de acceso del elemento \”Report1.rdlc\” no es válida. Debe tener menos de 260 caracteres. Se aplican también otras restricciones. Si el servidor de informes está en modo nativo, la ruta de acceso debe comenzar por una barra diagonal. (rsInvalidItemPath) que pena contigo la verdad soy nueva en el tema

      • Hola María, me está pasando lo mismo en un cliente. En cuanto lo resuelva te respondo a este comentario.

  4. Estimad@s coloco todo al parecer bien..

    string strNull = null;
    string strPDF = “PDF”;
    string enCoding = Request.Headers[“Accept-Encoding”];
    string mimeType = “application/pdf”;
    string extension = “.pdf”;
    string[] streamids = null;
    Warning[] warnings = null;

    Reporte.ProcessingMode = ProcessingMode.Remote;
    Reporte.LocalReport.ReportPath = Server.MapPath(@”FichaSolicitud.rdlc”);

    byte[] bytes = Reporte.ServerReport.Render(strPDF, strNull, out mimeType, out enCoding, out extension, out streamids, out warnings);

    Pero me indica que: No se ha especificado el origen de la definición de informe

    Alguien tiene alguna idea!!!!

    Nota: Esto no me queda claro
    •Server Report: ◦Report Path: //
    ◦ReportServer: http:///reportserver

    • Hola Darkmedel,

      El control ReportViewer tiene las siguientes propiedades para ProcessingMode.Remote:

      ServerReport.ReportPath
      ServerReport.Render

      También tiene otros 2 parámetros para ProcessingMode.Local:

      LocarReport.ReportPath
      LocalReport.Render

      Estás mezclando ServerReport y LocalReport. Tienes que hacer coincidir estas propiedades dependiendo de la localización del informe. Si es un archivo RDLC en el propio IIS utiliza LocalReport. Si el informe está publicado en un servidor der Reporting Services, utiliza ServerReport.

  5. alguien sabe por que me genera el siguiente error La ruta de acceso del elemento “Report1.rdlc” no es válida. Debe tener menos de 260 caracteres. Se aplican también otras restricciones. Si el servidor de informes está en modo nativo, la ruta de acceso debe comenzar por una barra diagonal. (rsInvalidItemPath)

    • Hola María,

      encontré la solución para mi caso. A ver si te funciona a ti.
      Tengo un informe en el servidor llamado “servidor” y el informe se llama “Control de Stocks” y está en la carpeta “adevesa”.
      Lo que hice fue lo siguiente:

      ReportViewer1.ServerReport.ReportPath = "/adevesa/Control de stocks"
      ReportViewer1.ServerReport.ReportServer = "http://servidor/reportserver"

      Fíjate que en el nombre del informe no le puse la extensión .rdlc ni caracteres especiales.

      • Hola, me sale un mensaje como esto “directiva using o una referencia de ensamblado” para ReportServer , me podrian decir cual es el using??

  6. muchísimas gracias toniogago quedo muy atenta a este foro mil gracias por tu colaboracion

  7. hola toniago perdona la pregunta se que es muyu tonta pero bueno yo tengo mi proyecto C:\Users\Administrador\Documents\Visual Studio 2010\WebSites\ReportsWebsite6 coloco toda la direccion o solo coloco /ReportsWebsite6/Report1 gracias por tu ccolaboracion

    • Hola María,
      veo que el informe lo tienes en local y no en remoto. Utliza LocalReport.ReportPath = Server.MapPath(“.”)+@”\Report1″
      También utiliza LocalReport.Render

      Haré pruebas para confirmártelo cuando pueda. Mientras, ve probando y nos cuentas.

      • muchisimas gracias ya me funciono…

        gracias por tu gran paciencia y colaboracion. quisiera saber si sabescomo puedo hacer lo siguiente tengo un visor de reportes y desde alli abro varios reportes el problema esta en qu para uno quiero el de exportar solo a pdf y para los otros si que permita exportar los multiples formatos sabes como puedo delimitar que si es un reporte me muestre el visor con el exportar solo a pdf y en los otros si el general…

      • En la siguiente página de CodeProject existe un artículo que muestra cómo se puede personalizar el control Report viewer:

        http://www.codeproject.com/Articles/35225/Advanced-Report-Viewer

        También puedes crear 2 páginas: una para presentar el control reportviewer y otra para que devuelva el PDF como explico aquí. Dependiendo del nombre del informe o atributo del mismo llamas a una página u otra.

      • buenos dias tengo una pequeña pregunta cuando le estoy enviando parametros al reporte de que manera puedo capturar los mismos y colocarlos en el codigo para que me los muestre

      • Hola María,

        en una expresión puedes utilizar los parámetros con la siguiente notación:

        =Parameter!NombreParametro.Value

        Ten en cuenta que el nombre del parámetro es sensible a mayúsculas.
        Tengo hecho algún informe de ventas donde utilizo un filtro con los 3 últimos años y en el título del informe utilizo una expresión para indicar el año seleccionado:

        ="Informe de ventas del año " + Parameter!Ano.Value


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: