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).
6 respostas em “Convertendo HTML em PDF”
Bom dia Tiago,
Preciso de uma ajuda sua, na minha tela tenho varios documentos que marco no checkbox 3 clico em gerar pdf e ao gerar fa??o um loop sendo que o primeiro roda normalmente no segundo gera erro:
"Servidor n??o pode limpar cabe??alhos ap??s os cabe??alhos HTTP terem sido enviados." sabe como posso resolver isto preciso armazenar em um array de byte para depois fazer o flush.
No caso, se voc?? deseja que ele realize o download de mais de um documento, seria mais vi??vel que voc?? gere um ZIP/RAR com os documentos e envie para download ao inv??s de um por um.
Mas se realmente precisar voc?? precisar?? dar pelo menos um refresh na tela para que possa fazer o novo download. Isso ?? uma id??ia, mas prefiro fazer o ZIP com todos eles.
Este m??todo esta eleminiando as quebras de linha. Mesmo que eu insira varias quebras de linha no meu html, o pdf sai sem nenhuma (o texto vem todo "colado"). Existe um modo de resolver isso?
Thiago tem como me passar um exemplo do mesmo.
vlw mano ajudou muito
Opa.. Bom dia.. Ent??o, o post ajudou muito, mas tem um problema, quando converto minha pagina para pdf, o estilo(css) vem escrito no documento, e o documento vem todo sem formata????o. Pode dar alguma dica?