.NET

20 nov, 2018

ASP .NET – Imprimindo controles de uma página

Publicidade

Neste artigo vou mostrar como imprimir controles de uma página em uma aplicação ASP .NET Web Forms. O tempo do Web Forms é passado, e agora temos só o legado que deve ser mantido até Deus sabe quando.

Então, como temos muita coisa rodando ainda feita em ASP .NET, talvez este artigo ajude quem esteja procurando como imprimir controles de uma página em uma aplicação Web Forms.

Já vou avisando que não é uma ‘bala de prata’ que vai resolver todos os problemas de impressão. Longe disso, mas pode resolver alguns.

Na solução proposta você tem que incluir todos os controles que deseja imprimir em um container como um controle Painel, por exemplo.

Vamos ao que interessa!

Criando a aplicação ASP .NET Web Forms para teste

Abra o VS 2017 Community e crie um novo projeto do tipo Web Forms vazio – use  o nome AspNet_Printer.

Agora crie uma pasta chamada App_Code no projeto, e nesta pasta inclua a classe PrintHelper.cs com o código abaixo:

using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
namespace AspNet_Printer
{
    public class PrintHelper
    {
        public PrintHelper()
        {
        }
        public static void PrintWebControl(Control ctrl)
        {
            PrintWebControl(ctrl, string.Empty);
        }
        public static void PrintWebControl(Control ctrl, string Script)
        {
            StringWriter stringWrite = new StringWriter();
            System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
            if (ctrl is WebControl)
            {
                Unit w = new Unit(100, UnitType.Percentage); ((WebControl)ctrl).Width = w;
            }
            Page pg = new Page();
            pg.EnableEventValidation = false;
            if (Script != string.Empty)
            {
                pg.ClientScript.RegisterStartupScript(pg.GetType(), "PrintJavaScript", Script);
            }
            HtmlForm frm = new HtmlForm();
            pg.Controls.Add(frm);
            frm.Attributes.Add("runat", "server");
            frm.Controls.Add(ctrl);
            pg.DesignerInitialize();
            pg.RenderControl(htmlWrite);
            string strHTML = stringWrite.ToString();
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Write(strHTML);
            HttpContext.Current.Response.Write("<script>window.print();</script>");
            HttpContext.Current.Response.End();
        }
    }
}

Usaremos essa classe para imprimir os controles contidos no contêiner de uma página .aspx.

Criando as páginas Default.aspx e Print.aspx

Agora inclua no projeto duas páginas: Project > Add New Item > Web Form

  • Default.aspx: nesta página definiremos os controles que desejamos imprimir
  • Print.aspx: esta página serve apenas como um pop-up para invocar a impressão

A seguir definiremos o seguinte código na página Default.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
Inherits="AspNet_Printer.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Teste</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Panel ID="Panel1" runat="server" Height="407px">
                Macoratti .net - ASP .NET Impressão<br />
                <asp:Image ID="Image1" runat="server" Height="68px" ImageUrl="~/Imagens/maco1b.jpg" 
Width="422px" />
                <br />
                <asp:Label ID="Label1" runat="server" Text="Label com texto simples"></asp:Label>
                <br />
                <asp:Button ID="Button2" runat="server" Text="Botão 2" Width="175px" />
                <br />
                Mais algum texto de exemplo para imprimir<br />
                <br />
                Agora um Listbox :<br />
                <asp:ListBox ID="ListBox1" runat="server" Height="96px" Width="125px">
                    <asp:ListItem>Item 1 </asp:ListItem>
                    <asp:ListItem>Item 2</asp:ListItem>
                    <asp:ListItem>Item 3</asp:ListItem>
                </asp:ListBox>
                <br />
                <asp:TextBox ID="TextBox1" runat="server" Width="255px">TextBox - teste de impressão</asp:TextBox>
                <br />
            </asp:Panel>
            <br />
            <asp:Button ID="btnImprimir" runat="server" Height="24px" OnClick="btnImprimir_Click" 
Text="Imprimir Pagina" Width="196px" />
        </div>
    </form>
</body>
</html>

Observe que nesta página temos o botão btnImprimir, e no seu evento Click definiremos o código para imprimir a página conforme abaixo:

protected void btnImprimir_Click(object sender, EventArgs e)
{
     Session["ctrl"] = Panel1;
     ClientScript.RegisterStartupScript(this.GetType(), "onclick", "<script language=javascript>
window.open('Print.aspx','PrintMe','height=450px,width=400px,scrollbars=1');</script>");
 }

O código armazena o controle Panel1 em uma variável Session a ser acessada na página pop-up, Print.aspx.

Se você quiser imprimir diretamente ao clicar no botão, no evento Click do botão, chame a funcionalidade da seguinte maneira:

PrintHelper.PrintWebControl(Panel1);

Esta página tem a seguinte visualização:

Agora temos o código do evento Load da página Print.aspx.cs.

using System;
using System.Web.UI;
namespace AspNet_Printer
{
    public partial class Print : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Control ctrl = (Control)Session["ctrl"];
            PrintHelper.PrintWebControl(ctrl);
        }
    }
}

Pronto. Agora é só alegria!

Executando o projeto iremos obter a página Default.aspx abaixo:

Clicando no botão “Imprimir Pagina” teremos o seguinte diálogo exibido:

Basta selecionar a impressora e clicar em “OK“. No meu exemplo estou imprimindo para uma impressão PDF:

E é isso. Espero que ajude alguém nesse mundão da TI selvagem.

Pegue o projeto: AspNet_Printer.zip (sem as referências).

Até o próximo artigo!