none
pdf aparir de un reportviewer RRS feed

  • Pregunta

  • Muy buenas para todo:

    Tengo un Reporteng donde hago boletas y facturas todo se genera perfectamente.

    ahora tengo la necesidad de cuando se imprimía la bolera desde un ReportViewer se me guarde un "PDF" en mi base de datos sql Server, para llevar un registro de las boletas generadas para cuando sea necesario consultarlas.

    E esta tratando de meterlo en un Byte[], o generar un Buffer para guardarlo y no lo e logrado.

    Y quiero se se guarde con el nombre de cada cliente que se genera el el reporting

    No se si se puede hacer algo como esto. este código yo uso para guardar imagenes

    MemoryStream Ms = new MemoryStream();
    pxImagen.Image.Save(Ms, System.Drawing.Imaging.ImageFormat.Png);

    byte[] imagen = Ms.GetBuffer();

    aver si me pueden dar una mano.

    miércoles, 29 de enero de 2020 17:16

Respuestas

  • Bueno, la parte importante, la que genera los bytes del PDF, es esta:

    byte[] Bytes = viewer.LocalReport.Render(format: "PDF", deviceInfo: "");

    Los bytes son bytes, no existe archivo ni tiene ningún sentido usar un nombre de archivo en esta parte.

    Una vez que tienes los bytes, entonces ya los salvas donde quieras, que puede ser en un archivo como has puesto más arriba (en cuyo caso el nombre de archivo va en el código que graba el archivo, no va dentro de los bytes), o puede ser en cualquier otro sitio, como por ejemplo en un blob de la base de datos.

    A la hora de salvar en la base de datos, al sistema le da exactamente igual de dónde provengan esos bytes que se salvan. En la pregunta inicial decías que ya sabías grabar una imagen y que la obtenías así: byte[] imagen = Ms.GetBuffer();

    Pues bien, no tienes más que tomar el mismo código que usas para salvar en la base de datos esos bytes que tienes en la variable "imagen" y en lugar de usar esa variable usas la variable "Bytes" que trae los bytes del PDF. El código de grabación es exactamente el mismo en ambos casos.

    • Marcado como respuesta Edua9920 jueves, 30 de enero de 2020 13:52
    jueves, 30 de enero de 2020 7:01

Todas las respuestas

  • Hola   Edua9920

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma,  te comento que para  que la comunidad de foros te pueda asesorar mejor, es necesario que nos compartas el form/code que estás desarrollando

     

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 29 de enero de 2020 19:21
    Moderador
  • ¿Es un reporte de lado cliente o de lado servidor? Es decir, ¿un .rdlc o un .rdl?

    Si es el primero, obtienes el array de bytes llamando al método Render del LocalReport del ReportViewer. Es más o menos algo parecido a lo siguiente, pero busca en la Red alguno de los muchos ejemplos que te dicen qué son los distintos parámetros:

    byte[] arrayDeBytes = reportViewer1.LocalReport.Render("PDF", "", null, null, null, null, null);

    Si es de lado servidor es diferente. Se añade una referencia al .asmx del ReportServer y tiene un método para exportar a pdf, que te devuelve igualmente un array de bytes.

    miércoles, 29 de enero de 2020 21:57
  • buenas:

    buscando el la Red encontré este código que es lo que mas meno quiero hacer.

    Aqui me genera el Pdf con el nombre que yo le paso por parámetro y me lo guarda en una ruta especifica, este código funciona perfectamente:

    Pero lo que yo estoy buscado no es guardarlo en el disco, loq quiero es guardarle en mi Base de sql 

                                                

    private void CreatePDF(ReportViewer viewer, string savePath)
            {
                byte[] Bytes = viewer.LocalReport.Render(format: "PDF", deviceInfo: "");

                using (FileStream stream = new FileStream(savePath, FileMode.Create))
                {
                    stream.Write(Bytes, 0, Bytes.Length);

                }

            }

    lo que estado tratando de hacer es ponerle el nombre de cada  boleta que se genera

    byte[] Bytes = viewer.LocalReport.Render(format: "PDF", deviceInfo: "");

    No se si en esta parte se puede implementar el nombre para que con ese Byte yo pueda enviarlo a mi base de sql

    haber si me puedes ayudar gracias

    miércoles, 29 de enero de 2020 22:50
  • Bueno, la parte importante, la que genera los bytes del PDF, es esta:

    byte[] Bytes = viewer.LocalReport.Render(format: "PDF", deviceInfo: "");

    Los bytes son bytes, no existe archivo ni tiene ningún sentido usar un nombre de archivo en esta parte.

    Una vez que tienes los bytes, entonces ya los salvas donde quieras, que puede ser en un archivo como has puesto más arriba (en cuyo caso el nombre de archivo va en el código que graba el archivo, no va dentro de los bytes), o puede ser en cualquier otro sitio, como por ejemplo en un blob de la base de datos.

    A la hora de salvar en la base de datos, al sistema le da exactamente igual de dónde provengan esos bytes que se salvan. En la pregunta inicial decías que ya sabías grabar una imagen y que la obtenías así: byte[] imagen = Ms.GetBuffer();

    Pues bien, no tienes más que tomar el mismo código que usas para salvar en la base de datos esos bytes que tienes en la variable "imagen" y en lugar de usar esa variable usas la variable "Bytes" que trae los bytes del PDF. El código de grabación es exactamente el mismo en ambos casos.

    • Marcado como respuesta Edua9920 jueves, 30 de enero de 2020 13:52
    jueves, 30 de enero de 2020 7:01