Nesse artigo veremos como converter um HTML em PDF. O HTML pode vir de uma p??gina externa quanto ser criado em tempo de execu????o. N??o haver?? muito o que explicar pois o c??digo em si, voc?? encontra a rodo pela net. Usaremos o componente iTextSharp.
Baixe o bin??rio e adicione em seu aplicativo (pasta Bin). Utilize o c??digo abaixo para fazer o processo de convers??o e exibi????o do PDF na tela:
using System;
using System.Web;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;
// Captura ou atribui o HTML a ser convertido – no caso estou baixando de uma URL
string html = new System.Net.WebClient().DownloadString(“http://thiagomarcal.blogspot.com/”);
//string html = “Convertendo o HTML em PDF – Thiago Mar??al”;
// Cria o documento aplicando o tamanho e margens
Document documento = new Document(PageSize.A4, 80, 50, 30, 65);
// Memory Stream para ser usado na convers??o e emiss??o
MemoryStream ms = new MemoryStream();
// Inicializa o gravador
PdfWriter writer = PdfWriter.GetInstance(documento, ms);
// L?? o HTML e atribui
StringReader conteudo = new StringReader(html);
// Objeto de convers??o do HTML
HTMLWorker objeto = new HTMLWorker(documento);
// Abre o documento
documento.Open();
// Aplica o parser para an??lise de convers??o
// Geralmente aqui ocasiona muitos erros – irei explicar no post
objeto.Parse(conteudo);
// Fecha o documento
documento.Close();
// For??a o download do PDF gerado – se desej??vel voc?? pode salvar em disco tamb??m
Response.Clear();
Response.AddHeader(“content-disposition”, “attachment; filename=Documento_HTML.pdf”);
Response.ContentType = “application/pdf”;
Response.Buffer = true;
Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
Response.OutputStream.Flush();
Response.End();
Veja que a vari??vel html eu atribuo o HTML que desejo converter. O seu conte??do pode vir externamente ou posso atribuir um valor desejado.
Vamos aos problemas! Muitos v??o encontrar erro quando o objeto estiver fazendo o parser do HTML e muitos ir??o falhar. Acontece que, devido ?? complexidade do HTML que estiver trabalhando, o componente n??o consegue converter para o formato adequado ao que ele usa internamente. Por exemplo, o TABLE do HTML que usamos ?? “meio” diferente do TABLE que o componente usa. Esse ?? um dos exemplos… Ent??o prepara-se para fazer um tratamento adequado antes de fazer o parser. Eu sugiro o seguinte:
- Use express??o regular para validar seu HTML;
- Use express??o regular e/ou o HtmlAgilityPack para remover os JavaScripts;
- O conte??do a ser convertido deve ser apenas o que est?? dentro do body;
- Imagens, CSS e links devem conter o caminho completo (exemplo: http://thiagomarcal.blogspot.com/imgs/logo.png ao inv??s de ../imgs/logo.png), etc.
- Gere um thumb (imagem) do HTML que deseja converter (saiba como gerar um thumb de um HTML nesse post) e salve em disco;
- Atribua a vari??vel html com o conte??do “<img src=”http://thiagomarcal.blogspot.com/imgs/thumb.png” />“;
- Coloque o width e height na tag IMG o tamanho desejado (pode ser at?? o tamanho do papel).