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:
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:
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: