none
Mostrar varias Imagenes en un solo reporte con reporting services RRS feed

  • Pregunta

  • Hola a todos.

    Mi planteamiento es el siguiente: Tengo muchas imagénes dentro de una carpeta. ¿Cómo puedo mostrar todas esas imágenes con reporting services desde un solo reporte?

    Vaya, la cuestión aquí es que muchas de esas imagenes pueden conformar en su totalidad un curriculum vitae por ejemplo, pero cada una de esas hojas fueron escaneadas y guardadas como archivos independientes. De tal forma que para ver el curriculum vitae como un solo documento resulta un problema. Por eso el cuestionamiento de querer mostrar todas las imagenes en un solo reporte.

    Cualquier ayuda será bien recibida, Mil gracias por su atención.

    lunes, 24 de mayo de 2010 17:54

Respuestas

  • Hola Fabio, lo que yo haría sería :

    1.- Crear un Typed Data Set de un solo campo de tipo byte[]

    2.- Crear un reporte con un solo control de tipo Imagen que ocupe gran parte de la página y como value de colocamos el campo del dataset anteriormente dicho.

    3.- En el código del formulario creas según tu criterio un datatable al cual en cada row de un solo campo le asignas el arreglo byte[] basado en la imagen de la página correspondiente.

    4.- Asignas por programa el datatable creado en el punto anterior.

    No es algo muy facil, pero tampoco es muy dificil, te voy a colocar algún código que te podría ayudar a crear ese DataSet, estas funciones convierten de objeto Image a byte[] y viceversa :

      public static byte[] ConvertImageToByteArray(System.Drawing.Image imageToConvert, System.Drawing.Imaging.ImageFormat formatOfImage)
      {
        byte[] Ret;
        try
        {
          using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
          {
            imageToConvert.Save(ms, formatOfImage);
            Ret = ms.ToArray();
          }
        }
        catch (Exception) { throw; }
        return Ret;
      } 
    
      public static System.Drawing.Image ConvertByteArrayToImage( byte[] arreglo )
      {
        if (arreglo==null)
          return null;
    
        System.IO.MemoryStream ms = new System.IO.MemoryStream(arreglo);
        System.Drawing.Bitmap bm = null;
        try
        {
          bm = new System.Drawing.Bitmap(ms);
          return (System.Drawing.Image)bm;
        }
        catch (Exception ex) 
        {
          throw;
          return null;
        }
      
      }

    Y este es algo de código de como podrías crear el DataTable con el archivo en el campo de tipo byte[]

        DataTable dt = new DataTable();
        dt.Columns.Add("Empresa", System.Type.GetType("System.String"));
        dt.Columns.Add("Titulo", System.Type.GetType("System.String"));
        dt.Columns.Add("SubTitulo", System.Type.GetType("System.String"));
        dt.Columns.Add("Imagen", System.Type.GetType("System.Byte[]"));
    
        DataRow r = dt.NewRow();
        string logoFile = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["LogoPrint"]);
        r["Empresa"] = ConfigurationManager.AppSettings["Empresa"];
        r["Titulo"] = titulo;
        r["SubTitulo"] = subtitulo;
        if (System.IO.File.Exists(logoFile))
          r["Imagen"] = ConvertImageToByteArray(System.Drawing.Image.FromFile(logoFile), System.Drawing.Imaging.ImageFormat.Gif);      
        dt.Rows.Add(r);
    

    Solo que esto deberás hacerlo una vez por registro (página escaneada) del data table.

    Si tienes alguna inquietud no dudes en preguntar.

    Si te sirvió este POST por favor no olvides marcarlo como respuesta.

    Cordial saludo,

     


    Mauricio Atanache G.
    jueves, 27 de mayo de 2010 4:08

Todas las respuestas

  • Hola Fabio, lo que yo haría sería :

    1.- Crear un Typed Data Set de un solo campo de tipo byte[]

    2.- Crear un reporte con un solo control de tipo Imagen que ocupe gran parte de la página y como value de colocamos el campo del dataset anteriormente dicho.

    3.- En el código del formulario creas según tu criterio un datatable al cual en cada row de un solo campo le asignas el arreglo byte[] basado en la imagen de la página correspondiente.

    4.- Asignas por programa el datatable creado en el punto anterior.

    No es algo muy facil, pero tampoco es muy dificil, te voy a colocar algún código que te podría ayudar a crear ese DataSet, estas funciones convierten de objeto Image a byte[] y viceversa :

      public static byte[] ConvertImageToByteArray(System.Drawing.Image imageToConvert, System.Drawing.Imaging.ImageFormat formatOfImage)
      {
        byte[] Ret;
        try
        {
          using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
          {
            imageToConvert.Save(ms, formatOfImage);
            Ret = ms.ToArray();
          }
        }
        catch (Exception) { throw; }
        return Ret;
      } 
    
      public static System.Drawing.Image ConvertByteArrayToImage( byte[] arreglo )
      {
        if (arreglo==null)
          return null;
    
        System.IO.MemoryStream ms = new System.IO.MemoryStream(arreglo);
        System.Drawing.Bitmap bm = null;
        try
        {
          bm = new System.Drawing.Bitmap(ms);
          return (System.Drawing.Image)bm;
        }
        catch (Exception ex) 
        {
          throw;
          return null;
        }
      
      }

    Y este es algo de código de como podrías crear el DataTable con el archivo en el campo de tipo byte[]

        DataTable dt = new DataTable();
        dt.Columns.Add("Empresa", System.Type.GetType("System.String"));
        dt.Columns.Add("Titulo", System.Type.GetType("System.String"));
        dt.Columns.Add("SubTitulo", System.Type.GetType("System.String"));
        dt.Columns.Add("Imagen", System.Type.GetType("System.Byte[]"));
    
        DataRow r = dt.NewRow();
        string logoFile = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["LogoPrint"]);
        r["Empresa"] = ConfigurationManager.AppSettings["Empresa"];
        r["Titulo"] = titulo;
        r["SubTitulo"] = subtitulo;
        if (System.IO.File.Exists(logoFile))
          r["Imagen"] = ConvertImageToByteArray(System.Drawing.Image.FromFile(logoFile), System.Drawing.Imaging.ImageFormat.Gif);      
        dt.Rows.Add(r);
    

    Solo que esto deberás hacerlo una vez por registro (página escaneada) del data table.

    Si tienes alguna inquietud no dudes en preguntar.

    Si te sirvió este POST por favor no olvides marcarlo como respuesta.

    Cordial saludo,

     


    Mauricio Atanache G.
    jueves, 27 de mayo de 2010 4:08
  • Hola.

    ¿Resolviste el problema?


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    viernes, 11 de junio de 2010 20:42
    Moderador
  • Perdón por contestar hasta ahora, y de antemano gracias por tomarte la molestia de contestar mi pregunta.

    Se le hace una buena idea tu propuesta, pero tengo una duda más, ¿Cómo hago para desde vb.net pasar el datatable a Reporting Services?

    Gracias.

    jueves, 24 de junio de 2010 14:53
  • Hola.

    ¿Te refieres a este caso concreto o en general?


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    jueves, 24 de junio de 2010 19:42
    Moderador
  • A este caso en concreto.
    jueves, 24 de junio de 2010 21:03
  • Buenas Fabio,

    Aunque en C# (si tienes dudas pregúntame sin problemas ;)), este ejemplo explica como pasar un dataset (tb sirve con datatable) a reporting desde código: http://geeks.ms/blogs/fdiaz/archive/2008/06/10/how-to-reporting-services-sin-iis-y-sin-servidor-de-informes.aspx

    Ya nos contarás que tal ;)

    Un Saludo!


    Fran Díaz | {geeks.ms/blogs/fdiaz/} | {onobanet.com} | {secondnug.com}
    jueves, 15 de julio de 2010 20:53
    Moderador