ASP .NET - Revendo conceitos - Aplicação Currículos web - IV


Na terceira parte do artigo definimos a página EditarCurriculo.aspx  a partir do link Editar Curriculo Atual onde é feito a atualização das informações do currículo do usuário atual.

Vamos agora ver a definição da página VisualizarCurriculo.aspx que permite exibir as informações do currículo e visualizá-lo no formato PDF.

Definindo a página VisualizarCurriculo.aspx

A partir da página Menu.aspx temos o link Procurar que permite o usuário procurar um currículo informando o nome o cep cadastrados para um usuário.

O código do arquivo Menu.aspx.cs para o evento Click do LinkButton Procurar é o seguinte:

  protected void LinkButton2_Click(object sender, EventArgs e)
    {
        if (txtNome.Text == String.Empty || txtCep.Text == String.Empty)
        {
            lblMsg.Text = "Informe o Nome/Cep para procurar um do currículo.";
            return;
        }
        else
        {
            ProcuraCurriculo(txtNome.Text.Trim(),txtCep.Text.Trim());
        }
    }

A rotina ProcuraCurriculo() recebe o nome e o cep como parâmetros e seleciona um usuário com currículo cadastrado. O seu código é visto a seguir:

public void ProcuraCurriculo(string strNome, string strCep)
    {
        SqlConnection conexaoSQL = new SqlConnection(Convert.ToString(Application["ConexaoDBSQLCurriculos"]));
        string codigoUsuario = "";
        try
        {
            string strSql = "select nome,usuarioid from InfoPessoal where ";
            bool bUsarAnd = false;
            if (strNome.Length > 0)
            {
                strSql += "nome like '%" + strNome + "%'";
                bUsarAnd = true;
            }
            if (strCep.Length > 0)
            {
                if (bUsarAnd)
                {
                    strSql += " and ";
                    strSql += "cep like '%" + strCep + "%'";
                }
            }
            conexaoSQL.Open();
            SqlCommand myCommand = new SqlCommand(strSql, conexaoSQL);
            SqlDataReader reader = myCommand.ExecuteReader();
            while (reader.Read())
            {
                codigoUsuario = Convert.ToString(reader.GetInt32(1));
            }
            reader.Close();
            if (codigoUsuario == string.Empty)
            {
                lblMsg.Text = "Usuário não localizado.";
            }
            else
            {
                Response.Redirect("~/VisualizarCurriculo.aspx?UsuarioID=" + codigoUsuario);
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message.ToString());
        }
        finally
        {
            if (conexaoSQL.State == ConnectionState.Open)
            {
                conexaoSQL.Close();
            }
        }
    }

No código acima após localizar o usuário obtemos o seu código e redirecionamos para a página VisualizarCurriculo.aspx?UsuarioID+codigoUsuario, onde temos passagem do valor para a página usando a sintaxe: ?UsuarioID+codigoUsuario onde estamos definindo a variável UsuarioID e a variável codigoUsuario que é o valor obtido para o código do usuário cadastrado. Esses valores serão recuperados usando um QueryString: Request.QueryString["UsuarioID"]

Vejamos a seguir a definição da página VisualizarCurriculo.aspx começando pelo seu leiaute que é parecido com página EditarCurriculo.aspx e possui os mesmos controles:

Distribua os controles conforme o leiaute da figura abaixo:

Os namespaces usados na página VisualizarCurriculo.aspx.cs são:

using System;

using System.Data.SqlClient;

using System.IO;

using iTextSharp.text;

using iTextSharp.text.pdf;

using System.Net;

 

Observe que temos as referência a library ITextSharp que iremos usar para gerar o currículo no formato PDF.

 

Definimos a variável global codigoUsuario:

string codigoUsuario = "";

No evento Load da página temos o seguinte código no arquivo code-behind Menu.aspx.cs:

  protected void Page_Load(object sender, EventArgs e)
    {
        codigoUsuario = Request.QueryString["UsuarioID"].ToString();
       if (!IsPostBack)
        {
            try
            {
                SqlConnection conexaoSQL = new SqlConnection(Convert.ToString(Application["ConexaoDBSQLCurriculos"]));
                conexaoSQL.Open();
                carregarInfoPessoal(conexaoSQL);
                carregarInfoEducacao(conexaoSQL);
                CarregarInfoHabilidades(conexaoSQL);
                CarregarInfoProfissional(conexaoSQL);
                conexaoSQL.Close();
            }
            catch (Exception ex)
            {
                lblErro.Text = ex.Message.ToString();
            }
        }
    }

Este código verifica se existe a variável de sessão UsuarioID que foi gerada no Login e caso ela não tenha um valor válido redireciona o usuário para a página Default.aspx;

Este código é executado se a requisição não for um postback e faz o seguinte:

  1. Cria uma conexão obtendo a string de conexão definida no arquivo Global.asax
  2. Abre a conexão com o SQL Server
  3. Chama as rotinas para carregar as informações do currículo do usuário
  4. Fecha a conexão

Em todas as rotinas usamos a variável de sessão UsuarioID que contém o código do usuário atual que esta logado.

Temos a seguir o mesmo código usado na página EditarCurriculo.aspx , ou seja, temos duplicação de código, pois não adotamos uma arquitetura em camadas e não praticamos a separação das responsabilidades e pagamos o preço pela nossa escolha.

Eu não vou repetir aqui o código de cada uma das rotinas chamadas acima vou apenas descrevê-las:

  1. A rotina carregarInfoPessoal usada para carregar e exibir as informações do usuário atual da tabela InfoPessoal:
  2. A rotina carregarInfoEducacao usada para carregar e exibir as informações do usuário atual da tabela InfoEducacao:
  3. A rotina CarregarInfoProfissional usada para carregar e exibir as informações do usuário atual da tabela InfoProfissional:
  4. A rotina CarregarInfoHabilidades usada para carregar e exibir as informações do usuário atual da tabela InfoHabilidades:

Exibindo o Currículo no formato PDF

Para exibir as informações do currículo no formato PDF basta clicar no botão Visualizar onde temos no evento Click do botão btnImprimir o seguinte código:

   protected void btnImprimir_Click(object sender, EventArgs e)
    {
        string[] token = txtNome.Text.Split(' ');
        if (token[0]==string.Empty )
        {
            lblErro.Text = "Falta o nome no currículo.";
            return;
        }
        else
        {
            Curriculo cur = new Curriculo();
            cur.UsuarioID = Convert.ToInt32(Request.QueryString["UsuarioID"]);
            cur.nome = txtNome.Text;
            cur.endereco = txtEndereco.Text;
            cur.cidade = txtCidade.Text;
            cur.estado =txtEstado.Text;
            cur.cep = txtCep.Text;
            cur.pais =txtPais.Text;
            cur.telefone = txtTelefone.Text;
            cur.celular = txtCelular.Text;
            cur.email = txtEmail.Text;
            cur.nascimento = Convert.ToDateTime(txtNascimento.Text);
            cur.foto = txtFoto.Text;
            cur.infoEducacao = txtInfoEducacao.Text;
            cur.infoHabilidades = txtInfoHabilidades.Text;
            cur.infoProfissional = txtInfoProfissional.Text;
            visualizaCurriculoPDF(token[0], cur);
        }
    }

No código cima criamos uma instância da classe Currículo que definimos na primeira parte do artigo na pasta App_Code e atribuímos as informações do currículo ao objeto criado;

A seguir chamamos o método visualizaCurriculoPDF() passando o um array string contendo o nome do usuário e  objeto cur que representa um currículo para o usuário atual que irá gerar o documento PDF.

O código do método visualizaCurriculoPDF() é o dado abaixo:

 private void visualizaCurriculoPDF(string nomeDoUsuario, Curriculo cur)
    {
       //Cria um objeto da calsse Document e define o seu tamanho  para A4 e definie as propriedades: left, right, Top, Bottom Margin
        Document doc = new Document(iTextSharp.text.PageSize.A4, 36, 36, 72, 72);
       try
       {
           string caminhoPDF = Server.MapPath(".") + @"\pdf\" + codigoUsuario + "_" + nomeDoUsuario + ".pdf";
           PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(caminhoPDF, FileMode.Create));
           //abre o documento para escrita
           doc.Open();
           //
           Paragraph p1 = new Paragraph();
           //p1.Add(new Phrase("CURRÍCULO VITAE\n\n\n", FontFactory.GetFont(FontFactory.HELVETICA, 18)));
           //
           if (cur.foto == string.Empty)
           {
               cur.foto = "embranco.jpg";
           }
           // obtem o caminho e a imagem
           string imageFilePath = Server.MapPath(".") + @"\fotos\" + cur.foto;
           iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(imageFilePath);
           //Redimensiona a imgem 
           jpg.ScaleToFit(40f, 30f);
           //Da espaco antes da iimagem
           jpg.SpacingBefore = 10f;
           //Da espaço depois da imagem
           jpg.SpacingAfter = 1f;
           //alinha a imagem
           jpg.Alignment = Element.ALIGN_LEFT;
           doc.Add(jpg);
           //escreve o conteudo 
           p1.Add(new Phrase(cur.nome + "\n"));
           p1.Add(new Phrase(cur.endereco + "\n"));
           p1.Add(new Phrase(cur.cidade + "-"));
           p1.Add(new Phrase(cur.estado + "\n"));
           p1.Add(new Phrase(cur.cep));
           p1.Add(new Phrase(" - "));
           p1.Add(new Phrase(cur.pais + "\n"));
           p1.Add(new Phrase("Fone : " + cur.telefone + "\n"));
           p1.Add(new Phrase("Cel. : " + cur.celular + "\n"));
           p1.Add(new Phrase("Email : " + cur.email + "\n\n\n"));
           doc.Add(p1);
           //linha horizontal
           //PdfContentByte contentByte = wri.DirectContent;
           //contentByte.SetLineWidth(1);
           //contentByte.MoveTo(0, 14);
           //contentByte.LineTo(doc.PageSize.Width, 14);
           //contentByte.Stroke();
           Paragraph p2 = new Paragraph();
           p2.Add(new Phrase("Escolaridade e Cursos :\n" , FontFactory.GetFont(FontFactory.HELVETICA, 16)));
           p2.Add(new Phrase(cur.infoEducacao + "\n\n\n"));
           p2.Add(new Phrase("Experiência anterior : \n" , FontFactory.GetFont(FontFactory.HELVETICA, 16)));
           p2.Add(new Phrase(cur.infoProfissional + "\n\n\n"));
           p2.Add(new Phrase("Habilidades  :\n", FontFactory.GetFont(FontFactory.HELVETICA, 16)));
           p2.Add(new Phrase(cur.infoProfissional + " \n\n\n"));
           doc.Add(p2);
           //Informa a posição da marca d'água
           string imagemMarcaDagua = Server.MapPath(".") + @"\fotos\maco10.gif" ;
           iTextSharp.text.Image watermark = iTextSharp.text.Image.GetInstance(imagemMarcaDagua);
           watermark.SetAbsolutePosition(10, 5);
           
           //Adiciona a imagem ao documento
           doc.Add(watermark);
           doc.Close();
           WebClient client = new WebClient();
           Byte[] buffer = client.DownloadData(caminhoPDF);
           Response.ContentType = "application/pdf";
           Response.AddHeader("content-length", buffer.Length.ToString());
           Response.BinaryWrite(buffer);
            
        }
        catch (DocumentException dex)
        {
           lblErro.Text = dex.Message;
        }
        catch (IOException ioex)
        {
          lblErro.Text = ioex.Message;
        }
        catch (Exception ex)
        {
           lblErro.Text = ex.Message;
        }
    }

 

Finalmente o código do botão Retornar:

protected void btnCancelar_Click(object sender, EventArgs e)
{
     Response.Redirect("~/Menu.aspx");
}

Executando a página VisualizarCurriculo.aspx e clicando no botão Visualizar iremos obter:

Vimos então que a página VisualizarCurriculo.aspx permite ao usuário exibir informações do currículo no formato PDF.

Encerramos assim este série de 4 artigos onde mostramos como criar uma aplicação ASP .NET com acesso a dados usando Web Forms e outros recursos da plataforma .NET bem como o componente iTextSharp. A seguir temos os links dos artigos:

É importante deixar claro que não adotamos as boas práticas neste projeto visto que o objetivo era mostrar os recursos básicos da ASP .NET a nível básico para quem esta começando com a plataforma ASP .NET coma linguagem C#. Dessa forma o código da apresentação e de acesso aos dados foi colocado na camada de interface o que não é recomendado, mesmo  para pequenas aplicações como esta.

O mais correto seria termos definido uma arquitetura em camadas criando assim a separação das responsabilidades.

Mas o que fizemos não esta errado somente precisa ser melhorado, o importante é ter em mente que precisamos evoluir e não nos acomodarmos com os primeiros rudimentos.

Como exercício sugiro que você crie uma camada de acesso dados para este projeto.

O projeto completo esta no Super DVD .NET ou Super CD .NET.

"Todo aquele que vai além do ensino de Cristo e não permanece nele, não tem a Deus; quem permanece neste ensino, esse tem tanto ao Pai como ao Filho." 2 João 1:9

Referências:


José Carlos Macoratti