Del Baúl del Recuerdo: Crear Imágenes con ASP.NET WebForm

Hola, entre tanta característica nueva de ASP.NET, de repente son varias las consultas que me llegan sobre algo en particular, en este caso, fue sobre como crear imágenes con Asp.net Webform, y como tuve que hacer algo parecido, aprovecho de escribirlo.

El problema era el siguiente, tenía que ocupar una impresora térmica de pulseras, e imprimir cierta información, si bien en la impresora se pueden enviar comandos, estoy en un cliente web, por lo que solo tenía acceso a window.print, (no tenía acceso a soluciones como las de Crystal Report que, según configuración, utilizan un activeX para enviar los datos a la impresora local). Además como era de pulsera tenia que imprimir de forma vertical, y si, sin depender de la configuración de la impresora ni utilizar CSS3, ya que debía ser compatible conversiones antiguas de IE, ni ocupar scripts. Debe permitir imprimir y cerrar automáticamente la ventana.

Entonces pensé que lo mejor era crear una imagen con el texto que quería y luego rotarla, luego implementar un poco de javascript para cerrar la ventana, veamos como queda esto:

<body onload="imprimir();">

    <form id="form1" runat="server" >

    <div>

      <img runat="server" id="pulsera" /></div>

   </form>

 

</body>

</html>

<script type="text/javascript">

   function imprimir(){

    window.print();

    setTimeout(function () {

        window.close();

    }, 6000);

   }

</script>

Esta es la pantalla que se abre como popup, se que hay mucho mejores formas de hacer esto, pero lo estoy simplificando. Tengo una imagen tiene por id=”pulsera”, y se llama en el onload del body ala función imprimir, la que imprimirá el documento y luego de 6 segundos (pueden bajar el tiempo) va a cerrar la pantalla. El comportamiento ayuda bastamente, se abre la pantalla de impresión y puede que pasen los 6 segundos antes de apretar imprimir, pero debido a que la pantalla de dialogo está abierta, no pagina no se cierra, una vez que pones imprimir, se ejecuta la petición de cerrarla.

Ahora bien, si me preguntan por que no utilicé jquery para esto, respuesta: porque es un despropósito utilizarlo para utilizarlo en un 0,000001%

Veamos el código VB.NET Asociado:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  If Not Page.IsPostBack Then

    Dim nombre As String = Request("nombre")

    Dim rut As String = Request("rut")

    Dim edad As String = Request("edad")

    Dim estab As String = Request("estab")

    Dim parametros As String = String.Format("?nombre={0}&rut={1}&edad={2}&estab={3}", nombre, rut, edad.Replace(")", "").Replace("(", ""), estab)

    pulsera.Src = "GeneraPulseraIMG.aspx" & parametros

End If

End Sub

Puedes notar que la ruta de la imagen es en realidad una página asp.net a la que se le pasan los parametros necesarios para generar la imagen. Ahora veamos la página generaPulseraIMG.aspx

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            Dim texto As String = Request("texto")

 

        Dim nombre As String = Request("nombre")

        Dim rut As String = Request("rut")

        Dim edad As String = Request("edad")

        Dim estab As String = Request("estab")

 

        Dim objLienzo As Bitmap = New Bitmap(800, 70)

        Dim objGraficar As Graphics = Graphics.FromImage(objLienzo)

        Dim objColor As System.Drawing.Color

        objColor = Color.White

        Dim objFont As New Font("Verdana", 12)

        Dim objCoordenadas As New PointF(50, 10)

        Dim objPincelFondo As New SolidBrush(objColor)

        Dim objPincelTexto As New SolidBrush(Color.Black)

        objGraficar.FillRectangle(objPincelFondo, 0, 0, 800, 70)

 

        ‘TITULO

        objGraficar.DrawString(estab, objFont, objPincelTexto, objCoordenadas)

       

‘PACIENTE

        Dim objCoordenadasPaciente As New PointF(50, 26)

        Dim objFontPaciente As New Font("Verdana", 10)

        objGraficar.DrawString("Paciente:" & nombre, objFontPaciente, objPincelTexto, objCoordenadasPaciente)

 

        ‘TERCERA LINEA

        Dim objCoordenadasTercera As New PointF(50, 40)

        objGraficar.DrawString("Rut:" & rut & " Edad:" & edad & " ", objFontPaciente, objPincelTexto, objCoordenadasTercera)

      

        objLienzo.RotateFlip(RotateFlipType.Rotate270FlipXY)

        Context.Response.ContentType = "image/jpeg"

        objLienzo.Save(Context.Response.OutputStream, ImageFormat.Jpeg)

    End Sub

Puedes ver que esta página es la que genera la imagen utilizando el namespace System.drawing de manera de crear un lienzo,darle dimensiones, y graficar Sonrisa. Grafíco las 3 líneas y luego con RotateFlip, roto la imagen, finalmente el content-type es una imagen, para que pueda ser fuente del objeto imagen de la página anterior y listo (el tema de los tildes solo es codificación):

image

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *