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: